这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 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 跳转至

回复

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