[原创]基于FreeRTOS建立MQTT终端设备

开门见山
越来越多的终端设备支持MQTT,自己也是一个小白,完全是摸着石头过河,总结此篇,旨在帮助路过的朋友少走弯路,谢谢捧场!

芯片: STM32F407ZGT6 (核心板)【先跑通后精简成本,争取在STM32F103跑通】+ SIM7600 (自研4G模块)【NB已经在做,后续再更】
软件:串口助手
框架:FreeRTOS + SIM7600驱动 + MQTTv3.1.1
平台:OneNet(中移动免费开放,但阿里云、百度云、腾讯云要收费,所以后面再写这三家的博客吧)

FreeRTOS移植

这里不赘述,参见这篇文章

MQTT移植

本文的重点

在HTTP中,较为多的数据采用字符串形式交互,因此可以使用strlen(str)判断字串结尾。但MQTT不可以,因为MQTT大多是16进制数,可能一个报文里本身就有0,冒然使用strlen(str)判断字串结尾会产生截断的危险。因此务必使用len累加判断。串口log也是同理,说明代码如下:

void UART3SendString(u8 *cmd,u16 len)
{
	u16 i=0;	
	//while((*(cmd+i)!=0)&&(i
	while((i<len))
	{
		UART3SendByte(*(cmd+i));i++;
	}
}

原始写法判断条件是:非零且长度未超过len,
新的写法判断条件是:长度未超len
注意:此处的len不能通过strlen(str)获得,那样是白折腾。

在HTTP中,POST需要在目标字符串末尾添加\r\n,比如希望发送POST abt66,应当将帧数据拼接成POST abt66\r\n。然后,调用

AT+CIPSEND=0,12",">"

发送即可。
但是在MQTT中,虽然也用到AT+CIPSEND,但不要添加\r\n,即:是什么发什么

AT+CIPSEND=0,10",">"

你可能感兴趣的:(Embedded,FreeRTOS,MQTT,SIM7600,NBIOT,STM32)