datasheet

STM32单片机

文章数:290 被阅读:879038

账号入驻

你不知道的STM32 FOTA例程:Paho MQTTClient embeddedC使用

2018-11-10
    阅读数:

前言

MQTT协议的全称叫“消息队列遥测传输”协议。它是一个轻量级的通信协议。旨在为低带宽、高延时、不稳定网络中的物联网设备提供消息传输服务。它运行在TCP/IP协议之上,采用客户端/服务器,发布/订阅消息模式工作,并提供一对多的消息分发。STM32 FOTA Demo就是通过MQTT协议进行MCU固件新版本信息的推送。Paho是一个开源的MQTT客户端实现,它提供了多种开发语言下的实现。在此Demo中,用的是embeddedC这个版本。可以在

https://github.com/eclipse/paho.mqtt.embedded-c下载到最新的版本。


01

Paho MQTTClient 

EmbeddedC的代码构成

从github上下载下来的源代码,包括三个部分:

MQTTPacket : 该文件夹下包括了底层的C代码,提供基本的简单的解析数据,以及将数据串行化的功能。是其他两个上层接口的基础,也可以单独使用。

MQTTClient :该文件夹下提供C++的上层接口,现在提供Linux, Arduino和mbed的实现。

MQTTClient-C:该文件夹下提供C的上层接口,针对那些不支持C++编程的平台。

Demo要用到的就是MQTTPacket和MQTTClient-C这两个文件夹下的源文件。


02

使用Paho 

MQTTClient EmbeddedC

下面来看看如何使用Paho MQTTClient EmbeddedC在MCU端实现MQTT通信

配置网络传输接口

MQTT是一个TCP之上的应用层协议,它发送和接收数据都要通过下层的TCP/IP协议栈进行。所以MQTT与下层的协议之间一定有一个接口。

Paho的实现会通过结构体Network中的mqttread和mqttwrite成员函数作为接口来从底层网络读取数据以及向底层网络发送数据。因此Paho的适配工作需要注册这些成员函数,并实现之:


新建一个MQTT客户端

MQTTClient结构体的定义包括:接收/发送数据的缓冲区(readbuffer和buf),保持心跳的时间间隔(keepAliveInterval),当前的连接状态(isconnected),消息句柄(messageData)以及网络接口(ipstack)等内容。

调用MQTTClientInit函数时需要输入的参数有:已经初始化好的网络接口(Network*)结构体,COMMAND_TIMEOUT_MS和接收/发送数据的buffer。

初始化MQTTClient后,就可以通过MQTTConnect来和服务器建立连接了。在和服务器建立连接的时候,还需要设定一些和建立连接以及后面通信相关的参数,比如:用户名、密码、心跳包的间隔、遗嘱信息(will)、设备与服务器意外断开后服务器是否要保留后续消息(cleansession)等等。都可以通过对Connect_para进行初始化来设置这些参数,再调用MQTTConnect函数建立相关连接。


发送数据

和服务器的MQTT连接建立成功后,就可以发布和订阅消息了。

它有三个输入参数:

MQTTClient* c:就是前面新建的MQTTClient

const char* topicName:mqtt中每一条消息都是和某个主题相对应的,所以在发布消息的时候一定要指明这条消息是发往哪个主题。

MQTTMessage* message:将要被发送的消息。

除了消息的内容,还需要设定好消息传递的Qos级别以及服务器是否需要保存这条消息等。

接收数据

如果设备端希望能接收服务器发的某个主题的消息,需要做这么几件事:

• 向服务器订阅这类消息所属的主题

• 注册用来处理接收到的消息的回调函数

注意,这里同样需要指定一个QoS级别,之后服务器向设备端推送消息的时候,就会按照这个QoS级别进行。在MQTT应用中,即使是同一个设备端和服务器之间的通信,发布消息和订阅消息也可以采用不同的QoS级别。

该函数需要被定期调用,来接收服务器发来的数据。前面注册的消息处理回调函数MQTTcallbackHandler()就是在MQTTYield调用时被执行的。

介绍到这里,相信大家已经能够使用Paho来实现和MQTT服务器的基本通信了。

03

小结一下

对于一个MQTT客户端,MQTT应用先通过MQTTClientInit()建立连接,发布消息就调用MQTTPublish();订阅消息通过MQTTSubscribe(),但是需要同时注册对收到的消息的处理函数,以函数参数的形式传给MQTTSubscribe;对于所订阅的消息,会异步地从云端下发过来,MQTT客户端需要定期调用MQTTYield()来收取并处理。


↓↓↓ 更多详情,请点击“阅读全文”

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved