从零MQTT远程协议
MQTT 协议
14种报文
报文剩余长度
八进制最高计数256,舍弃最高位时最高计数128 如果数大于128 则最高位置1,保存余数, 并在下一个八进制数保存进了多少位,以此类推
连接报文
10 78
00 04 4D 51 54 54 04 C2 00 78
ProductKey:k1nxjv7zhTE
DeviceName:ESP8266
DeviceSecret:0506f97302b36030c0cf856d23802357
mqttclientId=12345|securemode=3,signmethod=hmacsha1|
ESP8266|securemode=3,signmethod=hmacsha1|
00 29 45 53 50 38 32 36 36 7c 73 65 63 75 72 65 6d 6f 64 65 3d 33 2c 73 69 67 6e 6d 65 74 68 6f 64 3d 68 6d 61 63 73 68 61 31 7c
mqttUsername: deviceName+"&"+productKey
ESP8266&k1nxjv7zhTE
00 13 45 53 50 38 32 36 36 26 6b 31 6e 78 6a 76 37 7a 68 54 45
mqttPassword: sign_hmac(deviceSecret,content)
9abc531e18808724d48ca617b44ece9607975125
00 28 39 61 62 63 35 33 31 65 31 38 38 30 38 37 32 34 64 34 38 63 61 36 31 37 62 34 34 65 63 65 39 36 30 37 39 37 35 31 32 35
AT+CIPMODE=1
AT+CIPSTART="TCP","k1nxjv7zhTE.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883
AT+CIPSEND
最终报文
k1nxjv7zhTE.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883
10 74 00 04 4d 51 54 54 04 c2 00 3c 00 29 45 53 50 38 32 36 36 7c 73 65 63 75 72 65 6d 6f 64 65 3d 33 2c 73 69 67 6e 6d 65 74 68 6f 64 3d 68 6d 61 63 73 68 61 31 7c 00 13 45 53 50 38 32 36 36 26 6b 31 6e 78 6a 76 37 7a 68 54 45 00 28 39 61 62 63 35 33 31 65 31 38 38 30 38 37 32 34 64 34 38 63 61 36 31 37 62 34 34 65 63 65 39 36 30 37 39 37 35 31 32 35
回复
'20 02 00 00' 链接成功
ping
C0 00 回复DO OO 保活
订阅主题报文
固定报头 82 38 ————107个字节 6B
可变报头 00 01 代表此次报文编号,服务器根据此回应报文
订阅链接 /sys/k1nxjv7zhTE/ESP8266/thing/service/property/set
00 33 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
服务等级 00 阿里云统一00
整体报文
82 38 00 01 00 33 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00
回复报文
90 03 00 01 01
90 03 为固定回复报头 00 01 为回复的报文编号 01 为确认
取消订阅
固定报头 A2 37 ————
编号 00 02
取消订阅链接 /sys/k1nxjv7zhTE/ESP8266/thing/service/property/set
00 33 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
最终报文 (比订阅时少个00)
A2 37 00 02 00 33 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
回复字节 (只会收到回复报文,没有结果
B0 02 00 02
发布报文 QoS0
固定报头 30 52
可变报头 /sys/k1nxjv7zhTE/ESP8266/thing/event/property/post
00 32 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74
报文标识符 QoS0等级不需要
负载 josn 负载不需要添加长度字节
{"params":{"PowerSwitch_1":1}}
7B 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 5F 31 22 3A 31 7D 7D
最终报文
30 52 00 32 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 7B 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 5F 31 22 3A 31 7D 7D
QoS等级0 无回复
发布报文 QoS1
固定报头 32 54
可变报头 /sys/k1nxjv7zhTE/ESP8266/thing/event/property/post
00 32 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74
报文标识符 QoS1
00 01
负载 josn 负载不需要添加长度字节
{"params":{"PowerSwitch_1":1}}
7B 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 5F 31 22 3A 31 7D 7D
最终报文
32 54 00 32 2F 73 79 73 2F 6B 31 6E 78 6A 76 37 7A 68 54 45 2F 45 53 50 38 32 36 36 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 00 01 7B 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 5F 31 22 3A 31 7D 7D
ESP8266
// 设置连接模式
AT+CWMODE=3
// 设置WIFI连接
AT+CWJAP="FFISHER","12345678"
//设置MQTT属性
AT+MQTTUSERCFG=0,1,"NULL","ESP8266&k1nxjv7zhTE","C50A9BC9AD98613107AC0797C6205FB65F45134B",0,0,""
//设置MQTT ID,注意!!要在ID信息每一个”,“前加”\“进行转义!!!
AT+MQTTCLIENTID=0,"110022|securemode=3\,signmethod=hmacsha1\,timestamp=112200|"
AT+MQTTCONN=0,"k1nxjv7zhTE.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
//设置属性
AT+MQTTPUB=0,"/sys/k1nxjv7zhTE/ESP8266/thing/event/property/post","{\"params\":{\"PowerSwitch_1\":0}}",1,0
// 订阅
AT+MQTTSUB=0,"/k1nxjv7zhTE/ESP8266/user/get",1
QT
void setHost(const QHostAddress& host);
设置 MQTT 服务器地址。- 参数:
host
是一个QHostAddress
对象(可以是 IP 地址或主机名)。
- 参数:
void setPort(const quint16 port);
设置 MQTT 服务器的 端口号(通常是 1883 或 8883(SSL))。- 参数:
port
是一个 16 位无符号整数。
- 参数:
void setClientId(const QString& clientId);
设置客户端 ID。- 参数:
clientId
是客户端连接到 MQTT 服务器的唯一标识符。
- 参数:
void setUsername(const QString& username);
设置 MQTT 连接的 用户名(如果需要身份验证)。void setPassword(const QString& password);
设置 MQTT 连接的 密码(如果需要身份验证)。void setKeepAlive(const int keepAlive);
设置 MQTT 的 心跳间隔时间(秒)。- 服务器会根据这个时间确定客户端是否保持活跃。如果客户端在该时间内没有发送任何数据,服务器可能会断开连接。
void setCleanSession(const bool cleansess);
设置 清除会话标志。- 当为
true
时,每次连接都会清除之前的订阅信息。 - 当为
false
时,重新连接时保留之前的会话状态。
- 当为
void setAutoReconnect(const bool value);
设置是否自动重连到 MQTT 服务器。void setAutoReconnectInterval(const int autoReconnectInterval);
设置 自动重连的间隔时间(毫秒)。void setWillTopic(const QString& willTopic);
设置 遗嘱消息主题(Last Will and Testament, LWT)。- 遗嘱消息是在客户端意外断开连接时,服务器自动向其他订阅者发布的消息。
void setWillQos(const quint8 willQos);
设置遗嘱消息的 QoS(服务质量)级别(0、1 或 2)。void setWillRetain(const bool willRetain);
设置 遗嘱消息是否保留。- 如果为
true
,服务器会保存该消息,并在新的订阅者连接时立即发送给他们。
- 如果为
void setWillMessage(const QString& willMessage);
设置遗嘱消息的 内容。
连接和断开服务器
void connectToHost();
尝试连接到配置好的 MQTT 服务器。void disconnectFromHost();
从 MQTT 服务器断开连接。
订阅与取消订阅主题
quint16 subscribe(const QString& topic, const quint8 qos);
订阅一个 主题,并设置 QoS 等级。- 参数:
topic
:主题名称(字符串)。qos
:服务质量(0、1 或 2)。
- 返回值:
quint16
表示该订阅请求的消息 ID。
- 参数:
void unsubscribe(const QString& topic);
取消订阅一个主题。
发布消息
-
quint16 publish(const Message& message);
发布一条
消息
到指定主题。
- 参数:
message
是一个自定义的QMQTT::Message
对象,包含主题、消息内容、QoS 等信息。 - 返回值:消息 ID(用于追踪这条消息)。
- 参数:
事件回调(信号槽机制)
void connected();
当客户端成功连接到服务器时触发。void disconnected();
当客户端与服务器断开连接时触发。void error(const QMQTT::ClientError error);
当客户端遇到错误时触发。- 参数:
error
是一个枚举类型,描述具体的错误类型。
- 参数:
void subscribed(const QString& topic, const quint8 qos);
当某个主题成功订阅时触发。void unsubscribed(const QString& topic);
当某个主题成功取消订阅时触发。void published(const quint16 msgid, const quint8 qos);
当一条消息成功发布时触发。- 参数:
msgid
是发布消息的 ID,qos
是消息的服务质量等级。
- 参数:
void pingresp();
当接收到服务器的 心跳响应(PINGRESP) 时触发。void received(const QMQTT::Message& message);
当客户端收到来自服务器的 消息 时触发。- 参数:
message
是一个QMQTT::Message
对象,包含消息的主题、内容等信息。
- 参数: