鸿蒙嵌入式系统开发原理与实战 课件 第11章 MQTT传输协议_第1页
鸿蒙嵌入式系统开发原理与实战 课件 第11章 MQTT传输协议_第2页
鸿蒙嵌入式系统开发原理与实战 课件 第11章 MQTT传输协议_第3页
鸿蒙嵌入式系统开发原理与实战 课件 第11章 MQTT传输协议_第4页
鸿蒙嵌入式系统开发原理与实战 课件 第11章 MQTT传输协议_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章MQTT传输协议学习完本课程后,您将能够:了解MQTT协议了解Paho-MQTT开源项目掌握Paho-MQTT库的移植技术掌握LiteOS-m的MQTT协议传输技术。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

MQTT简介

MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),当前最主流的物联网通信协议,各种物联网云平台,例如华为云、阿里云、移动OneNET都支持MQTT,现已成为嵌入式系统开发的重要组成部分。MQTT协议是一种基于发布/订阅(publish/subscribe)范式的二进制“轻量级”消息协议,该协议构建于TCP/IP协议上,由IBM公司在1999年发布,随后,协议被开放,成为结构化信息标准推动组织(OrganizationfortheAdvancementofStructuredInformationStandards,OASIS)标准,并在众多物联网应用中得到广泛应用。MQTT协议在物联网领域起初设计用于传感器网络和设备间的低带宽、高效率通信。其轻量级和简单的发布/订阅模式使得设备能够节省能源和带宽,适用于智能家居、工业自动化和智能城市等多种场景。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

MQTT协议架构

MQTT客户端作为消息发布者或订阅者,通过TCP/IP协议与MQTTBroker通信,实现数据的发布与订阅传输。客户端角色涵盖多样化终端设备及应用程序,包括传感器、嵌入式硬件、移动终端等。MQTT协议架构

在MQTT协议中,客户端(Client)的核心功能包括:发布消息:

向代理服务器(Broker)发送消息。消息内容可以是任意格式的数据,常见如传感器读数或控制指令。订阅主题:

向Broker注册对特定主题(Topic)的兴趣,以接收相关消息。主题可采用通配符,实现灵活的订阅规则。接收消息:

接收来自Broker转发的、其已订阅主题的消息,并进行后续处理或分析。MQTT协议架构

在MQTT协议中,客户端(Client)的核心功能包括:设定服务质量(QoS):

可选择消息传递的可靠性级别:QoS0(至多一次):消息尽力交付,不保证到达,无重传机制。最快,但可能丢失。QoS1(至少一次):确保消息至少到达一次,但可能重复。QoS2(恰好一次):确保消息仅到达一次。不同的QoS级别平衡了消息传递的可靠性与效率。MQTT协议架构

MQTT代理服务器(Broker)作为中枢,负责管理客户端间的通信,其关键职责为:消息路由与分发:

接收发布者(PublisherClient)发送的消息,并根据订阅关系,准确分发给所有订阅了匹配主题的订阅者(SubscriberClient)。连接管理:

维护客户端的连接状态,保障连接的可靠性和安全性。QoS保障:

依据消息发送方设定的QoS级别,严格执行相应的消息传递和确认机制,确保达成预定的可靠性目标。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

MQTT报文

MQTT协议的订阅与发布是基于主题的(Topic)简单举例说明:A连接到Broker,B也连接到Broker,并订阅主题1。然后,A发送给Broker一条消息,主题为1。这时,Broker收到A的消息,发现B订阅了主题1,就将消息转发给B,于是B从Broker处接收到该消息。这个例子涉及了几个概念:发布者(Publisher)和订阅者(Subscriber),发送方(Sender)和接收方(Recevier)。如果一个客户端对某个主题发布消息,那么它就是发布者;如果一个客户端订阅了某个主题,那么它就是订阅者。在上面的例子中,A是发布者,B是订阅者。当A发布消息时,它发送给Broker一条消息,那么A是发送方,Broker是接收方;当Broker转发消息给B时,Broker是发送方,B是接收方。MQTT报文

MQTT协议通过定义标准化的控制报文(Packet)实现客户端与Broker的通信。常见的报文类型有:连接管理:

CONNECT(建立连接)、CONNACK(连接确认)消息传输:

PUBLISH(发布消息)、PUBACK(发布确认)主题订阅:

SUBSCRIBE(订阅请求)、SUBACK(订阅确认)、UNSUBSCRIBE(取消订阅)MQTT报文

MQTT报文由固定报头、可变报头(部分报文包含)和载荷(部分报文包含)三部分构成。固定报头定义了核心控制信息,包括报文类型、标志位(如:QoS、RETAIN)及后续数据长度;可变报头则依据报文类型携带协议参数,如:CONNECT报文的连接标志与心跳间隔、PUBLISH报文的主题名与报文标识符,SUBSCRIBE报文的订阅列表标识;载荷用于携带实际数据,如:PUBLISH的消息体,SUBSCRIBE的订阅的主题列表及每个主题请求的QoS等级等。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

Paho-MQTT简介

PahoMQTT是由Eclipse基金会维护的开源MQTT客户端库项目,提供跨平台的MQTT协议实现,支持多种编程语言(如:C/C++、Python、Java、JavaScript等)。PahoMQTTC是Paho项目的一部分,是专门为C语言开发的MQTT客户端库。PahoMQTTC库旨在提供一个可靠、高效的实现,使开发者能够轻松地在C语言环境中实现MQTT的发布和订阅功能。OpenHarmony作为面向全场景的分布式操作系统,通过集成Paho-MQTTC库实现轻量级设备的高效通信能力。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

PahoMQTTC库文件内容

PahoMQTTC库文件能够被移植的代码位于MQTTClient-C、MQTTPacket、MQTTClient文件夹。MQTTPacket文件夹提供MQTT协议报文的底层解析与封装功能,其代码实现了对CONNECT、PUBLISH、SUBSCRIBE等标准报文的序列化(编码为字节流)和反序列化(字节流解析为结构化消息)。MQTTClient-C文件夹包含MQTT客户端的C语言核心实现,基于MQTTPacket构建高层抽象接口,封装连接管理、消息发布/订阅及断开连接等操作。在移植过程中,需重点调整该文件夹的网络接口以实现与服务器的通信适配。MQTTClient作为基于C++的跨平台库(最初为mbed开发),依赖MQTTPacket底层能力,纯C语言环境可忽略此文件夹。PahoMQTTC库文件内容

MQTTClient-C的核心实现在MQTTClient.c文件中,通过调用MQTTPacket的报文序列化接口(如:MQTTSerialize_publish())构造协议数据,并依赖外部注入的网络接口发送报文。其初始化函数MQTTClientInit()需传入Network结构体——该结构体包含Socket句柄、数据接收函数与数据发送函数指针。移植时需完成三处关键适配:实现Socket连接初始化逻辑;编写匹配Network结构体定义的收/发函数;提供超时管理所需的计时函数。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

PahoMQTT库移植——使用已编译静态库

将随书源码pahomqtt和libs两个文件夹复制到OpenHarmony源码third_party目录下,即完成代码移植。pahomqtt文件夹存放了PahoMQTTC库源码;libs文件夹中为已编译好的PahoMQTTC静态库libpahomqtt_static.a,有了这个文件就可以在OpenHarmony中实现MQTT协议了。PahoMQTT库移植——下载官方源码移植

具体步骤如下:1.从官网下载:/eclipse-paho/paho.mqtt.embedded-c,解压后将文件夹改名为pahomqtt。2.pahomqtt/MQTTClient-C/src目录下已存在适配cc3200、FreeRTOS和Linux内核的目录。为支持OpenHarmony的

LiteOS-M内核,需新建对应的适配目录。

新建liteOS目录,并添加目录文件MQTTLiteOS.h和MQTTLiteOS.c文件。程序代码PahoMQTT库移植——下载官方源码移植

具体步骤如下:然后将MQTTLiteOS.h作为头文件添加到pahomqtt/MQTTClient-C/src目录的MQTTClient.h文件中。PahoMQTT库移植——下载官方源码移植

具体步骤如下:3.在pahomqtt目录下新建BUILD.gn文件。程序代码PahoMQTT库移植——下载官方源码移植

具体步骤如下:4.修改device/hisilicon/hispark_pegasus/sdk_liteos/BUILD.gn。在lite_component(“sdk”)中添加“//third_party/pahomqtt:pahomqtt_static”,使编译时能生成相应的静态库。PahoMQTT库移植——下载官方源码移植

具体步骤如下:5.VSCode中端运行hbbuild-f编译系统,成功后。在third_party目录下新建libs目录,然后从编译生成的/out/hispark_pegasus/wifiiot_hispark_pegasus/libs中将libpahomqtt_static.a文件复制到third_party/libs下。PahoMQTT库移植——下载官方源码移植

具体步骤如下:6.将步骤4添加的语句注释掉。上述步骤5和6非必须,但要注意的是:缺少这两个步骤,应用程序的BUILD.gn文件有所区别,后面开发案例会介绍。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

PahoMQTT代码执行过程

使用PahoMQTTC库可以轻松搭建MQTT客户端程序,其典型代码逻辑是:1.初始化客户端。MQTTClientclient;MQTTClientInit(&client,"tcp://:1883","device001");2.定义回调函数(消息到达时触发)。voidmessageArrived(MessageData*md){ …}PahoMQTT代码执行过程

使用PahoMQTTC库可以轻松搭建MQTT客户端程序,其典型代码逻辑是:3.连接Broker。MQTTPacket_connectDataconn_opts=MQTTPacket_connectData_initializer;conn_opts.keepAliveInterval=60;MQTTConnect(&client,&conn_opts);4.订阅主题。MQTTSubscribe(&client,"topic1",1,messageArrived);//QoS1PahoMQTT代码执行过程

使用PahoMQTTC库可以轻松搭建MQTT客户端程序,其典型代码逻辑是:5.发布消息。char*payload="{\"temp\":25.5}";MQTTPublish(&client,"topic2",&payload);6.主循环(OpenHarmony事件驱动)。while(1){ intrc=MQTTYield(&client,100); //处理网络流量(非阻塞) usleep(20*1000); //适当休眠降低CPU占用(20ms)}MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

MQTT相关API

完成上述移植过程后,可以在third_party/paho_mqtt/MQTTClient-C/src的文件夹找到本章案例要用到的API,MQTTClient.h文件就是连接MQTT需要用到的头文件,现在对常用的API进行说明。MQTT相关API

(1)DLLExportvoidMQTTClientInit(MQTTClient*

client,Network*

network,unsignedintcommand_timeout_ms,unsignedchar*

sendbuf,size_tsendbuf_size,unsignedchar*

readbuf,size_treadbuf_size)MQTTClientInit函数的作用为初始化的客户端,该函数拥有七个参数,第一个参数client为客户ID,该ID是唯一的,不可重复;第二个参数Network为网络信息,第三个参数command_timeout_ms为超时时间,单位为ms;第四个参数sendbuf为发送缓存区,第五个参数sendbuf_size为发送缓存区的大小,第六个参数readbuf为接收缓存区,第七个参数readbuf_size为接收缓存区的大小。该函数没有返回值。MQTT相关API

(2)DLLExportintMQTTConnect(MQTTClient*

client,MQTTPacket_connectData*

options)MQTTConnect函数的作用是连接MQTT服务器,该函数拥有两个参数,第一个参数client为客户端的信息,第二个参数option为MQTT的连接信息。连接成功返回0,连接失败返回其他代码。(3)DLLExportintMQTTPublish(MQTTClient*

client,constchar*,MQTTMessage*)MQTTPublish函数的作用是发布数据到主题,该函数拥有三个参数,第一个参数client为客户端信息,第二个参数为要发布的主题,第三个参数为发送消息的信息参数。发送成功返回0,发送失败返回其他代码。MQTT相关API

(4)DLLExportintMQTTSubscribe(MQTTClient*

client,constchar*

topicFilter,enumQoS,messageHandler)MQTTSubscribe函数的作用是订阅一个主题,该函数有四个参数,第一个参数client为客户端的信息,第二个参数topicFilter为要订阅的主题,第三个参数QoS为消息质量,第四个参数为接收到消息的处理函数。数据发送成功返回0,运行失败返回其他代码。(5)DLLExportintMQTTDisconnect(MQTTClient*client)MQTTDisconnect函数的作用是断开MQTT的连接,该函数只有一个参数client,为客户端的信息,函数运行成功返回0,运行失败则返回其他代码。MQTT相关API

(6)DLLExportintMQTTYield(MQTTClient*client,inttime)MQTTYield函数的作用是后台处理,该函数第一个参数client为客户端信息,第二个参数为指定的以毫秒为单位的处理时间,函数运行成功返回0,运行失败则返回其他代码。MQTT协议简介MQTT协议架构MQTT报文Paho-MQTT简介PahoMQTTC库文件内容PahoMQTT库移植PahoMQTT代码执行过程MQTT相关API开发示例——MQTT客户端代码设计编译、烧录和调试

开发示例——MQTT客户端

案例设计目标:连接到MQTT服务器,发布与订阅消息。MQTT协议简介MQTT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论