公司有项目需要用到MQTT协议,使用的是STM32F407+LAN8720.
网上找资料找到了下面这个博主的文章,受益匪浅。
https://blog.youkuaiyun.com/qq_39785798/article/details/80765716
一开始我也是下载了官方的固件包,paho-MQTT,发现很多函数都用不到,而且transport_open函数是Linux库下面的,移植不方便,我就学习上面这位博主自己写了MQTT的报文协议。
使用的工具和他一样:
MQTT客户端:通信猫。
抓包软件:Wirshark。
抓包时发现有部分协议码和https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/0314-DISCONNECT.html这个版本的不同,譬如:正确连接的报文中的"协议名",3.1.1的协议上是“MQTT”,这里抓包读取的是:“MQIsdp”,可能不同的服务器不一样(不确定),还没有试过其他的MQTT服务器。
基本方法和上面这位博主相同,就修改了协议内容。需要注意一点:测试时没有确保断开的情况下,下次连接需要使用不同的客户端标识(Client Identifier)。
以下是我定义的头文件(MDK复制的注释是乱码,我就不改了,看英文一样的)。
#define MQTT_TypeCONNECT 1 //ÇëÇóÁ¬½Ó
#define MQTT_TypeCONNACK 2 //ÇëÇóÓ¦´ð
#define MQTT_TypePUBLISH 3 //·¢²¼ÏûÏ¢
#define MQTT_TypePUBACK 4 //·¢²¼Ó¦´ð
#define MQTT_TypePUBREC 5 //·¢²¼ÒѽÓÊÕ£¬±£Ö¤´«µÝ1
#define MQTT_TypePUBREL 6 //·¢²¼ÊÍ·Å£¬±£Ö¤´«µÝ2
#define MQTT_TypePUBCOMP 7 //·¢²¼Íê³É£¬±£Ö¤´«µÝ3
#define MQTT_TypeSUBSCRIBE 8 //¶©ÔÄÇëÇó
#define MQTT_TypeSUBACK 9 //¶©ÔÄÓ¦´ð
#define MQTT_TypeUNSUBSCRIBE 10 //È¡Ïû¶©ÔÄ
#define MQTT_TypeUNSUBACK 11 //È¡Ïû¶©ÔÄÓ¦´ð
#define MQTT_TypePINGREQ 12 //pingÇëÇó
#define MQTT_TypePINGRESP 13 //pingÏìÓ¦
#define MQTT_TypeDISCONNECT 14 //¶Ï¿ªÁ¬½Ó
/*MQTTÁ¬½Ó·þÎñ¶ËµÄ¹Ì¶¨±¨Í·*/
#define MQTT_StaUserNameFlag 1 //Óû§Ãû±êÖ¾ User Name Flag
#define MQTT_StaPasswordFlag 1 //ÃÜÂë±êÖ¾Password Flag
#define MQTT_StaWillRetain 0 //ÒÅÖö±£Áô
#define MQTT_StaWillQoS 0 //ÒÅÖöQoSÁ¬½Ó±ê