一、MQTT协议简介
MQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议,是ISO标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。MQTT工作在TCP/IP协议栈上,是为硬件性能低下的远程设备以及网络状况不理想的情况下而设计的发布/订阅型消息协议。由于MQTT协议的轻量、简便、开放的特点使它适用范围非常广泛。在很多情况下,包括受限的环境中使用,广泛应用于物联网(IoT)。MQTT协议在卫星链路通信传感器、医疗设备、智能家居、及一些小型化设备中已广泛使用。
本文使用小凌派RK2206开发板实现基于OpenHarmony的本地MQTT服务。小凌派RK2206开发板采用瑞芯微高性能、高性价比的RK2206芯片。RK2206芯片是一款低功耗、高集成的MCU无线局域网处理器,它可以应用于不同的应用领域,如物联网、可穿戴设备、家庭自动化、云连接等。小凌派RK2206开发板内置WIFI模块,外部接口丰富,使用一个小凌派RK2206开发板就能够轻松实现MQTT物联网多种应用。
二、硬件电路设计
如图1所示,为小凌派RK2206开发板支持的外部接口,本文使用小凌派RK2206开发板内置的WIFI和MQTT服务器通信。
图1 小凌派RK2206开发板
三、软件设计
1、主程序设计
在iot_mqtt_example函数中,通过LOS_TaskCreate函数创建iot_mqtt_thread线程,并设置线程优先级、线程堆栈大小等参数。
- void iot_mqtt_example()
- {
- unsigned int threadID;
- unsigned int ret = LOS_OK;
- TSK_INIT_PARAM_S task = {0};
- /*创建线程*/
- task.pfnTaskEntry = (TSK_ENTRY_FUNC)iot_mqtt_thread;
- task.uwStackSize = 10240;
- task.pcName = IOT_MQTT_EXAMPLE;
- task.usTaskPrio = 6;
- ret = LOS_TaskCreate(&threadID, &task);
- if (LOS_OK != ret)
- {
- printf("Falied to create %sn", IOT_MQTT_EXAMPLE);
- return;
- }
- }
复制代码 2、MQTT服务程序设计iot_mqtt_thread函数中,开发板先连接WIFI,通过WIFI和PC端的MQTT服务器通信;WIFI连接成功后,初始化网络,初始化MQTT客户端;初始化完成后,连接MQTT服务端,注册消息接收函数message_receive;函数进入循环,5s向PC端MQTT服务器发送一次消息。
- void iot_mqtt_thread()
- {
- int rc;
- MQTTClient client;
- MQTTMessage message;
- char payload[30];
- MQTTString clientId = MQTTString_initializer;
- MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
- /*WIFI连接*/
- SetWifiModeOn();
- printf("NetworkInit...n");
- NetworkInit(&network);
- begin:
- printf("NetworkConnect...n");
- rc = NetworkConnect(&network, MQTT_SERVER_IP, MQTT_SERVER_PORT);
- printf("MQTTClientInit...n");
- MQTTClientInit(&client, &network, 2000, sendBuf, sizeof(sendBuf), readBuf, sizeof(readBuf));
- clientId.cstring = "lzdz";
- data.clientID = clientId;
- data.willFlag = 0;
- data.MQTTVersion = 3;
- data.keepAliveInterval = 0;
- data.cleansession = 1;
- printf("MQTTConnect...n");
- rc = MQTTConnect(&client, &data);
- if (rc != 0) {
- printf("MQTTConnect fail:%dn", rc);
- NetworkDisconnect(&network);
- MQTTDisconnect(&client);
- LOS_Msleep(200);
- goto begin;
- }
- printf("MQTTSubscribe...n");
- rc = MQTTSubscribe(&client, "substopic", 2, message_receive);
- if (rc != 0) {
- printf("MQTTSubscribe fail:%dn", rc);
- LOS_Msleep(200);
- goto begin;
- }
- while (1)
- {
- sprintf(payload, "publish test");
- message.qos = 2;
- message.retained = 0;
- message.payload = payload;
- message.payloadlen = strlen(payload);
- if ((rc = MQTTPublish(&client, "IOT_MQTT", &message)) != 0){
- printf("Return code from MQTT publish is %dn", rc);
- NetworkDisconnect(&network);
- MQTTDisconnect(&client);
- goto begin;
- }
- LOS_Msleep(5000);
- }
- }
复制代码 3、MQTT消息接收程序设计MQTT消息接收程序主要用于接收MQTT服务端下发的消息,接收到消息后,打印接收的信息。
- void message_receive(MessageData* data)
- {
- printf("message arrived on topic %.*s: %.*sn", data->topicName->lenstring.len, data->topicName->lenstring.data,
- data->message->payloadlen, data->message->payload);
- }
复制代码
四、编译测试
1、修改MQTT服务端IP
PC端按键WIN + R键打开命令行CMD,执行命令ipconfig获取PC端的IP地址,如图2所示,PC端的IP地址为:192.168.1.164。
图2 获取PC端IP地址
对应修改代码中的MQTT_SERVER_IP为查询到PC端IP地址192.168.1.164,MQTT_SERVER_PORT修改为MQTT服务器端口号1883。代码如下所示:
- #define MQTT_SERVER_IP "192.168.1.164"
- #define MQTT_SERVER_PORT 1883
复制代码2、下载MQTT代理工具mosquitto
根据PC电脑位数选择对应的安装包,32位系统下载x86后缀的安装包,64位系统下载x64后缀的安装包,本文选择mosquitto-2.0.9a-install-windows版本进行测试。
图3 32位系统安装包
图4 64位系统安装包
下载mosquitto安装包后,点击安装mosquitto工具;安装完毕后,需要配置mosquitto,修改mosquitto安装路径下的mosquitto.conf文件,如图5所示。
图5 mosquitto配置文件
在mosquitto.conf文件末尾增加如下配置,其中,192.168.1.164为PC端IP地址,1883为MQTT服务器端口号,allow_anonymous为允许匿名登录。
- listener 1883 192.168.1.164
- listener 1883 localhost
- allow_anonymous true
复制代码
mosquitto安装配置完成后,需要开启mosquitto服务,右击打开我的电脑-管理-服务和应用程序-服务,找到Mosquitto Broker服务,如图6所示。
图6 mosquitto服务
双击打开Mosquitto Broker服务,点击启动,开启Mosquitto服务,如图7所示。
图7 开启mosquitto服务
3、下载Eclipse Paho MQTT 工具
Paho MQTT工具下载地址:
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.ui.app/1.1.1/。
下载Paho软件包:org.eclipse.paho.ui.app-1.1.1-win32.win32.x86_64.zip。如图8所示。
图8 Eclipse Paho MQTT工具下载地址
下载Paho软件包后,解压软件包,双击打开Paho.exe;进入Paho软件界面,点击右上角加号按键,添加一个MQTT服务器连接,如图9所示。
图9 Eclipse Paho MQTT软件界面
4、WIFI连接
修改代码中的SSID和PASSWORD为使用WIFI的SSID和密匙,用于连接网络,设备通过WIFI访问PC端MQTT服务器。代码如下所示:
- define SSID "lzdz"
- #define PASSWORD "12345678"
复制代码 5、运行结果例程代码编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志,串口打印MQTT初始化、连接等日志
- NetworkConnect...
- MQTTClientInit...
- MQTTConnect...
- MQTTSubscribe...
复制代码
连接
打开paho软件,点击连接,当连接成功时,连接状态显示为已连接;需要注意的是,如果出现连接失败,请尝试关闭PC防火墙再进行连接。
订阅
点击订阅添加按键,新增主题IOT_MQTT(主题名称需要与例程代码MQTTPublish函数传参的主题名称一致),点击订阅按键,此时,历史记录页面就开始显示接收的开发板上报信息,如图10所示。
图10 订阅消息
发布
在发布主题栏,输入主题名称substopic(主题名称需要与例程代码MQTTSubscribe函数传参的主题名称一致),在消息栏输入消息hello world,点击发布,此时,历史记录页面显示已发布出的消息,如图11所示。
图11 发布消息
同时,开发板串口会同步显示接收到的消息日志,如下所示。
- message arrived on topic substopic: hello world
- message arrived on topic substopic: hello world
复制代码