这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» STM32» STM32G070RB探测34-MQTT协议剖析1CONNECT⑤

共10条 1/1 1 跳转至

STM32G070RB探测34-MQTT协议剖析1CONNECT⑤

高工
2021-04-06 23:31:15 打赏
协议已经剖析完了,但不再造轮子了,直接移植onenet写好的驱动

在官网下载的,同样会打包放在二楼

首先看下使用说明
1.具体使用方法可参考:sample.c SDK使用的三种类型: 1.组包-发送-删包 只需要调用接口函数封装一包数据,成发送即可。 2.组包-发送-等待平台返回-删包 连接平台和心跳请求需要等待平台的返回结果。 3.数据点上传 数据点上传分5步:1.获取json格式数据流长度 2.根据长度封装协议头 3.封装一包数据 4.发送数据 5.释放内存 内存方案的三种方式 1.动态分配 只需要声明 EDP_PACKET_STRUCTURE edpPacket = {NULL, 0, 0, 0}; 然后调用组包函数即可。 2.全局数 声明一个全局数组,如 unsigned char dataMem[128] 然后再调用组包函数之前 edpPacket._data = dataMem; edpPacket._size = sizeof(dataMem); 即可。 3.局部数组 方式同2,数组为局部变量。

好吧,不想看,直接看例子

sample.c
//========================================================== // 函数名称: OneNet_DevLink // // 函数功能: 与onenet创建连接 // // 入口参数: devid:创建设备的devid // proid:产品ID // auth_key:创建设备的masterKey或apiKey或设备鉴权信息 // // 返回参数: 无 // // 说明: 与onenet平台建立连接,成功或会标记oneNetInfo.netWork网络状态标志 //========================================================== void OneNet_DevLink(const char* devid, const char *proid, const char* auth_info) { MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; edpPacket._data = dataMem; //全局数组方式 edpPacket._size = sizeof(dataMem); //全局数组方式 //---------------------------------------------步骤一:组包--------------------------------------------- if(MQTT_PacketConnect(proid, auth_info, devid, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0) { //---------------------------------------------步骤二:发送数据----------------------------------------- NET_DEVICE_SendData(mqttPacket._data, mqttPacket._len); //---------------------------------------------步骤三:判断返回类型-------------------------------------- if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK) { //---------------------------------------------步骤四:解析返回结果-------------------------------------- switch(MQTT_UnPacketConnectAck(dataPtr)) { case 0: UsartPrintf(USART_DEBUG, "Tips: 连接成功\r\n"); oneNetInfo.netWork = 1; break; case 1:UsartPrintf(USART_DEBUG, "WARN: 连接失败:协议错误\r\n");break; case 2:UsartPrintf(USART_DEBUG, "WARN: 连接失败:非法的clientid\r\n");break; case 3:UsartPrintf(USART_DEBUG, "WARN: 连接失败:服务器失败\r\n");break; case 4:UsartPrintf(USART_DEBUG, "WARN: 连接失败:用户名或密码错误\r\n");break; case 5:UsartPrintf(USART_DEBUG, "WARN: 连接失败:非法链接(比如token非法)\r\n");break; default:UsartPrintf(USART_DEBUG, "ERR: 连接失败:未知错误\r\n");break; } } //---------------------------------------------步骤五:删包--------------------------------------------- MQTT_DeleteBuffer(&mqttPacket); } else UsartPrintf(USART_DEBUG, "WARN: MQTT_PacketConnect Failed\r\n"); }

很简单,组包 ,发包,接包,解析,删包

简单看下组包的函数

怎么用说的明明白白,有兴趣的可以多看看源码

直接把文件到单片机的工程中

直接模仿示例中写一个

void OneNet_DevLink(void) { MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; IPD ipd_rx = {0,NULL};; UsartPrintf("OneNet_DevLink\r\nPROID: %s\r\nTOKEN:%s\r\nDEVID:%s\r\n", PROID, TOKEN, DEVID); //---------------------------------------------步骤一:组包--------------------------------------------- if(MQTT_PacketConnect(PROID, TOKEN, DEVID, 256, 1, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0) { //---------------------------------------------步骤二:发送数据----------------------------------------- ESP8266_SendData(mqttPacket._data, mqttPacket._len); //---------------------------------------------步骤三:等待返回数据---------------------------------------- uint16_t delay_count = 5000; while(delay_count--) { HAL_Delay(1); if(usart1_rx.flag) { ipd_rx = ESP8266_GetIPD(); break; } } //---------------------------------------------步骤四:判断返回类型-------------------------------------- if(ipd_rx.IPD_buff != NULL) { //---------------------------------------------步骤五:解析返回结果-------------------------------------- switch(MQTT_UnPacketConnectAck(ipd_rx.IPD_buff)) { case 0: UsartPrintf("Tips: 连接成功\r\n"); break; case 1:UsartPrintf("WARN: 连接失败:协议错误\r\n");break; case 2:UsartPrintf("WARN: 连接失败:非法的clientid\r\n");break; case 3:UsartPrintf("WARN: 连接失败:服务器失败\r\n");break; case 4:UsartPrintf("WARN: 连接失败:用户名或密码错误\r\n");break; case 5:UsartPrintf("WARN: 连接失败:非法链接(比如token非法)\r\n");break; default:UsartPrintf("ERR: 连接失败:未知错误\r\n");break; } } //---------------------------------------------步骤六:删包--------------------------------------------- MQTT_DeleteBuffer(&mqttPacket); } else UsartPrintf("WARN: MQTT_PacketConnect Failed\r\n"); }

其中

对应着上篇中的三元组,复制过来即可

当然平台地址需要改一下

添加到esp初始化之后

烧录

已经连接上了

下篇写心跳

mqtt_c语言.zip



专家
2021-04-07 00:02:37 打赏
2楼

感谢楼主的分享,很实用了。


工程师
2021-04-07 00:11:19 打赏
3楼

感谢楼主的分享,很实用了。


工程师
2021-04-08 23:40:05 打赏
4楼

十分感谢您的分享


工程师
2021-04-09 23:58:06 打赏
5楼

十分不错的代码


工程师
2021-04-11 23:37:03 打赏
6楼

不错的产品


高工
2021-04-16 00:00:18 打赏
7楼

动手能力非常强哈


高工
2021-04-16 08:13:07 打赏
8楼

感谢楼主的分享,很实用


专家
2021-04-17 00:58:25 打赏
9楼

谢谢分享


专家
2021-04-17 07:39:42 打赏
10楼

收藏学习


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]