ESP

AT 工程:
AT 文档:/

MQTT AT 指令说明

commit: 8ebdee924 之后, ESP-AT 支持 MQTT 系列 AT 指令, 基于 AT 开发的客户可以直接参考本文下述命令, 快速使用 AT+MQTT 连接对应的 Broker.

使用 AT+MQTT 前, 请先开启 AT+MQTT 功能:
make menuconfig -> Component config -> AT -> AT MQTT command support

命令列表

  • AT+MQTTUSERCFG - 配置 MQTT 用户属性
  • AT+MQTTCONNCFG - 配置 MQTT 连接属性
  • AT+MQTTCLIENTID - 配置 MQTT 客户端 ID
  • AT+MQTTUSERNAME - 配置 MQTT 登录用户名
  • AT+MQTTPASSWORD - 配置 MQTT 登录密码
  • AT+MQTTCONN - 连接/查询 MQTT Broker
  • AT+MQTTPUB - 发布字符串消息
  • AT+MQTTPUBRAW - 发布二进制消息
  • AT+MQTTSUB - 订阅/查询主题
  • AT+MQTTUNSUB - 取消订阅主题
  • AT+MQTTCLEAN - 关闭连接, 释放资源

AT+MQTTUSERCFG - 配置 MQTT 用户属性

设置指令:

AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_ID>,<CA_ID>,<"path">

功能:
设置 MQTT 用户配置

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • scheme:
    • 1: MQTT over TCP
    • 2: MQTT over TLS(no certificate verify)
    • 3: MQTT over TLS(verify server certificate)
    • 4: MQTT over TLS(provide client certificate)
    • 5: MQTT over TLS(verify server certificate and provide client certificate)
    • 6: MQTT over WebSocket(based on TCP)
    • 7: MQTT over WebSocket Secure(based on TLS, no certificate verify)
    • 8: MQTT over WebSocket Secure(based on TLS, verify server certificate)
    • 9: MQTT over WebSocket Secure(based on TLS, provide client certificate)
    • 10: MQTT over WebSocket Secure(based on TLS, verify server certificate and provide client certificate)
  • client_id: 对应 MQTT client ID, 用于标志 client 身份, 最长 256 字节
  • username: 用于登录 MQTT brokerusername, 最长 64 字节
  • password: 用于登录 MQTT brokerpassword, 最长 64 字节
  • cert_key_ID: 证书 ID, 目前支持一套 cert 证书, 参数为 0
  • CA_ID: CA ID, 目前支持一套 CA 证书, 参数为 0
  • path: 资源路径, 最长 32 字节

AT+MQTTCLIENTID - 配置 MQTT 客户端 ID


设置指令:

AT+MQTTCLIENTID=<LinkID><"client_id">

功能:
设置 MQTT 客户端 ID, 将会覆盖 AT+MQTTUSERCFG 中 clientID 参数,
用户可通过 AT+MQTTCLIENTID 设置较长的 clientID.

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • client_id: 对应 MQTT client ID, 用于标志 client 身份, 最长 256 字节

AT+MQTTUSERNAME - 配置 MQTT 登录用户名


设置指令:

AT+MQTTUSERNAME=<LinkID><"username">

功能:
设置 MQTT 登录用户名, 将会覆盖 AT+MQTTUSERCFG 中 username 参数,
用户可通过 AT+MQTTUSERNAME 设置较长的用户名.

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • username: 对应 MQTT username, 用于登录 MQTT broker, 最长 256 字节

AT+MQTTPASSWORD - 配置 MQTT 登录密码


设置指令:

AT+MQTTPASSWORD=<LinkID><"password">

功能:
设置 MQTT 登录密码, 将会覆盖 AT+MQTTUSERCFG 中 password 参数,
用户可通过 AT+MQTTPASSWORD 设置较长的密码.

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • password: 对应 MQTT password, 用于登录 MQTT broker, 最长 256 字节

AT+MQTTCONNCFG - 配置 MQTT 连接属性


设置指令:

AT+MQTTCONNCFG=<LinkID>,<keepalive>,<disable_clean_session>,<"lwt_topic">,<"lwt_msg">,<lwt_qos>,<lwt_retain>

功能:
设置 MQTT 连接配置

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • keepalive: MQTT PING 超时时间,范围为 [60, 7200], 单位为秒. 默认 120
  • disable_clean_session: MQTT 清理会话标志, 参数为 0 或 1, 默认为 0
  • lwt_topic: 遗嘱 topic, 最长 64 字节
  • lwt_msg: 遗嘱 message, 最长 64 字节
  • lwt_qos: 遗嘱 QoS, 参数可选 0, 1, 2, 默认为 0
  • lwt_retain: 遗嘱 retain, 参数可选 0, 1, 默认为 0

AT+MQTTCONN


设置指令:

AT+MQTTCONN=<LinkID>,<"host">,<port>,<reconnect>

功能:
连接指定 MQTT broker

响应:

OK

ERROR

查询指令:

AT+MQTTCONN?

功能:
查询 AT 已连接的 MQTT broker

响应:

+MQTTCONN:<LinkID>,<state>,<scheme><"host">,<port>,<"path">,<reconnect>
OK

参数说明:

  • LinkID: 当前只支持 0
  • host: 连接 MQTT broker 域名, 最大 128 字节
  • port: 连接 MQTT broker 端口, 最大 65535
  • path: 资源路径, 最长 32 字节
  • reconnect: 是否重连 MQTT, 若设置为 1, 需要消耗较多内存资源
  • state: MQTT 当前状态, 状态说明如下:
    • 0: 连接未初始化
    • 1: 已设置 MQTTUSERCFG
    • 2: 已设置 MQTTCONNCFG
    • 3: 连接已断开
    • 4: 已建立连接
    • 5: 已连接, 但未订阅 topic
    • 6: 已连接, 已订阅过 topic
  • scheme:
    • 1: MQTT over TCP
    • 2: MQTT over TLS(no certificate verify)
    • 3: MQTT over TLS(verify server certificate)
    • 4: MQTT over TLS(provide client certificate)
    • 5: MQTT over TLS(verify server certificate and provide client certificate)
    • 6: MQTT over WebSocket(based on TCP)
    • 7: MQTT over WebSocket Secure(based on TLS, no certificate verify)
    • 8: MQTT over WebSocket Secure(based on TLS, verify server certificate)
    • 9: MQTT over WebSocket Secure(based on TLS, provide client certificate)
    • 10: MQTT over WebSocket Secure(based on TLS, verify server certificate and provide client certificate)

AT+MQTTPUB

设置指令:

AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>

功能:
LinkID上通过 topic 发布数据 data, 其中 data 为字符串消息, 若要发布二进制,请使用 AT+MQTTPUBRAW

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • topic: 发布主题, 最长 64 字节
  • data: 发布消息, data 不能包含 \0, 请确保整条 AT+MQTTPUB 不超过 AT 指令的最大长度限制
  • qos: 发布服务质量, 参数可选 0,1,2, 默认为 0
  • retain: 发布 retain

AT+MQTTPUBRAW

设置指令:

AT+MQTTPUBRAW=<LinkID>,<"topic">,<length>,<qos>,<retain>

功能:
LinkID 上通过 topic 发布数据 data, 其中 data 为二进制数据

响应:

OK
> 

ERROR

等待用户输入 length 大小数据, 之后响应如下:

+MQTTPUB:FAIL

+MQTTPUB:OK

参数说明:

  • LinkID: 当前只支持 0
  • topic: 发布主题, 最长 64 字节
  • length: 要发布消息长度, 长度受限于当前可用内存
  • qos: 发布服务质量, 参数可选 0,1,2, 默认为 0
  • retain: 发布 retain

AT port 未收到指定 length 长度的数据, 将一直等待, 在此期间接收到的数据都会当成普通数据

AT+MQTTSUB


设置指令:

AT+MQTTSUB=<LinkID>,<"topic">,<qos>

功能:
订阅指定连接的 MQTT 主题, 可重复多次订阅不同 topic

响应:

OK

ERROR

当收到对应主题订阅的 MQTT 消息时, 将按照如下格式打印消息内容

+MQTTSUBRECV:<LinkID>,<"topic">,<data_length>,data

如果订阅已订阅过的主题, 仍无条件向 MQTT broker 订阅, Log 口打印 ALREADY SUBSCRIBE


查询指令:

AT+MQTTSUB?

功能:
查询 MQTT 所有连接上已订阅的 topic

响应:

+MQTTSUB:<LinkID>,<state>,<"topic1">,<qos>
+MQTTSUB:<LinkID>,<state>,<"topic2">,<qos>
+MQTTSUB:<LinkID>,<state>,<"topic3">,<qos>
...
OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • state: MQTT 当前状态, 状态说明如下:
    • 0: 连接未初始化
    • 1: 已设置 MQTTUSERCFG
    • 2: 已设置 MQTTCONNCFG
    • 3: 连接已断开
    • 4: 已建立连接
    • 5: 已连接, 但未订阅 topic
    • 6: 已连接, 已订阅过 topic
  • topic*: 订阅过的主题
  • qos: 订阅过的 QoS

AT+MQTTUNSUB

设置指令:

AT+MQTTUNSUB=<LinkID>,<"topic">

功能:
取消订阅指定连接的 MQTT 主题, 可多次取消不同订阅 topic

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0
  • topic: 取消订阅主题, 最长 64 字节

如果取消未订阅的主题, 仍无条件向 MQTT broker 取消订阅, Log 口打印 NO UNSUBSCRIBE

AT+MQTTCLEAN

设置指令:

AT+MQTTCLEAN=<LinkID>

功能:
关闭 MQTT ClientLinkID 的连接, 并释放内部占用的资源

响应:

OK

ERROR

参数说明:

  • LinkID: 当前只支持 0

MQTT 状态码说明

用户可在 AT LOG 口(默认 UART0) 或 AT 命令口( 默认 UART1, 查看 LOG 需使能 AT+SYSLOG=1), 查看 MQTT 相关状态反馈.

AT 管脚, 接线, UART 等配置请参考 How to Set AT Port Pin

MQTT 配置交互等过程中, 若出现 ERR CODE:0x<%08x>, 请查阅如下 MQTT 状态码.

    AT_MQTT_NO_CONFIGURED,                              // 0x6001AT_MQTT_NOT_IN_CONFIGURED_STATE,                    // 0x6002AT_MQTT_UNINITIATED_OR_ALREADY_CLEAN,               // 0x6003AT_MQTT_ALREADY_CONNECTED,                          // 0x6004AT_MQTT_MALLOC_FAILED,                              // 0x6005AT_MQTT_NULL_LINK,                                  // 0x6006AT_MQTT_NULL_PARAMTER,                              // 0x6007AT_MQTT_PARAMETER_COUNTS_IS_WRONG,                  // 0x6008AT_MQTT_TLS_CONFIG_ERROR,                           // 0x6009AT_MQTT_PARAM_PREPARE_ERROR,                        // 0x600AAT_MQTT_CLIENT_START_FAILED,                        // 0x600BAT_MQTT_CLIENT_PUBLISH_FAILED,                      // 0x600CAT_MQTT_CLIENT_SUBSCRIBE_FAILED,                    // 0x600DAT_MQTT_CLIENT_UNSUBSCRIBE_FAILED,                  // 0x600EAT_MQTT_CLIENT_DISCONNECT_FAILED,                   // 0x600FAT_MQTT_LINK_ID_READ_FAILED,                        // 0x6010AT_MQTT_LINK_ID_VALUE_IS_WRONG,                     // 0x6011AT_MQTT_SCHEME_READ_FAILED,                         // 0x6012AT_MQTT_SCHEME_VALUE_IS_WRONG,                      // 0x6013AT_MQTT_CLIENT_ID_READ_FAILED,                      // 0x6014AT_MQTT_CLIENT_ID_IS_NULL,                          // 0x6015AT_MQTT_CLIENT_ID_IS_OVERLENGTH,                    // 0x6016AT_MQTT_USERNAME_READ_FAILED,                       // 0x6017AT_MQTT_USERNAME_IS_NULL,                           // 0x6018AT_MQTT_USERNAME_IS_OVERLENGTH,                     // 0x6019AT_MQTT_PASSWORD_READ_FAILED,                       // 0x601AAT_MQTT_PASSWORD_IS_NULL,                           // 0x601BAT_MQTT_PASSWORD_IS_OVERLENGTH,                     // 0x601CAT_MQTT_CERT_KEY_ID_READ_FAILED,                    // 0x601DAT_MQTT_CERT_KEY_ID_VALUE_IS_WRONG,                 // 0x601EAT_MQTT_CA_ID_READ_FAILED,                          // 0x601FAT_MQTT_CA_ID_VALUE_IS_WRONG,                       // 0x6020AT_MQTT_CA_LENGTH_ERROR,                            // 0x6021AT_MQTT_CA_READ_FAILED,                             // 0x6022AT_MQTT_CERT_LENGTH_ERROR,                          // 0x6023AT_MQTT_CERT_READ_FAILED,                           // 0x6024AT_MQTT_KEY_LENGTH_ERROR,                           // 0x6025AT_MQTT_KEY_READ_FAILED,                            // 0x6026AT_MQTT_PATH_READ_FAILED,                           // 0x6027AT_MQTT_PATH_IS_NULL,                               // 0x6028AT_MQTT_PATH_IS_OVERLENGTH,                         // 0x6029AT_MQTT_VERSION_READ_FAILED,                        // 0x602AAT_MQTT_KEEPALIVE_READ_FAILED,                      // 0x602BAT_MQTT_KEEPALIVE_IS_NULL,                          // 0x602CAT_MQTT_KEEPALIVE_VALUE_IS_WRONG,                   // 0x602DAT_MQTT_DISABLE_CLEAN_SESSION_READ_FAILED,          // 0x602EAT_MQTT_DISABLE_CLEAN_SESSION_VALUE_IS_WRONG,       // 0x602FAT_MQTT_LWT_TOPIC_READ_FAILED,                      // 0x6030AT_MQTT_LWT_TOPIC_IS_NULL,                          // 0x6031AT_MQTT_LWT_TOPIC_IS_OVERLENGTH,                    // 0x6032AT_MQTT_LWT_MSG_READ_FAILED,                        // 0x6033AT_MQTT_LWT_MSG_IS_NULL,                            // 0x6034AT_MQTT_LWT_MSG_IS_OVERLENGTH,                      // 0x6035AT_MQTT_LWT_QOS_READ_FAILED,                        // 0x6036AT_MQTT_LWT_QOS_VALUE_IS_WRONG,                     // 0x6037AT_MQTT_LWT_RETAIN_READ_FAILED,                     // 0x6038AT_MQTT_LWT_RETAIN_VALUE_IS_WRONG,                  // 0x6039AT_MQTT_HOST_READ_FAILED,                           // 0x603AAT_MQTT_HOST_IS_NULL,                               // 0x603BAT_MQTT_HOST_IS_OVERLENGTH,                         // 0x603CAT_MQTT_PORT_READ_FAILED,                           // 0x603DAT_MQTT_PORT_VALUE_IS_WRONG,                        // 0x603EAT_MQTT_RECONNECT_READ_FAILED,                      // 0x603FAT_MQTT_RECONNECT_VALUE_IS_WRONG,                   // 0x6040AT_MQTT_TOPIC_READ_FAILED,                          // 0x6041AT_MQTT_TOPIC_IS_NULL,                              // 0x6042AT_MQTT_TOPIC_IS_OVERLENGTH,                        // 0x6043AT_MQTT_DATA_READ_FAILED,                           // 0x6044AT_MQTT_DATA_IS_NULL,                               // 0x6045AT_MQTT_DATA_IS_OVERLENGTH,                         // 0x6046AT_MQTT_QOS_READ_FAILED,                            // 0x6047AT_MQTT_QOS_VALUE_IS_WRONG,                         // 0x6048AT_MQTT_RETAIN_READ_FAILED,                         // 0x6049AT_MQTT_RETAIN_VALUE_IS_WRONG,                      // 0x604AAT_MQTT_PUBLISH_LENGTH_READ_FAILED,                 // 0x604BAT_MQTT_PUBLISH_LENGTH_VALUE_IS_WRONG,              // 0x604CAT_MQTT_RECV_LENGTH_IS_WRONG,                       // 0x604DAT_MQTT_CREATE_SEMA_FAILED,                         // 0x604EAT_MQTT_CREATE_EVENT_GROUP_FAILED,                  // 0x604F

其他说明

  • AT+MQTTCONN 之外, MQTT 相关命令最长会在 10s 内返回, 例如路由已无法连接因特网, AT+MQTTPUB 将在 10s 内返回.
  • 如果 AT+MQTTCONN 是基于 TLS 连接的, 每个步骤的超时时间为 10s, 总的超时时间取决于服务器的交互步骤.
  • 一旦 MQTT 连接断开, 将打印 +MQTTDISCONNECTED:<LinkID>
  • 一旦 MQTT 连接成功, 将打印 +MQTTCONNECTED:<LinkID>,<scheme>,<"host">,port,<"path">,<reconnect>

测试命令一: MQTT over TCP (需要本地创建 MQTT Broker)

使用 MQTT over TCP 连接 MQTT broker, 假设 MQTT broker IP 为 192.168.31.113, 端口为 1883, 则订阅和发布 topic 参考步骤如下:

AT+MQTTUSERCFG=0,1,"ESP32","espressif","1234567890",0,0,""
AT+MQTTCONN=0,"192.168.31.113",1883,0
AT+MQTTSUB=0,"topic",1
AT+MQTTPUB=0,"topic","test",1,0
AT+MQTTCLEAN=0

测试命令二: MQTT over TLS (需要本地创建 MQTT Broker)

使用 MQTT over TLS 连接 MQTT broker, 假设 MQTT broker IP 为 192.168.31.113, 端口为 1883, 则订阅和发布 topic 参考步骤如下:

AT+CIPSNTPCFG=1,8,"ntp1.aliyun"
AT+CIPSNTPTIME?
AT+MQTTUSERCFG=0,3,"ESP32","espressif","1234567890",0,0,""
AT+MQTTCONNCFG=0,0,0,"lwtt","lwtm",0,0
AT+MQTTCONN=0,"192.168.31.113",1883,0
AT+MQTTSUB=0,"topic",1
AT+MQTTPUB=0,"topic","test",1,0
AT+MQTTCLEAN=0

测试命令三: MQTT over WSS

使用 MQTT over WSS 连接 MQTT broker: iot.eclipse(当前 iot.eclipse 开放测试端口为 443),则订阅和发布 topic 参考步骤如下:

AT+CIPSNTPCFG=1,8,"ntp1.aliyun"
AT+CIPSNTPTIME?
AT+MQTTUSERCFG=0,7,"ESP32","espressif","1234567890",0,0,"wss"
AT+MQTTCONN=0,"iot.eclipse",443,0
AT+MQTTSUB=0,"topic",1
AT+MQTTPUB=0,"topic","test",1,0
AT+MQTTCLEAN=0