MQTT协议概述
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消息给感兴趣的客户端。
MQTT协议特点
MQTT协议具有以下主要特点:
- 轻量级:MQTT协议的实现非常轻巧,占用资源少,非常适合于资源受限的设备,如传感器、嵌入式设备等。
- 低带宽需求:MQTT协议的设计考虑到了带宽的高效利用,其报头非常小,这使得它能够在低带宽环境下有效工作。
- 可靠的消息传递:MQTT提供了三种服务质量等级(QoS),允许发布者和订阅者之间选择合适的服务质量级别。
- 支持多种传输层:虽然MQTT最初是基于TCP/IP设计的,但它也支持使用WebSockets和其他传输协议,以便更好地集成到现代Web应用中。
- 安全性:MQTT支持TLS加密通信,保证了数据的安全性,并可以通过认证机制增强安全性。
MQTT协议的基本概念
MQTT协议的核心概念包括客户端、服务器(Broker)、主题和消息。
- 客户端(Client):任何连接到Broker的应用程序都可以被称为客户端。客户端可以订阅感兴趣的主题,接收其他客户端发布的消息,也可以发布消息。
- 服务器(Broker):MQTT服务器或Broker是消息的中心节点,它接受客户端的连接请求,存储订阅关系,并将消息从发布者路由到订阅者。
- 主题(Topic):主题是一个字符串,用于标识消息的类别或目的。客户端订阅主题后,可以接收到发布到该主题的所有消息。
- 消息(Message):消息是由客户端发布的一组数据,它包含两部分:主题名和消息体。
MQTT协议的工作流程
MQTT的工作流程如下:
- 连接:客户端向Broker发送连接请求,包含客户端ID、用户名、密码等信息。
- 订阅:一旦连接成功,客户端可以订阅一个或多个主题。
- 发布:客户端可以向特定主题发布消息。
- 接收:如果客户端订阅了一个主题,则它可以接收该主题下的消息。
- 断开连接:当客户端完成所有操作后,可以断开与Broker的连接。
MQTT协议的应用场景
由于其轻量级特性和高效的消息传递能力,MQTT协议广泛应用于物联网(IoT)领域,特别是在智能家居、工业自动化、远程监控等领域。此外,随着移动互联网的发展,MQTT也被用于移动应用程序中的实时数据更新和推送服务。
【1】MQTT服务器地址信息
cpp
IP地址:117.78.5.125
端口号:1883
ClientId 64000697352830580e48df07_dev1_0_0_2023030206
Username 64000697352830580e48df07_dev1
Password a695af9883c5d0e3817bc6971beeecadf8c7c595677c461b1fe75882ed2bf449
订阅主题:$oc/devices/64000697352830580e48df07_dev1/sys/messages/down
发布主题:$oc/devices/64000697352830580e48df07_dev1/sys/properties/report
发布的消息:{"services": [{"service_id": "stm32","properties":{"DHT11_T":18,"DHT11_H":80,"MQ2":1,"water":1,"flame":1,"light":0,"LED1":0,"LED2":0,"LED3":0}}]}
【2】ESP8266-WIFI连接
要通过ESP8266模块使用AT指令来连接MQTT服务器,订阅特定的主题,并发布消息,可以按照以下步骤操作。
请注意,这里提供的AT命令序列是基于ESP8266模块支持的MQTT功能。
下面是一个示例流程:
-
初始化ESP8266
AT+RST
重启模块AT
测试模块是否响应AT+CIPMUX=1
设置多连接模式(可选)AT+CIPRXGET=1,100
设置接收数据的方式(可选)
-
设置Wi-Fi连接
AT+CWMODE=3
设置为Station+AP模式(通常只需要Station模式即可,即设置为1)AT+CWJAP="yourSSID","yourPassword"
连接到Wi-Fi网络
-
配置MQTT客户端
AT+CIPMQTTCFG="117.78.5.125",1883,"64000697352830580e48df07_dev1_0_0_2023030206","64000697352830580e48df07_dev1","","a695af9883c5d0e3817bc6971beeecadf8c7c595677c461b1fe75882ed2bf449",0,0,60
配置MQTT客户端参数,包括服务器地址、端口、客户端ID、用户名、密码等
-
连接MQTT服务器
AT+CIPMQTTC=1
连接到MQTT服务器
-
订阅主题
AT+CIPMQTTSUB=0,"$oc/devices/64000697352830580e48df07_dev1/sys/messages/down",2
订阅指定的主题
-
发布消息
AT+CIPMQTTPUB=0,"$oc/devices/64000697352830580e48df07_dev1/sys/properties/report",2,0,0,"{"services": [{"service_id": "stm32","properties":{"DHT11_T":18,"DHT11_H":80,"MQ2":1,"water":1,"flame":1,"light":0,"LED1":0,"LED2":0,"LED3":0}}]}"
发布消息到指定主题
-
断开MQTT连接
AT+CIPMQTTDISC=0
断开与MQTT服务器的连接
-
关闭TCP/IP连接
AT+CIPCLOSE
关闭当前的TCP/IP连接
注意,在使用中,需要将"yourSSID"和"yourPassword"替换为实际使用的Wi-Fi网络的SSID和密码。
【3】NBIOT-BC26
使用NBIoT-BC26模块连接MQTT服务器的过程与使用ESP8266类似,但是命令集有所不同。
以下是使用NBIoT-BC26模块通过AT指令连接MQTT服务器、订阅主题以及发布消息的示例流程:
-
初始化模块
AT
检查模块是否在线ATE0
关闭回显AT+CFUN=1
启用射频功能AT+CGATT=1
附着到网络
-
设置网络参数
AT+CNOPS=0
设置网络操作模式AT+CGDCONT=1,"IP","your_apn"
设置PDP上下文,使用您的运营商提供的APN
-
激活PDP上下文
AT+CGACT=1,1
激活PDP上下文
-
配置MQTT客户端
AT+QMTOPEN=0,"tcp","117.78.5.125",1883
打开一个TCP连接到MQTT服务器
-
建立MQTT连接
- 使用
AT+QMTCONN
命令进行连接,此命令会发送MQTT CONNECT包给服务器。 AT+QMTCONN=0,"64000697352830580e48df07_dev1_0_0_2023030206",60,0,1,0,"64000697352830580e48df07_dev1","a695af9883c5d0e3817bc6971beeecadf8c7c595677c461b1fe75882ed2bf449"
连接MQTT服务器,参数包括客户端ID,保持活动时间,Clean Session标志,Will标志,Will QoS,Will保留位,用户名和密码。
- 使用
-
订阅主题
AT+QMTSUB=0,2,"$oc/devices/64000697352830580e48df07_dev1/sys/messages/down"
订阅主题
-
发布消息
AT+QMTPUB=0,1,"$oc/devices/64000697352830580e48df07_dev1/sys/properties/report",0,0,0,512
开始发送消息{"services": [{"service_id": "stm32","properties":{"DHT11_T":18,"DHT11_H":80,"MQ2":1,"water":1,"flame":1,"light":0,"LED1":0,"LED2":0,"LED3":0}}]}
发送的消息内容
-
断开MQTT连接
AT+QMTDISC=0
断开MQTT连接
-
关闭TCP连接
AT+QMTCLS=0
关闭TCP连接
-
去激活PDP上下文
AT+CGACT=1,0
去激活PDP上下文
上述命令序列是基于NBIoT-BC26模块的MQTT功能。
【4】EC20-4G模块
对于EC20模块(通常是4G LTE模块),连接MQTT服务器、订阅主题和发布消息的AT指令会有所不同。
以下是使用EC20模块通过AT指令完成这些操作的流程:
-
初始化EC20模块
AT
检查EC20是否正常工作。
-
设置工作模式为数据模式(如果尚未设置)
AT+QCFG="nwscanmode",0,1
设置网络扫描模式为自动。
-
连接到移动网络
AT+QNWINFO
检查网络连接状态。
-
设置MQTT服务器的IP地址和端口
AT+QMTOPEN=0,"117.78.5.125",1883
连接到MQTT服务器的指定IP和端口。
-
登录MQTT服务器
AT+QMTCONN=0,"64000697352830580e48df07_dev1","a695af9883c5d0e3817bc6971beeecadf8c7c595677c461b1fe75882ed2bf449",0,0
使用客户端ID、用户名和密码连接MQTT服务器。
-
订阅MQTT主题
AT+QMTSUB=0,"$oc/devices/64000697352830580e48df07_dev1/sys/messages/down",1
订阅指定的MQTT主题。
-
发布消息到MQTT主题
AT+QMTPUB=0,"$oc/devices/64000697352830580e48df07_dev1/sys/properties/report",0,0,{"services":[{"service_id":"stm32","properties":{"DHT11_T":18,"DHT11_H":80,"MQ2":1,"water":1,"flame":1,"light":0,"LED1":0,"LED2":0,"LED3":0}}]}
向指定的MQTT主题发布消息。
-
断开MQTT连接
AT+QMTDISC=0
断开与MQTT服务器的连接。
-
关闭EC20模块(如果需要)
AT+QPOWD=1
关闭EC20模块或使其进入省电模式。
-
检查状态(可选)
AT+QMTSTAT=0
检查MQTT连接状态。
请注意:
AT+QMTOPEN
、AT+QMTCONN
、AT+QMTSUB
和AT+QMTPUB
命令中的第一个参数0
是连接的会话编号。可以根据需要调整它。- 发布的消息格式要符合MQTT协议的要求,可能需要根据具体的EC20模块固件版本调整。
- 确保你已经在模块中设置了正确的APN,并成功连接到移动网络。