一、MQTT协议简介
MQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议,是ISO标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。MQTT工作在TCP/IP协议栈上,是为硬件性能低下的远程设备以及网络状况不理想的情况下而设计的发布/订阅型消息协议。由于MQTT协议的轻量、简便、开放的特点使它适用范围非常广泛。在很多情况下,包括受限的环境中使用,广泛应用于物联网(IoT)。MQTT协议在卫星链路通信传感器、医疗设备、智能家居、及一些小型化设备中已广泛使用。
阿里云为国内主流的云平台,提供免费试用的物联网平台,本文使用小凌派RK2206开发板实现基于OpenHarmony的阿里云IoT服务。小凌派RK2206开发板采用瑞芯微高性能、高性价比的RK2206芯片。RK2206芯片是一款低功耗、高集成的MCU无线局域网处理器,它可以应用于不同的应用领域,如物联网、可穿戴设备、家庭自动化、云连接等。小凌派RK2206开发板内置WIFI模块,外部接口丰富,使用一个小凌派RK2206开发板就能够轻松实现MQTT物联网多种应用。
二、硬件威廉希尔官方网站
设计
如图1所示,为小凌派RK2206开发板支持的外部接口,本文使用小凌派RK2206开发板内置的WIFI和MQTT服务器通信。
图1 小凌派RK2206开发板
三、软件设计
主程序设计
在iot_aliyun_example函数中,通过LOS_TaskCreate函数创建iot_aliyun_thread线程,并设置线程优先级、线程堆栈大小等参数。
- <div>void iot_aliyun_example()</div><div>{</div><div> unsigned int ret = LOS_OK;</div><div> unsigned int thread_id1;</div><div> unsigned int thread_id2;</div><div> TSK_INIT_PARAM_S task1 = {0};</div><div> TSK_INIT_PARAM_S task2 = {0};</div><div>
- </div><div> ret = LOS_QueueCreate("queue", MSG_QUEUE_LENGTH, &m_msg_queue, 0, BUFFER_LEN);</div><div> if (ret != LOS_OK)</div><div> {</div><div> printf("Falied to create Message Queue ret:0x%xn", ret);</div><div> return;</div><div> }</div><div>
- </div><div> task1.pfnTaskEntry = (TSK_ENTRY_FUNC)iot_aliyun_thread;</div><div> task1.uwStackSize = 10240;</div><div> task1.pcName = "iot_aliyun_thread";</div><div> task1.usTaskPrio = 24;</div><div> ret = LOS_TaskCreate(&thread_id1, &task1);</div><div> if (ret != LOS_OK)</div><div> {</div><div> printf("Falied to create iot_aliyun_thread ret:0x%xn", ret);</div><div> return;</div><div> }</div><div>}</div>
复制代码
阿里云服务程序设计
iot_aliyun_thread函数中,开发板先连接WIFI,通过WIFI和阿里云IoT平台通信;WIFI连接成功后,初始化网络,初始化MQTT客户端;初始化完成后,成功连接阿里云IoT平台。
- int iot_aliyun_thread()
- {
- aliyun_msg_t *app_msg = NULL;
- unsigned int addr;
- int ret;
- /*WIFI连接*/
- SetWifiModeOn();
- device_info_init(CLIENT_ID, USERNAME, PASSWORD);
- ret = oc_mqtt_init();
- if (ret != LOS_OK)
- {
- printf("oc_mqtt_init fail ret:%dn", ret);
- }
- while (1)
- {
- LOS_Msleep(100);
- }
- }
复制代码 四、编译测试登录阿里云设备连接阿里云前,需要做一些准备工作;登录阿里云IoT平台,在平台注册个人用户账号,并且需要实名认证后才可以正常使用。如图2所示,为阿里云IoT平台地址:https://free.aliyun.com/product/iotfreetrail。
图2 阿里云IoT平台地址
开通物联网服务
在阿里云IoT平台注册个人用户账号并进行登录,登录后需要开通物联网平台服务,点击立即开通,如图3所示。
图3 开通物联网平台
点击立即开通,在确认页面,点击右下角的立即开通,如图4所示。
图4 立即开通
点击立即开通,提示开通成功,如图5所示。
图5 开通成功提示
点击进入管理控制台,管理控制台如图6所示。
图6 管理控制台
创建产品
点击进入公共实例,点击侧边栏的产品页面,点击创建产品,如图7所示。
图7 创建产品
输入产品名称,选择自定义品类-直连设备,点击确定创建产品,如图8所示。
图8 创建产品详情
成功创建产品后,侧边栏点击产品,可以查看到创建的产品信息,如图9所示。
图9 产品详情
添加设备
点击侧边栏设备页面,点击添加设备,如图10所示。
图10 添加设备
按照要求填入产品名称和DeviceName,点击确认,如图11所示。
图11 添加设备详情页
成功创建设备后,侧边栏点击设备,可以查看到创建的设备信息,如图12所示。
图12 设备页面
点击进入刚添加的设备,可以查看到设备的详细信息,如图13所示。
图13 设备详情
点击查看MQTT连接参数,查看MQTT连接所需的参数,如图14所示。
图14 MQTT连接参数
在PC上使用WIN + R键打开命令行CMD,执行如下命令获取接入域名的IP地址。如图15所示,通过ping命令可以查询到MQTT域名的IP地址为47.102.164.191。
ping iot-06z00d4dxawzdv7.mqtt.iothub.aliyuncs.com
图15 查询MQTT域名IP地址
对应修改代码中的MQTT_SERVER_IP为查询到PC端IP地址47.102.164.191,MQTT_SERVER_PORT修改为MQTT服务器端口号1883。代码如下所示:
- <p class="MsoNormal">#define MQTT_SERVER_IP "<font face="Consolas">47.102.164.191</font>"<o:p></o:p></p><p class="MsoNormal">#define MQTT_SERVER_PORT 1883</p>
复制代码
根据MQTT连接参数依次修改代码中的CLIENT_ID、USERNAME和PASSWORD,代码如下所示:
- <p class="MsoNormal">#define PRODUCT_KEY "hdm1KctTIxC"<o:p></o:p></p><p class="MsoNormal">#define DEVICE_NAME "aliyun"<o:p></o:p></p><p class="MsoNormal">#define CLIENT_ID "hdm1KctTIxC.aliyun|securemode=2,signmethod=hmacsha256,timestamp=1655280007303|"<o:p></o:p></p><p class="MsoNormal">#define USERNAME "aliyun&hdm1KctTIxC"<o:p></o:p></p><p class="MsoNormal">#define PASSWORD "d41441cfae339f4a09ac2bc600b736db80d3d6694f1d58efc16eb8e812d4d295"<o:p></o:p></p><p class="MsoNormal" align="justify"><o:p> </o:p></p>
复制代码
WIFI连接修改代码中的SSID和PASSWORD为使用WIFI的SSID和密匙,用于连接网络,设备通过WIFI访问阿里云IoT平台。代码如下所示:
- <p class="MsoNormal">#define SSID "lzdz"<o:p></o:p></p><p class="MsoNormal">#define PASSWORD "12345678"</p>
复制代码
运行结果例程代码编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志,串口打印MQTT初始化、连接等日志。
- <p class="MsoNormal">NetworkConnect...<o:p></o:p></p><p class="MsoNormal">MQTTClientInit...<o:p></o:p></p><p class="MsoNormal">MQTTConnect...<o:p></o:p></p><p class="MsoNormal">MQTTSubscribe...</p>
复制代码
此时登录阿里云IoT平台,点击进入设备详情页面,可以看到设备的当前状态为在线。如图所示。
图16 设备上线阿里云IoT平台