目录一、固件下载与烧录二、AT指令测试部分用到的AT指令测试流程三、遇到的问题1.订阅了数据响应主题数据上报后却没有收到云平台的响应2.统计发送长度需要23.长时间不通信后的断连问题⭐️一、固件下载与烧录安信可官网资料docs.ai-thinker.com/esp8266/index.htmlhttps://docs.ai-thinker.com/esp8266/index.html乐鑫科技官网资料ESP-AT 用户指南 乐鑫科技文档https://documentation.espressif.com/projects/esp-at/zh_CN/latest/Get_Started/index.html?titleESP-AT%20%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97如果使用的ESP8266不支持MQTT协议则需要下载支持MQTT协议的固件并烧录进ESP8266想要让ESP8266进入下载模式除正常串口接线外有以下注意点ESP8266的IO0引脚需要接低电平进入下载模式若使用ESP8266-01EN引脚需要接高电平使能芯片工作二、AT指令测试乐鑫科技官网资料基础 AT 命令 — ESP-AT 用户指南 文档https://docs.espressif.com/projects/esp-at/zh-cn/release-v2.2.0.0_esp8266/AT_Command_Set/Basic_AT_Commands.html如果发现使用串口助手发送at指令没有收到回复可进行如下检查使用稳定的电源模块对ESP8266进行供电串口模块需要与ESP8266共地若使用ESP8266-01EN引脚需要接高电平使能芯片工作部分用到的AT指令基础指令AT测试 AT 启动ATE开启或关闭 AT 回显功能ATRST重启模块ATRESTORE恢复出厂设置ATGMR查看版本信息ATCMD?查询当前固件支持的所有命令及命令类型WIFI指令ATCWMODE设置 Wi-Fi 模式1为连接路由器模式ATCWJAP连接 AP即连接路由器站点MQTT指令ATMQTTCLEAN断开 MQTT 连接ATMQTTUSERCFG设置 MQTT 用户属性ATMQTTCONN连接 MQTT BrokerMQTT 代理服务器ATMQTTSUB订阅 MQTT TopicATMQTTPUB发布 MQTT 消息消息长度略短以字符串发送ATMQTTPUBRAW发布 MQTT 消息消息长度略短以二进制发送测试流程将ESP8266设为连接WIFI模式ATCWMODE1连接WIFIATCWJAPYANG,12345678设置 MQTT 用户属性/************************************* 指令与参数说明 *************************************/ ATMQTTUSERCFGLinkID,scheme,client_id,username,password,cert_key_ID,CA_ID,path LinkID当前仅支持 link ID 0。 scheme由于 ESP8266 内存限制不支持 MQTT over TLS即 scheme 只能取 1 或 6。 1: MQTT over TCP 2: MQTT over TLS不校验证书 3: MQTT over TLS校验 server 证书 4: MQTT over TLS提供 client 证书 5: MQTT over TLS校验 server 证书并且提供 client 证书 6: MQTT over WebSocket基于 TCP 7: MQTT over WebSocket Secure基于 TLS不校验证书 8: MQTT over WebSocket Secure基于 TLS校验 server 证书 9: MQTT over WebSocket Secure基于 TLS提供 client 证书 10: MQTT over WebSocket Secure基于 TLS校验 server 证书并且提供 client 证书。 client_idMQTT 客户端 ID最大长度256 字节。 username用户名用于登陆 MQTT broker最大长度64 字节。 password密码用于登陆 MQTT broker最大长度64 字节。 cert_key_ID证书 ID目前 ESP-AT 仅支持一套 cert 证书参数为 0。 CA_IDCA ID目前 ESP-AT 仅支持一套 CA 证书参数为 0。 path资源路径最大长度32 字节。 /************************************* 使用示例 *************************************/ ATMQTTUSERCFG0,1,设备ID,产品ID,之前生成的Token,0,0,连接 MQTT BrokerMQTT 代理服务器/************************************* 指令与参数说明 *************************************/ ATMQTTCONNLinkID,host,port,reconnect LinkID当前仅支持 link ID 0。 hostMQTT broker 域名最大长度128 字节。 portMQTT broker 端口最大端口65535。 reconnect 0: MQTT 不自动重连 1: MQTT 自动重连会消耗较多的内存资源。 /************************************* 使用示例 *************************************/ ATMQTTCONN0,mqtts.heclouds.com,1883,1订阅需要的主题/************************************* 指令与参数说明 *************************************/ ATMQTTSUBLinkID,topic,qos LinkID当前仅支持 link ID 0。 topic订阅的 topic。 qos订阅的 QoS。 /************************************* 使用示例 *************************************/ ATMQTTSUB0,$sys/{pid}/{device-name}/thing/property/post/reply,0 //订阅云平台接收数据响应主题 ATMQTTSUB0,$sys/{pid}/{device-name}/thing/property/set,0 //订阅云平台下发数据主题发布主题以MQTTPUBRAW指令为例与发布内容/************************************* 指令与参数说明 *************************************/ ATMQTTPUBRAWLinkID,topic,length,qos,retain LinkID当前仅支持 link ID 0。 topicMQTT topic最大长度128 字节。 lengthMQTT 消息长度不同 ESP 设备的最大长度不同 对于 ESP32 设备最大长度受到可利用内存的限制 对于 ESP8266 设备最大长度受到可利用内存和 MQTT_BUFFER_SIZE_BYTE 宏的限制。该宏的默认值为 512可在 build.py menuconfig 中设置它的值以此更改对最大长度的限制。该宏的值 消息的最大长度 MQTT 报头长度取决于 topic 名称的长度。 qos发布消息的 QoS参数可选 0、1、或 2默认值0。 retain发布 retain。 /************************************* 使用示例 *************************************/ ATMQTTPUBRAW0,$sys/{pid}/{device-name}/thing/property/post,xx(要发送的字符串长度2因为有回车符和换行符),0,0 //发布数据上报主题 ATMQTTPUBRAW0,$sys/{pid}/{device-name}/thing/property/set_reply,xx(要发送的字符串长度2因为有回车符和换行符),0,0 //发布数据下发响应主题先使用发布主题指令后ESP8266将进入透传模式此时再进行数据传输 每一次数据上报前都需要使用发布主题指令使ESP8266进入透传模式 /* 上报数据 */ {id:123,params:{co_sensor_value:{value:888},error_state:{value:1}}} /* 响应id要与云平台下发时的id保持一致 */ {id:7,code:200,msg:xxxx}三、遇到的问题1.订阅了数据响应主题数据上报后却没有收到云平台的响应原因没有正确订阅主题解决方法确保订阅的主题正确2.统计发送长度需要2使用字符串统计工具获得需要发送的json格式的字符串长度之后需要2因为每条信息后都要有回车符和换行符3.长时间不通信后的断连问题⭐️问题描述当我一段时间没有发送任何指令时串口助手上出现“MQTTDISCONNECTED:0”信息此时上报数据出现“ERROR”尝试重新连接云平台和MQTT服务地址也会出现“ERROR”信息只有将esp8266复位后才能重新连接云平台和MQTT服务地址。原因MQTT “保活”机制与平台断连为了防止资源浪费MQTT服务器会要求客户端在空闲时发送“心跳包”来维持连接。如果长时间没有通信服务器就会判定设备离线并主动切断链路。收到的MQTTDISCONNECTED:0信息正是ESP8266模块检测到连接已被切断后给出的通知。连接断开后的状态虽然MQTT连接断了但ESP8266模块内部维护这个连接的数据结构会话信息以及底层用于网络通信的TCP连接可能还在并没有被系统及时回收。此时模块处于一个“半残留”状态它认为之前的连接还存在所以当你尝试建立新连接时就会发生冲突。AT指令重连失败的原因绝大多数AT指令集在设计上都不支持在原有连接未彻底关闭时直接建立新连接。因此当你再次输入ATMQTTCONN指令模块内部的协议栈检测到状态冲突就会拒绝执行并返回ERROR。解决方法方案一手动清除连接状态推荐这是官方文档推荐的也是最可靠的方法。在你打算重连之前先发送ATMQTTCLEAN0指令它会强制模块清理内部残留的MQTT会话信息。清理干净后再重新执行ATMQTTCONN等一系列指令来完成连接。方案二利用自动重连功能在建立MQTT连接时设置自动重连。将ATMQTTCONN指令的最后一个参数设为1如果最后一个参数为1ATMQTTCONN...,1通常会开启模块的“自动重连”功能。当连接因网络问题意外断开时设备会尝试在后台自动恢复连接无需干预。如果最后一个参数为0或未指定ATMQTTCONN...,0则关闭自动重连。一旦断开必须使用ATMQTTCLEAN手动清理并重连或者复位模块。方案三调整保活时间如果你的应用场景允许设备频繁地与服务器通信可以尝试缩短心跳间隔。在腾讯云保活时间通常在30到1200秒之间。你可以登录腾讯云物联网控制台检查一下设备的具体保活配置。如果设备意外断开适当缩短这个时间能让平台更快检测到但这并不能解决你遇到的重连报错问题。补充问题都是执行一条AT指令执行ATMQTTCLEAN后也需要重新执行MQTT的初始化指令为什么不选择执行ATRST指令特性ATRST(软件复位)ATMQTTCLEAN0(清理MQTT会话)影响范围全局复位重启整个芯片所有状态丢失Wi-Fi连接、TCP连接、MQTT会话、GPIO状态等。局部清理仅清理MQTT协议层的会话信息不影响Wi-Fi连接和底层网络。恢复过程重且慢1. 模块重启约几百毫秒2. 重新连接Wi-Fi数秒3. 重新配置MQTT参数4. 重新连接MQTT服务器轻且快1. 发送ATMQTTCLEAN0(瞬间完成)2. 重新配置MQTT参数可选若之前已配好可省略3. 重新连接MQTT服务器对Wi-Fi的影响会断开Wi-Fi需要重新执行ATCWJAP连接热点。不会断开Wi-Fi前提是Wi-Fi本身正常节省了重新扫描、认证、获取IP的时间。适用场景- 模块出现严重异常如无响应、看门狗复位- Wi-Fi本身也断开了- 你希望彻底重置所有状态。-仅MQTT连接断开但Wi-Fi仍正常常见于心跳超时- 追求快速重连减少设备离线时间- 希望保留其他网络连接如TCP socket。优先尝试MQTT自动重连ATMQTTCONN最后一个参数设为1如果不行则使用ATMQTTCLEAN后手动重连最后才考虑ATRST
【物联网】使用ESP8266与云平台通信
目录一、固件下载与烧录二、AT指令测试部分用到的AT指令测试流程三、遇到的问题1.订阅了数据响应主题数据上报后却没有收到云平台的响应2.统计发送长度需要23.长时间不通信后的断连问题⭐️一、固件下载与烧录安信可官网资料docs.ai-thinker.com/esp8266/index.htmlhttps://docs.ai-thinker.com/esp8266/index.html乐鑫科技官网资料ESP-AT 用户指南 乐鑫科技文档https://documentation.espressif.com/projects/esp-at/zh_CN/latest/Get_Started/index.html?titleESP-AT%20%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97如果使用的ESP8266不支持MQTT协议则需要下载支持MQTT协议的固件并烧录进ESP8266想要让ESP8266进入下载模式除正常串口接线外有以下注意点ESP8266的IO0引脚需要接低电平进入下载模式若使用ESP8266-01EN引脚需要接高电平使能芯片工作二、AT指令测试乐鑫科技官网资料基础 AT 命令 — ESP-AT 用户指南 文档https://docs.espressif.com/projects/esp-at/zh-cn/release-v2.2.0.0_esp8266/AT_Command_Set/Basic_AT_Commands.html如果发现使用串口助手发送at指令没有收到回复可进行如下检查使用稳定的电源模块对ESP8266进行供电串口模块需要与ESP8266共地若使用ESP8266-01EN引脚需要接高电平使能芯片工作部分用到的AT指令基础指令AT测试 AT 启动ATE开启或关闭 AT 回显功能ATRST重启模块ATRESTORE恢复出厂设置ATGMR查看版本信息ATCMD?查询当前固件支持的所有命令及命令类型WIFI指令ATCWMODE设置 Wi-Fi 模式1为连接路由器模式ATCWJAP连接 AP即连接路由器站点MQTT指令ATMQTTCLEAN断开 MQTT 连接ATMQTTUSERCFG设置 MQTT 用户属性ATMQTTCONN连接 MQTT BrokerMQTT 代理服务器ATMQTTSUB订阅 MQTT TopicATMQTTPUB发布 MQTT 消息消息长度略短以字符串发送ATMQTTPUBRAW发布 MQTT 消息消息长度略短以二进制发送测试流程将ESP8266设为连接WIFI模式ATCWMODE1连接WIFIATCWJAPYANG,12345678设置 MQTT 用户属性/************************************* 指令与参数说明 *************************************/ ATMQTTUSERCFGLinkID,scheme,client_id,username,password,cert_key_ID,CA_ID,path LinkID当前仅支持 link ID 0。 scheme由于 ESP8266 内存限制不支持 MQTT over TLS即 scheme 只能取 1 或 6。 1: MQTT over TCP 2: MQTT over TLS不校验证书 3: MQTT over TLS校验 server 证书 4: MQTT over TLS提供 client 证书 5: MQTT over TLS校验 server 证书并且提供 client 证书 6: MQTT over WebSocket基于 TCP 7: MQTT over WebSocket Secure基于 TLS不校验证书 8: MQTT over WebSocket Secure基于 TLS校验 server 证书 9: MQTT over WebSocket Secure基于 TLS提供 client 证书 10: MQTT over WebSocket Secure基于 TLS校验 server 证书并且提供 client 证书。 client_idMQTT 客户端 ID最大长度256 字节。 username用户名用于登陆 MQTT broker最大长度64 字节。 password密码用于登陆 MQTT broker最大长度64 字节。 cert_key_ID证书 ID目前 ESP-AT 仅支持一套 cert 证书参数为 0。 CA_IDCA ID目前 ESP-AT 仅支持一套 CA 证书参数为 0。 path资源路径最大长度32 字节。 /************************************* 使用示例 *************************************/ ATMQTTUSERCFG0,1,设备ID,产品ID,之前生成的Token,0,0,连接 MQTT BrokerMQTT 代理服务器/************************************* 指令与参数说明 *************************************/ ATMQTTCONNLinkID,host,port,reconnect LinkID当前仅支持 link ID 0。 hostMQTT broker 域名最大长度128 字节。 portMQTT broker 端口最大端口65535。 reconnect 0: MQTT 不自动重连 1: MQTT 自动重连会消耗较多的内存资源。 /************************************* 使用示例 *************************************/ ATMQTTCONN0,mqtts.heclouds.com,1883,1订阅需要的主题/************************************* 指令与参数说明 *************************************/ ATMQTTSUBLinkID,topic,qos LinkID当前仅支持 link ID 0。 topic订阅的 topic。 qos订阅的 QoS。 /************************************* 使用示例 *************************************/ ATMQTTSUB0,$sys/{pid}/{device-name}/thing/property/post/reply,0 //订阅云平台接收数据响应主题 ATMQTTSUB0,$sys/{pid}/{device-name}/thing/property/set,0 //订阅云平台下发数据主题发布主题以MQTTPUBRAW指令为例与发布内容/************************************* 指令与参数说明 *************************************/ ATMQTTPUBRAWLinkID,topic,length,qos,retain LinkID当前仅支持 link ID 0。 topicMQTT topic最大长度128 字节。 lengthMQTT 消息长度不同 ESP 设备的最大长度不同 对于 ESP32 设备最大长度受到可利用内存的限制 对于 ESP8266 设备最大长度受到可利用内存和 MQTT_BUFFER_SIZE_BYTE 宏的限制。该宏的默认值为 512可在 build.py menuconfig 中设置它的值以此更改对最大长度的限制。该宏的值 消息的最大长度 MQTT 报头长度取决于 topic 名称的长度。 qos发布消息的 QoS参数可选 0、1、或 2默认值0。 retain发布 retain。 /************************************* 使用示例 *************************************/ ATMQTTPUBRAW0,$sys/{pid}/{device-name}/thing/property/post,xx(要发送的字符串长度2因为有回车符和换行符),0,0 //发布数据上报主题 ATMQTTPUBRAW0,$sys/{pid}/{device-name}/thing/property/set_reply,xx(要发送的字符串长度2因为有回车符和换行符),0,0 //发布数据下发响应主题先使用发布主题指令后ESP8266将进入透传模式此时再进行数据传输 每一次数据上报前都需要使用发布主题指令使ESP8266进入透传模式 /* 上报数据 */ {id:123,params:{co_sensor_value:{value:888},error_state:{value:1}}} /* 响应id要与云平台下发时的id保持一致 */ {id:7,code:200,msg:xxxx}三、遇到的问题1.订阅了数据响应主题数据上报后却没有收到云平台的响应原因没有正确订阅主题解决方法确保订阅的主题正确2.统计发送长度需要2使用字符串统计工具获得需要发送的json格式的字符串长度之后需要2因为每条信息后都要有回车符和换行符3.长时间不通信后的断连问题⭐️问题描述当我一段时间没有发送任何指令时串口助手上出现“MQTTDISCONNECTED:0”信息此时上报数据出现“ERROR”尝试重新连接云平台和MQTT服务地址也会出现“ERROR”信息只有将esp8266复位后才能重新连接云平台和MQTT服务地址。原因MQTT “保活”机制与平台断连为了防止资源浪费MQTT服务器会要求客户端在空闲时发送“心跳包”来维持连接。如果长时间没有通信服务器就会判定设备离线并主动切断链路。收到的MQTTDISCONNECTED:0信息正是ESP8266模块检测到连接已被切断后给出的通知。连接断开后的状态虽然MQTT连接断了但ESP8266模块内部维护这个连接的数据结构会话信息以及底层用于网络通信的TCP连接可能还在并没有被系统及时回收。此时模块处于一个“半残留”状态它认为之前的连接还存在所以当你尝试建立新连接时就会发生冲突。AT指令重连失败的原因绝大多数AT指令集在设计上都不支持在原有连接未彻底关闭时直接建立新连接。因此当你再次输入ATMQTTCONN指令模块内部的协议栈检测到状态冲突就会拒绝执行并返回ERROR。解决方法方案一手动清除连接状态推荐这是官方文档推荐的也是最可靠的方法。在你打算重连之前先发送ATMQTTCLEAN0指令它会强制模块清理内部残留的MQTT会话信息。清理干净后再重新执行ATMQTTCONN等一系列指令来完成连接。方案二利用自动重连功能在建立MQTT连接时设置自动重连。将ATMQTTCONN指令的最后一个参数设为1如果最后一个参数为1ATMQTTCONN...,1通常会开启模块的“自动重连”功能。当连接因网络问题意外断开时设备会尝试在后台自动恢复连接无需干预。如果最后一个参数为0或未指定ATMQTTCONN...,0则关闭自动重连。一旦断开必须使用ATMQTTCLEAN手动清理并重连或者复位模块。方案三调整保活时间如果你的应用场景允许设备频繁地与服务器通信可以尝试缩短心跳间隔。在腾讯云保活时间通常在30到1200秒之间。你可以登录腾讯云物联网控制台检查一下设备的具体保活配置。如果设备意外断开适当缩短这个时间能让平台更快检测到但这并不能解决你遇到的重连报错问题。补充问题都是执行一条AT指令执行ATMQTTCLEAN后也需要重新执行MQTT的初始化指令为什么不选择执行ATRST指令特性ATRST(软件复位)ATMQTTCLEAN0(清理MQTT会话)影响范围全局复位重启整个芯片所有状态丢失Wi-Fi连接、TCP连接、MQTT会话、GPIO状态等。局部清理仅清理MQTT协议层的会话信息不影响Wi-Fi连接和底层网络。恢复过程重且慢1. 模块重启约几百毫秒2. 重新连接Wi-Fi数秒3. 重新配置MQTT参数4. 重新连接MQTT服务器轻且快1. 发送ATMQTTCLEAN0(瞬间完成)2. 重新配置MQTT参数可选若之前已配好可省略3. 重新连接MQTT服务器对Wi-Fi的影响会断开Wi-Fi需要重新执行ATCWJAP连接热点。不会断开Wi-Fi前提是Wi-Fi本身正常节省了重新扫描、认证、获取IP的时间。适用场景- 模块出现严重异常如无响应、看门狗复位- Wi-Fi本身也断开了- 你希望彻底重置所有状态。-仅MQTT连接断开但Wi-Fi仍正常常见于心跳超时- 追求快速重连减少设备离线时间- 希望保留其他网络连接如TCP socket。优先尝试MQTT自动重连ATMQTTCONN最后一个参数设为1如果不行则使用ATMQTTCLEAN后手动重连最后才考虑ATRST