MQTT 是当前最主流的物联网通信协议,需要物联网云平台,例如华为云、阿里云、移动OneNET都支持mqtt。而Hi3861则是一款专为IoT应用场景打造的芯片。本节主要讲如何在鸿蒙系统中通过移植第3方软件包 paho mqtt去实现MQTT协议功能,最后会给出测试验证。为后续的物联网项目打好基础。
友情预告,本节内容较多,源码也贴出来了,大家最好先看一遍,然后再操作一次。
相关源码已经打包上传,顺便上传了一个测试OK的固件,大家可以直接下载附件直接测试。解压后会得到5个压缩包,继续解压即可
MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的二进制“轻量级”消息协议,由IB公司发布。针对于网络受限和嵌入式设备而设计的一种数据传输协议。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。MQTT模型如图所示。
更多MQTT协议的介绍见这篇文章: MQTT 协议开发入门
完成以上修改后,就可以开始编译了,然而很不幸的。。。你会发现好多编译报错。
不过没事,我们来一个一个解决。
3. 移植,修改编译报错
打开 third_party\pahomqtt\MQTTPacket\samples\transport.c 文件,这个文件也是我们主要移植的文件,我们需要实现 socket相关的操作,包括发送、接收数据。其实移植就3步。
(1)首先我们导入几个头文件
- #include "lwip/ip_addr.h"
- #include "lwip/netifapi.h"
- #include "lwip/sockets.h"
(2)其次修改 transport_sendPacketBuffer 函数,内容修改后如下:
- int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen)
- {
- int rc = 0;
- rc = send(sock, buf, buflen, 0);
- return rc;
- }
(3)后面编译的时候会报错说 close 函数不存在,我们修改 transport_close 函数,修改后内容如下:
- int transport_close(int sock)
- {
- int rc;
- rc = shutdown(sock, SHUT_WR);
- rc = recv(sock, NULL, (size_t)0, 0);
- rc = lwip_close(sock);
- return rc;
- }
(4)修改完 transport.c 文件后,大家编译的时候估计会遇到很多编译错误,都是某个局部变量未使用那种,大家可以修改就行。
类似于这样的,提示 buflen 未使用的错误,大家只需要在代码中随便写个buflen = buflen ; 即可。