物联网最常用的MQTT
学习目的及目标
掌握mqtt的原理和工作过程掌握ESP32的MQTT编程
MQTT原理和工作过程讲解
MQTT (消息队列遥测传输)是基于ISO标准(ISO/IEC PRF 20922 )中的公开/订阅模式的消息协议。 这是一种在TCP/IP协议家族中运行,针对硬件性能低下的远程设备和网络条件差而设计的公开/订阅消息协议,因此需要消息中间件(服务器)。通过MQTT协议,现在扩展了几十个MQTT服务器端程序,可以用PHP、JAVA、Python、c、C#等系统语言向MQTT发送相关消息。
此外,国内许多企业广泛使用MQTT作为从安卓手机客户端和服务器端推送消息的协议。 MQTT由于开源,具有功耗低等特点。 在物联网领域,可以想到的是传感器与服务器的通信、信息的收集、MQTT。 未来的MQTT将进入我们生活的方方面面。
因此,如果物联网设备想要连接到互联网,MQTT是不二选择。
MQTT特点
MQTT协议是为在大量计算能力有限、低带宽、低可靠性的网络中工作的远程传感器与控制设备进行通信而设计的协议,具有以下主要特征。使用分发/订阅消息模式提供一对多的消息分发,并取消APP应用程序的合并
切断负荷内容的消息传输;
使用TCP/IP提供网络连接
有3种信息传播服务质量。
“至多一次”,信息发布完全依赖于基础的TCP/IP网络。 发生邮件丢失或重复。 在这个级别上,环境传感器数据可以丢失一次读取记录。 因为不久会有第二次发送。
“至少一次”允许消息到达,但可能会发生消息重复。
“只发送一次”,确保信息只发送一次。 如果在计费系统中发生重复或丢失的消息会导致不正确的结果,则可以使用此级别。
小型传输,开销小(固定长度的报头为2字节),使协议交换最小化,降低网络流量;
因此,介绍中说它最适合物联网领域,但要知道嵌入式设备的处理能力和带宽比较弱,使用该协议传递消息是最合适的。
要实现
实现方式
MQTT协议,客户端和服务器端的通信必须完成。 通信中,mqtt协议有发布者(Publish )、代理(Broker ) (服务器)、订阅者(Subscribe )三个id。 这里,消息的发布者和订阅者都是客户端,消息代理是服务器,消息的发布者同时也可以是订阅者。MQTT发送的消息分为主题(Topic )和有效载荷)两部分。
主题可以理解为消息的类型,如果订阅者订阅(Subscribe ),则接收该主题的消息内容) payload )。
payload可以理解为消息的内容,是指读者具体使用的内容。
MQTT服务器的主要工作是数据分发,没有数据保存功能。
可以订阅自己发布的主题。 服务器是回送测试。
MQTT需要更加明确逻辑,订阅什么?
走上标准化的趋势,解放了私有协议的制定、实现、调整、测试的复杂流程。
Win7搭建本地MQTT服务器(参考原文)
目前主流的Broker有以下3个。Mosquitto: https://mosquitto.org/
VerneMQ: https://vernemq.com/
EMQTT: http://EMQTT.io/在此,我们使用来构建emqtt。
下载MQTT服务器压缩包
稳定版: emqttd-2.3.11已于2018/07/23发行
解压到电脑
这里解压到e驱动器。
打开终端
。 f?from=pc">进入目录运行MQTT服务
执行成功会弹出下面窗口,不成功就关掉cmd重新试下。
测试MQTT服务器
打开浏览器-> 输入http://127.0.0.1:18083 -> 用户名:admin-> 密码:public-> 进入如下界面
连接MQTT服务器。
这个软件不怎么好用,连不上,关掉再连。使用127.0.0.1也可以。
连上了两个
订阅->发布,就可以数据发送了。
ESP32的MQTT软件设计
ESP32的MQTT详细过程逻辑
MQTT接口介绍
MQTT是基于TCP的,关于是如何封装的,乐鑫已经整理好了,留给我们应用层使用的接口相对较少,内部如何封装,乐鑫怎么封装,标准怎么封装,有时间可以仔细阅读乐鑫源码和标准文档,后面有需要我们会解析下乐鑫封装的那一层,此处不做介绍,只讲解应用层。所谓流程+接口,打遍无敌手。
· MQTT配置信息esp_mqtt_client_config_t;
· MQTT Client初始化函数:esp_mqtt_client_init();
· MQTT Client启动函数:esp_mqtt_client_start();
· MQTT Client停止函数:esp_mqtt_client_stop();
· MQTT Client订阅主题函数:esp_mqtt_client_subscribe();
· MQTT Client取消订阅主题函数:esp_mqtt_client_unsubscribe();
· MQTT Client发布主题函数:esp_mqtt_client_publish();
· MQTT Client注销函数:esp_mqtt_client_publish();
基于TCP的MQTT源码编写
· MQTT初始化
· MQTT回调
· 定时发布主题
测试效果
测试流程
· 启动MQTT服务器,上文步骤。
· 下载MQTT源码到开发板
· 修改WiFi账号和密码。
· 修改MQTT配置信息
· make menuconfig -> make all -> make flash ->make mmonitor
· PC MQTT助手连上服务器。
效果展示
· 服务器有两个MQTT客户端,分别是ESP32开发板和PC的助手。
· 订阅和发布,可以互通
MQTT总结
· 此处的MQTT源码是基于TCP的MQTT方案。
· 乐鑫SDK,最新开发版本自带MQTT库,所以我更新了SDK和编译链,如下图,SDK里面必须有MQTT库,直接下载压缩包即可。
· MQTT的源码结构和WiFi状态机一样,都是初始化+回调的方式。
· MQTT总结就是:伸手即得
· 我发布的主题,无论是谁订阅都能收到,包括我自己。
· 别人发布的主题,只要我订阅就能收到。
· 大家是不是觉得教程太复杂,主要原因是多了MQTT本地服务器的搭建,补充教程中,会使用乐鑫的MQTT云服务器。届时流程更加简单。
· 源码地址:https://github.com/HX-IoT/ESP32-Developer-Guide
开源地址:https://github.com/HX-IoT/