【鸿蒙南向开发】OpenHarmony开发之MQTT解析

MQTT物联网协议解析与实践

前言

相信MQTT这个名称大家都不陌生,物联网的开发必然会遇到MQTT相关知识的应用。那么什么是MQTT?它有什么特点?它能解决什么问题?它是如何工作的?OpenAtom OpenHarmony(以下简称“OpenHarmony”)的物联网开发者要如何使用及验证MQTT功能?接下来的内容将一一为你解答。下图为MQTT通信模型。

在这里插入图片描述

什么是MQTT

MQTT(Message Queuing Telemetry Transport消息队列遥测传输)是一种物联网协议,是一种客户端与服务端架构的发布/订阅模式的消息传输协议,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前它已广泛应用于车联网、智能家居、即时聊天应用和工业互联网等领域。

MQTT的基本原理

在MQTT通讯中,有两个最为重要的角色。它们分别是服务端和客户端。

MQTT服务端
MQTT服务端通常是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。

MQTT客户端
MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为称为“发布”信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅”信息。“订阅”信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了。

MQTT主题
刚刚我们在讲解MQTT客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在MQTT通讯中,客户端所订阅的肯定不是一部部电视剧,而是一个个“主题”。MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。
为了便于您更好理解服务端是如何通过主题来控制客户端之间的信息通讯,我们来看看下图示例:

在这里插入图片描述

以上图示中一共有三个MQTT客户端。它们分别是汽车、手机和电脑。在管理MQTT通讯时,MQTT服务端使用了“主题”来对信息进行管理。比如上图所示,假设我们需要利用手机和电脑获取汽车的速度,那么我们首先要利用电脑和手机向MQTT服务器订阅主题“汽车速度”。接下来,当汽车客户端向服务端的“汽车速度”主题发布信息后,服务端就会首先检查以下都有哪些客户端订阅了“汽车速度”这一主题的信息。当它发现订阅了该主题的客户端有一个手机和一台电脑,于是服务端就会将刚刚收到的“汽车速度”信息转发给订阅了该主题的手机和电脑客户端。

以上实例中,汽车是“汽车速度”主题的发布者,而手机和电脑则是该主题的订阅者。
值得注意的是,MQTT客户端在通讯时,往往角色不是单一的。它既可以作为信息发布者也可以同时作为信息订阅者。如下图所示:

在这里插入图片描述

上图中的所有客户端都是围绕“空调温度”这一主题进行通讯的。对于“空调温度”这一主题,手机和电脑客户端成为了MQTT信息的发布者而汽车则成为了MQTT信息的订阅者(接收者)。

可以看到,针对不同的主题,MQTT客户端可以切换自己的角色。它们可能对主题A来说是信息发布者,但是对于主题B就成了信息订阅者。

MQTT客户端开发流程

以下采用小熊派的Paho MQTT样例,简要说明MQTT的开发流程。
样例代码在OpenHarmony源码目录/device/board/bearpi/bearpi_hm_nano/app/D5_iot_mqtt,源码下载路径参考文章末尾。开发应用主要涉及以下几个API应用:

<think>嗯,用户想知道在OpenHarmony中使用MQTT协议进行实时温湿度数据传输的教程和示例。首先,我需要整理现有的信息。用户提供的引用资料里提到了使用4G模块和AT命令实现MQTT,还有使用NodeMCU和DHT11通过MQTT上传数据,以及串口配置的代码。这些可能对OpenHarmony开发有帮助。 首先,OpenHarmony是一个开源操作系统,支持多种设备,所以需要确认其开发环境和硬件支持。可能涉及到的硬件包括温湿度传感器(比如DHT11)、通信模块(比如Wi-Fi或4G模块),以及MQTT库。 接下来,步骤分解。第一步是硬件准备,需要选择合适的传感器和通信模块。DHT11常用,但OpenHarmony可能需要特定的驱动或HDF配置。通信模块如果是Wi-Fi,可能需要配置网络连接,使用AT命令或者内置的API。 然后,软件部分。用户可能需要安装OpenHarmony开发环境,比如DevEco Studio,配置项目,编写Native API或JS应用。由于OpenHarmonyMQTT支持可能不完善,可能需要使用第三方库,比如Paho MQTT的移植,或者自己实现MQTT协议,底层用TCP连接,类似引用1中提到的方法。 数据采集部分,需要读取传感器的数据,可能通过GPIO或者I2C。例如,DHT11使用单总线协议,代码需要处理时序。这里可能需要参考引用2中的串口配置,但OpenHarmony的API可能不同,需要查阅相关文档。 MQTT连接部分,要创建TCP连接,然后按照MQTT协议发送CONNECT、PUBLISH等报文。引用1和3中的示例可能有用,但需要适配到OpenHarmony的环境。比如,使用AT命令发送TCP数据,或者直接使用socket编程。 还需要处理JSON数据的封装,将温湿度数据打包成MQTT payload,发送到指定的主题。服务器可以选择公共的MQTT broker,如EMQX,或者自建服务器。 可能遇到的问题包括传感器驱动的适配、网络连接的稳定性、MQTT库的兼容性等。需要确保代码在OpenHarmony的内核上能够运行,比如LiteOS-M或LiteOS-A,处理任务调度和资源管理。 最后,测试和优化,确保数据传输实时性,处理异常情况,如网络断开重连。可能需要参考引用中的代码结构,但调整语法和API调用方式以适应OpenHarmony。 总结步骤:硬件准备、环境搭建、传感器数据读取、网络连接、MQTT协议实现、数据封装与发送、异常处理。需要结合用户提供的引用内容,提取相关方法,并转换为OpenHarmony开发模式。</think>### OpenHarmony MQTT实时温湿度数据传输开发教程 #### 一、开发环境准备 1. 硬件配置: - OpenHarmony开发板(Hi3861/Hi3516系列) - 温湿度传感器(DHT11/DHT22) - WiFi/4G通信模块(Hi3861自带WiFi) - 传感器接线:VCC(3.3V)、GND、DATA(接GPIO5) 2. 开发环境搭建: - 安装DevEco Studio 3.0 - 配置OpenHarmony SDK - 创建Native C工程(适用硬件操作) #### 二、传感器驱动开发 ```c // drivers/dht11.c #include "ohos_init.h" #include "gpio_if.h" #define DHT_GPIO 5 float read_dht11() { GpioSetDir(DHT_GPIO, GPIO_DIR_OUT); GpioWrite(DHT_GPIO, GPIO_VAL_LOW); usleep(18000); // 主机拉低18ms // ...完整时序处理代码[^2] } ``` #### 三、MQTT协议实现 1. TCP连接建立(以WiFi为例): ```c // foundation/communication/wifi_lite/wifi_device.h WifiErrorCode ConnectTo(const char* ssid, const char* pwd); // 创建TCP连接 int tcp_fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server_addr = { .sin_family = AF_INET, .sin_port = htons(1883), .sin_addr.s_addr = inet_addr("broker.emqx.io") // [^3] }; connect(tcp_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); ``` 2. MQTT报文封装: ```c void mqtt_connect_packet(uint8_t* buffer) { // MQTT固定头 buffer[0] = 0x10; // CONNECT类型 buffer[1] = 0x15; // 剩余长度 // ...完整协议封装实现[^1] } ``` #### 四、数据整合与发送 ```c void publish_data(float temp, float humi) { cJSON* root = cJSON_CreateObject(); cJSON_AddNumberToObject(root, "temp", temp); cJSON_AddNumberToObject(root, "humi", humi); char* payload = cJSON_PrintUnformatted(root); mqtt_publish("devices/123/sensors", payload); cJSON_Delete(root); } ``` #### 五、异常处理机制 ```c void network_reconnect() { while (1) { if (check_network() == 0) { vTaskDelay(5000); continue; } mqtt_reconnect(); vTaskDelay(100); } } void mqtt_reconnect() { closesocket(tcp_fd); tcp_connect(); send_connect_packet(); } ``` #### 六、编译与烧录 1. 修改BUILD.gn文件: ```gn executable("main") { sources = [ "//drivers/dht11.c", "//mqtt/client.c" ] include_dirs = [ "//foundation/communication/wifi_lite", "//third_party/cjson" ] } ``` 2. 烧录命令: ```bash python build.py wifiiot # Hi3861编译 hdc_std flash # 烧录镜像 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值