· 掌握MQTT原理和工作过程
· 掌握ESP32的MQTT程序设计
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 (服务器)。
通过MQTT协议,目前已经扩展出了数十个MQTT服务器端程序,可以通过PHP,JAVA,Python,C,C#等系统语言来向MQTT发送相关消息。
此外,国内很多企业都广泛使用MQTT作为Android手机客户端与服务器端推送消息的协议。MQTT由于开放源代码,耗电量小等特点。在物联网领域,传感器与服务器的通信,信息的收集,MQTT都可以作为考虑的方案之一。在未来MQTT会进入到我们生活的各各方面。
所以,如果物联网设备想要联网,MQTT是不二选择。
MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
· 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
· 对负载内容屏蔽的消息传输;
· 使用 TCP/IP 提供网络连接;
· 有三种消息发布服务质量:
· "至多一次",消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
· "至少一次",确保消息到达,但消息重复可能会发生。
· "只有一次",确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
· 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
这就是为什么在介绍里说它非常适合物联网领域,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
· Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
· payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
· MQTT服务器的主要工作是数据分发,没有数据保存功能。
· 可以订阅自己发布的主题,服务器就是回发测试。
· MQTT让逻辑变得更清晰,需要什么订阅什么。
· 走标准化流程,解放了私有协议制定、实现、调试、测试一整套复杂的流程。
目前主流的Broker有以下3个:
· Mosquitto:https://mosquitto.org/
· VerneMQ:https://vernemq.com/
EMQTT:http://emqtt.io/ 此处,我们使用搭建EMQTT。
稳定版:emqttd-2.3.11 发布于 2018/07/23
我这里是解压到E盘。
执行成功会弹出下面窗口,不成功就关掉cmd重新试下。
打开浏览器-> 输入http://127.0.0.1:18083 -> 用户名:admin-> 密码:public-> 进入如下界面
这个软件不怎么好用,连不上,关掉再连。使用127.0.0.1也可以。
连上了两个
订阅->发布,就可以数据发送了。
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();
· MQTT初始化
· MQTT回调
· 定时发布主题
· 启动MQTT服务器,上文步骤。
· 下载MQTT源码到开发板
· 修改WiFi账号和密码。
· 修改MQTT配置信息
· make menuconfig -> make all -> make flash ->make mmonitor
· PC MQTT助手连上服务器。
· 服务器有两个MQTT客户端,分别是ESP32开发板和PC的助手。
· 订阅和发布,可以互通
· 此处的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/