×
单片机 > 单片机程序设计 > 详情

单片机MQTT实现推送简单使用

发布时间:2024-05-13 发布时间:
|

1、准备条件:

a)硬件:ATMEGA644PA 8位单片机 ENC28J60

b)下载MQTT c语言的包:

C/C++ MQTT Embedded clients

/zixunimg/eeworldimg/www.eclipse.org/paho/clients/c/embedded/

c)MQTT基础知识

/zixunimg/eeworldimg/mqtt.org/

/zixunimg/eeworldimg/download.csdn.net/detail/zhou6343178/9495445


2、移植MQTTPacket到项目里:

复制文件夹MQTTPacket到工程,复制MQTTPacketsamples里面的transport.c、transport.h到工程

1、准备条件:

a)硬件:ATMEGA644PA 8位单片机 ENC28J60

b)下载MQTT c语言的包:

C/C++ MQTT Embedded clients

/zixunimg/eeworldimg/www.eclipse.org/paho/clients/c/embedded/

c)MQTT基础知识

/zixunimg/eeworldimg/mqtt.org/

/zixunimg/eeworldimg/download.csdn.net/detail/zhou6343178/9495445


2、移植MQTTPacket到项目里:

复制文件夹MQTTPacket到工程,复制MQTTPacketsamples里面的transport.c、transport.h到工程


3、修改已经transport.c里面的四个接口:


int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen);

int transport_getdata(unsigned char* buf, int count);

int transport_open(char* host, int port);

int transport_close(int sock);


看接口名称就知道,该四个接口实现的是TCP数据的收发,具体修改需要根据已经实现的TCP接口来定。(单片机上常用的TCP/IP协议栈主要有uip、LwIP)


注意:MQTT是tcp/ip的应用层,传输层需要自己实现,这四个接口分别对应TCP的连接、收、发和关闭。


4、实现订阅/发布,查看MQTTPacketsamples下的pub0sub1.c。

下面为参数的意义:

MQTTPacket_connectData data = MQTTPacket_connectData_initializer; //连接参数

data.clientID.cstring = “me2”; //客户ID,唯一

data.keepAliveInterval = 200; //保存存活时间200s

data.cleansession = 1;//重新连接后是否清除以前的信息 0表示不清除,1表示重连清除

data.username.cstring = “admin”;//如果服务器需要用户名密码,这里设置

data.password.cstring = “admin”;

Qos :

0 表示最多一次

1 表示至少一次

2 表示只有一次


MQTTDeserialize_publish(&dup,&qos,&retained,&msgid,&receivedTopic,&payload_in, &payloadlen_in, buf,buflen);


msgid:该包的ID,paketid,如果需要增加反馈(QoS为1和2需要反馈),需要获取该ID


发送反馈:


MQTTDeserialize_publish(&dup, &qos, &retained, &msgid,&receivedTopic,&payload_in, &payloadlen_in, buf, buflen);

int len = MQTTSerialize_puback(buf,buflen,msgid);

transport_sendPacketBuffer(ack_buf,len);


接收服务器的反馈:


if(PUBACK == MQTTPacket_read(buf,buflen,transport_getdata))

{

unsigned char packettype = 0;

unsigned char dup_ack = 0;

unsigned short packetid = 0;


MQTTDeserialize_ack(&packettype,&dup_ack,&packetid,buf,buflen);

}


比较发送的msgid和反馈获取的packetid,如果一致表示该包发送成功。

等等,具体看文档


5、服务器实现 mosquitto

请参考:/zixunimg/eeworldimg/blog.csdn.net/xukai871105/article/details/39252653

指令举例:

订阅 mosquitto_sub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic

-h 服务器域名

-u 用户名(没有可以省略)

-P密码(没有可以省略)

-t topic名称


发布:mosquitto_pub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic -m hello

-m 发布的内容


以上基本实现单片机与服务器的联调。如果需要手机控制单片机,可下载手机相关的MQTT包进行通讯。


=====更新(2018-03-09)======

很高兴这篇笔记能给有些人带来帮助,我把使用实例上传到 GitHub,其中有些对 MQTT 的改动,供大家参考。

————————————————

版权声明:本文为CSDN博主「Luca_kill」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:/zixunimg/eeworldimg/blog.csdn.net/zhou6343178/article/details/51182623


3、修改已经transport.c里面的四个接口:


int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen);

int transport_getdata(unsigned char* buf, int count);

int transport_open(char* host, int port);

int transport_close(int sock);


看接口名称就知道,该四个接口实现的是TCP数据的收发,具体修改需要根据已经实现的TCP接口来定。(单片机上常用的TCP/IP协议栈主要有uip、LwIP)

注意:MQTT是tcp/ip的应用层,传输层需要自己实现,这四个接口分别对应TCP的连接、收、发和关闭。


4、实现订阅/发布,查看MQTTPacketsamples下的pub0sub1.c。

下面为参数的意义:

MQTTPacket_connectData data = MQTTPacket_connectData_initializer; //连接参数

data.clientID.cstring = “me2”; //客户ID,唯一

data.keepAliveInterval = 200; //保存存活时间200s

data.cleansession = 1;//重新连接后是否清除以前的信息 0表示不清除,1表示重连清除

data.username.cstring = “admin”;//如果服务器需要用户名密码,这里设置

data.password.cstring = “admin”;

Qos :

0 表示最多一次

1 表示至少一次

2 表示只有一次


MQTTDeserialize_publish(&dup,&qos,&retained,&msgid,&receivedTopic,&payload_in, &payloadlen_in, buf,buflen);


msgid:该包的ID,paketid,如果需要增加反馈(QoS为1和2需要反馈),需要获取该ID


发送反馈:


MQTTDeserialize_publish(&dup, &qos, &retained, &msgid,&receivedTopic,&payload_in, &payloadlen_in, buf, buflen);

int len = MQTTSerialize_puback(buf,buflen,msgid);

transport_sendPacketBuffer(ack_buf,len);


接收服务器的反馈:


if(PUBACK == MQTTPacket_read(buf,buflen,transport_getdata))

{

unsigned char packettype = 0;

unsigned char dup_ack = 0;

unsigned short packetid = 0;


MQTTDeserialize_ack(&packettype,&dup_ack,&packetid,buf,buflen);

}


比较发送的msgid和反馈获取的packetid,如果一致表示该包发送成功。

等等,具体看文档


5、服务器实现 mosquitto

请参考:/zixunimg/eeworldimg/blog.csdn.net/xukai871105/article/details/39252653

指令举例:

订阅 mosquitto_sub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic

-h 服务器域名

-u 用户名(没有可以省略)

-P密码(没有可以省略)

-t topic名称


发布:mosquitto_pub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic -m hello

-m 发布的内容


以上基本实现单片机与服务器的联调。如果需要手机控制单片机,可下载手机相关的MQTT包进行通讯。


=====更新(2018-03-09)======

很高兴这篇笔记能给有些人带来帮助,我把使用实例上传到 GitHub,其中有些对 MQTT 的改动,供大家参考。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录