MQTT over WiFi#

实验目的#

  • 了解MQTT代理,主题,发布、订阅模式等概念

  • 编写代码实现ESP32作为发布者向EMQX发布主题

  • 编写代码实现ESP32作为订阅者向EMQX订阅主题

MQTT简介#

MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,专门设计用于物联网(IoT)设备之间的通信。它是一个基于发布/订阅模式的协议,允许设备通过中间代理(broker)进行异步通信。

以下是MQTT的一些关键特点和概念:

  1. 轻量级:MQTT协议设计简单,通信消息头部开销小,适用于低带宽和不稳定网络环境,以及资源受限的设备。

  2. 发布/订阅模式:MQTT使用发布/订阅模式进行消息传递。设备可以作为发布者(publisher)将消息发布到主题(topic),而其他设备可以作为订阅者(subscriber)订阅感兴趣的主题。这种解耦的模式使得设备之间的通信更加灵活和可扩展。

  3. 主题(Topic):主题是MQTT中消息的分类标识符。发布者发布消息到特定主题,而订阅者可以订阅一个或多个主题以接收相应的消息。

  4. 代理(Broker):MQTT通信的中间代理称为代理或者消息代理(broker)。代理负责接收发布者的消息,并将其分发给订阅了相应主题的订阅者。代理可以处理订阅者的注册和管理,确保消息的可靠传递。

  5. QoS(Quality of Service):MQTT定义了三个不同级别的消息传递质量:QoS 0(至多一次)、QoS 1(至少一次)和QoS 2(恰好一次)。QoS级别决定了消息的可靠性和传递机制。

  6. 连接和会话:MQTT使用基于TCP/IP的长连接进行通信。设备通过建立连接到代理并保持会话,以便进行消息的发布和订阅。这种长连接的机制可以减少网络开销和延迟。

MQTT广泛应用于物联网领域,特别适合于传感器、嵌入式设备和其他资源受限的设备之间的通信。它的轻量级和灵活性使得MQTT成为连接大规模设备网络的理想选择。

EMQX简介#

EMQX是一款开源的高度可扩展的MQTT消息代理(broker),它是建立在Erlang/OTP平台上的,专为物联网和实时通信应用而设计。

EMQ X具有以下主要特点:

  1. 高可扩展性:EMQ X使用Erlang/OTP的并发模型和可伸缩性,能够轻松处理大规模设备网络的消息传递。它支持水平扩展,可以通过增加节点来增加系统的容量和吞吐量。

  2. MQTT支持:作为一款MQTT消息代理,EMQ X完全兼容MQTT协议版本3.1和3.1.1。它支持发布/订阅模式、QoS级别、保留消息、遗嘱消息和持久化订阅等核心功能。

  3. 安全性:EMQ X提供多种安全机制来保护消息传递的机密性和完整性。它支持TLS/SSL加密传输,可以使用用户名和密码进行身份验证,还支持访问控制列表(ACL)以限制设备的访问权限。

  4. 多协议支持:除了MQTT,EMQ X还支持其他通信协议,如MQTT-SN、CoAP、AMQP等。这使得它能够与不同类型的设备和应用集成,并提供统一的消息中间件解决方案。

  5. 实时数据处理:EMQ X内置了强大的实时数据处理和规则引擎,称为EMQ X Rule Engine。它可以对设备发送的消息进行筛选、转发、转换和存储等操作,实现实时数据的处理和分析。

  6. 高可用性和容错性:EMQ X支持集群模式和故障转移,确保系统的高可用性和容错性。当一个节点发生故障时,其他节点可以接管服务,保证消息传递的连续性。

EMQ X广泛应用于物联网、智能家居、工业自动化、智能交通等领域,为设备之间的可靠通信提供了可靠的基础架构和强大的功能。作为开源软件,它也得到了一个活跃的社区的支持和贡献。

实验内容#

所需软硬件#

  • ESP32开发板

  • PC机

  • EMQX Broker:

    • 地址:8.134.62.44

    • web UI:http://8.134.62.44:8082

  • EMQX client:MQTT X

实验方案#

  • ESP32作为publisher,MQTT X作为subcriber,通过EMQX Broker交换数据

  • ESP32作为subcriber,MQTT X作为publisher,通过EMQX Broker交换数据

安装客户端MQTTX#

MQTT X为跨平台的MQTT客户端,可在官方页面下载安装。对于UBUNTU系统可直接通过以下命令安装

sudo snap install mqttx

主题与负载定义#

在EMQX,可以自定义主题,为了配合和下一节的thingsboard使用,本节实验使用已定义的主题内容:

主题#

1 遥测数据

v1/devices/me/telemetry

2 设备属性

v1/devices/me/attributes

负载#

负载以json数据格式表达:行如下:

{"key1":"value1", "key2":"value2"}

ESP32作为publisher#

ESP32作为subscriber#