☰
STM32+ESP8266+MQTT:远程控制LED完整链路解析与实战
2026/10/15 17:04:11 网站建设 项目流程

半夜到家,发现客厅的灯又亮了一整天,那一瞬间的心情估计很多人都有过。不是舍不得那点电费,而是恨自己出门前怎么就少了一个顺手关灯的动作。也正是这种场景,让我动手做了标题里那套东西——基于STM32单片机、ESP8266模块、云端物联网平台的远程控制LED系统。手机APP上按一下“关灯”,指令先到云平台,云平台再通过MQTT协议推给ESP8266,ESP8266把消息从串口递给STM32,STM32判断之后把对应的GPIO拉低,灯就灭了。

这套东西看着像是电子小玩具,但它底层的链路和正经物联网产品一模一样:设备上云、Topic订阅、物模型属性设置、属性上报、掉线重连,一个都没少。把LED换成继电器,把继电器换成风扇、水泵、门锁,其实只是改几个引脚和几行逻辑的事。所以我这篇不打算只放几张跳线照片,而是把整条链路拆开,把云端的配置顺序、硬件的接线逻辑、固件里的代码思路,以及联调阶段最容易踩的坑都记录下来。适合正在做物联网课程设计、论文课题,或者想自己折腾一套智能家居控制的读者。

1. 先把传输链嚼碎:手机上的一个按钮,需要走哪几步才能点亮LED

1.1 从App到GPIO的完整数据流

很多新手第一次看到“STM32+ESP8266+物联网平台”这种组合,第一反应是:这不就是用一个WiFi模块去做网络转发吗?理论上是,但真正想调通,你需要先把数据流在脑子里画出来。

一次完整的远程开灯操作,数据会经过下面这条路径:

  • 手机APP调用云平台提供的设备服务接口,或者直接使用云平台控制台里的“在线调试”功能;
  • 云平台把控制指令封装成一个MQTT消息,推送到设备订阅的主题里;
  • ESP8266作为MQTT客户端收到这条消息,通过UART串口把原始报文原封不动地交给STM32;
  • STM32对报文的JSON主体做解析,从中取出属性字段,比如PowerState的值;
  • STM32根据值去操作GPIO,把LED点亮或熄灭;
  • 如果有需要,STM32再生成一条属性上报消息,由ESP8266发布回云平台,完成状态确认。

这条链路里有一个容易误解的地方:很多人以为ESP8266收到消息后会自己解析,然后自己控制IO口。但在“STM32+ESP8266”这个组合里,ESP8266的角色其实很单纯,它就是一个网络透传模块。接收和解析都放在STM32这边,这样主控逻辑、外设扩展、任务调度都归STM32管,ESP8266只负责连接WiFi和维持MQTT长连接。如果哪天你需要把控制的对象从LED换成带协议传感器、或者接一个OLED屏幕,不需要动网络模块,只改主控代码就行。

1.2 为什么是“STM32+ESP8266”而不是一块板子干到底

可能有人会问:ESP8266本身也有GPIO,直接用它点灯不是更简单吗?确实,如果你只是想做一个“WiFi遥控灯”,那直接用ESP8266的GPIO就够了,网上也有很多十几行代码的Demo。但如果你继续往下想一步,这个方案很快就撑不住了。

ESP8266的GPIO数量有限,而且不少引脚还有复用功能,比如启动模式引脚、Flash连接引脚,真正能自由使用的非常少。同时它的任务处理能力偏弱,一旦熟悉的任务多了,比如同时维护MQTT连接、读取按键、驱动继电器、采集温度,代码就会变得很难理清楚。而STM32在这方面的优势恰恰是ESP8266的短板:外设丰富,GPIO多,定时器、PWM、ADC、I2C都是现成的,实时控制也更稳定。

从工程角度来说,这其实是把网络功能和业务控制分开。ESP8266负责“上云”,STM32负责“干活”。这种分离让后续调试和扩展更容易,也让你在做课程设计的时候有话可讲:每个模块的角色清晰,功能边界明确,答辩时不会被问得手忙脚乱。

2. 云端准备工作的关键顺序:创建产品、添加设备、搞懂Topic与物模型

2.1 建产品、加设备、拿到三元组的先后步骤

我之前见过不少同学一上来就写代码,结果WiFi连上了,MQTT却conecct不上,问题出在哪?出在他们跳过了云端的“设备身份注册”这一步。物联网平台不是随便一个TCP连接就能接入的,它要确认“你是谁、属于哪个产品、有没有权限”。

大致的操作顺序是:登录物联网平台控制台,先创建一个“产品”。产品名可以随便取,比如“LEDController”;节点类型选“设备”;连网方式选“WiFi”;数据格式建议选“物模型”。创建完产品之后,在产品页面下添加一个设备,这个设备的DeviceName自己定义,比如led01。添加成功之后,控制台会返回三个关键参数:产品ProductKey、设备DeviceName、设备DeviceSecret,合起来叫“三元组”。

等设备创建完成,再到产品里定义物模型功能。你只需要加一个布尔类型的属性,标识符叫PowerState,读写权限勾上“可读可写”。这样云平台在调试页能看到一个开关控件,点一下就能向设备发送开灯/关灯指令。

这里有个顺序问题值得强调:我建议先创建产品、定义物模型,最后再添加设备。如果你先添加设备再改物模型属性,也不会出大问题,但你得重新在控制台里确认topic路径,容易把自己绕晕。

成功创建设备后,控制台会给出MQTT连接参数,这组参数不是简单的三元组,而是已经算好的clientId、username、password,还有接入地址。很多平台的设备详情页里有一个“MQTT连接参数”查看入口,把鼠标放上去能看到完整的连接信息。开发阶段直接用这组参数,能省掉自己算签名的步骤。

2.2 物模型属性和Topic的对应关系

物联网平台里最重要也最容易混淆的概念,就是Topic和物模型的关系。简单来说,Topic是一条消息的“邮寄地址”,物模型则是消息内容的“标准模板”。

如果你选择的是物模型通信,云平台会默认帮你创建好一组标准Topic。下行命令通常订阅这样一类主题:

/sys/{productKey}/{deviceName}/thing/service/property/set

设备侧要订阅这个Topic,才能收到云端下发的属性设置指令。而设备上报自身的状态,则需要发布到另一个主题:

/sys/{productKey}/{deviceName}/thing/event/property/post

这两个方向别记反了。我见过有人把订阅和发布搞反,结果在控制台里怎么调试设备都没反应,查了很久才发现是Topic写反。

具体对应关系可以这样理解:

方向Topic作用
下行/sys/{pk}/{dn}/thing/service/property/set云端下发属性指令,比如开灯
上行/sys/{pk}/{dn}/thing/event/property/post设备上报当前属性状态,比如已开灯
下行/sys/{pk}/{dn}/thing/service/property/get云端查询设备当前状态

当你使用物模型的标准Topic时,消息里的负载JSON格式也有默认约定。比如下发的控制消息大概长这样:

{ "method": "thing.service.property.set", "id": "123456", "params": { "PowerState": 1 }, "version": "1.0" }

平台看到这个JSON后会匹配产品里定义的物模型属性。如果你的属性叫PowerState,是一个布尔类型,那设备端解析到这个字段后,把GPIO拉高或拉低就可以了。

2.3 连接参数的获取与签名误用提醒

我调试那会儿,最头疼的就是MQTT连接参数。控制台给的一串clientId往往长得吓人,里面包含连接模式、签名方式、时间戳等信息,字段之间用竖线分隔。很多人在复制的时候不小心把竖线弄丢了,或者把英文字符输成了中文符号,结果是设备反复连接失败,报错信息又不直观。

建议所有第一次接入的读者,在控制台的“设备详情”里找到MQTT连接参数,原样复制,不要自己手动改。如果因为签名规则的问题需要在设备端重新生成,那就去研究一下平台提供的签名算法说明,把deviceSecret用HMAC算法参与签名。需要注意的是,签名参数里的时间戳是毫秒级,并且有有效期,如果板子里的RTC时间不对,或者每次上电都重新生成一次,也会导致连接被拒绝。

开发阶段还有一个常见问题:设备一直没激活。所谓“激活”其实就是设备第一次成功接入云平台。如果设备还没接入过,你在控制台看到的状态可能是“未激活”,此时在在线调试里会提示设备离线。解决办法是先跑通代码里的MQTT连接,让设备上线,再去纠结后续的控制指令。设备都还没上线,遥控指令自然找不到目标。

3. 硬件接线与供电细节:ESP8266为什么不能直接从5V取电

3.1 器件清单与引脚接线表

硬件部分我用的是一块STM32F103C8T6最小系统板,加一个ESP8266-01S模块,再配一个继电器模块或者直接用LED灯珠来验证。如果你只是验证功能,LED最省事;如果想让这套系统真的去控制家里的灯,那需要把LED换成一个5V继电器模块,再用继电器去控制交流回路。注意,继电器模块如果控制的是市电电压,必须做好隔离和绝缘,把高压区和控制板分开。

接线方面,ESP8266-01S和STM32之间需要接三根线:TXD、RXD、GND。很多人在这里想当然地“TXD对TXD”,结果串口收发完全不通。正确做法是交叉连接:ESP8266的TXD接STM32的RX引脚,ESP8266的RXD接STM32的TX引脚。

ESP8266-01S引脚STM32F103引脚说明
VCC3.3V供电,严禁接5V
GNDGND共地
TXDPA3(USART2_RX)ESP发送,STM32接收
RXDPA2(USART2_TX)STM32发送,ESP接收
CH_PD/EN3.3V使能引脚,必须拉高
GPIO0悬空或接高电平正常运行模式,不能为低

STM32这边的控制引脚我选的是PA1。如果你控制的是LED灯珠,PA1经过一个1k左右的限流电阻直接接LED负极,LED正极接3.3V。如果你用的是继电器模块,PA1接到三极管基极,或者直接接继电器模块的信号输入端,具体看模块是高电平触发还是低电平触发。

这里有一个很典型的坑:ESP8266-01S的VCC不能接5V,它最高只能承受3.6V左右。有人图省事直接从STM32开发板的5V引脚给它供电,结果模块发热、启动失败,甚至烧毁。一定要用3.3V供电,而且要注意电流余量。

3.2 供电电流与电平匹配

ESP8266在WiFi发射瞬间的电流会突然拉高,可能达到200到300mA。如果你把ESP8266直接挂在STM32最小系统板自带的那个3.3V稳压器上,平时静态工作没问题,一旦进入数据传输状态,电压就可能跌落,导致模块自动复位,看起来就是“偶尔掉线”“反复重启”。

所以我建议用外部5V适配器作为总电源,经过一块AMS1117-3.3V稳压模块给ESP8266供电。电源输入侧并联一个470uF电解电容用来扛瞬时电流,靠近ESP8266的VCC处再放一个0.1uF陶瓷电容滤高频纹波。这套做法在串口调试时几乎不会因为供电问题出现莫名重启。

串口电平方面,STM32F103的IO口是3.3V逻辑,和ESP8266是兼容的,不需要分压。但要注意,如果你用的是某些高压单片机,比如5V逻辑的型号,TXD到ESP8266 RXD之间最好加一个分压电阻网络,否则ESP8266很容易被灌坏。之前做过一次跨平台联调,我的STM32小板是3.3V,对方的板子IO输出是5V,没有做分压,第一次连接就把ESP模块烧了。所以每次接到一个新的开发板,先确认IO电压再连串口。

3.3 STM32CubeMX外设配置

代码用STM32CubeMX生成底层工程会快很多。我用的配置是:USART2作为ESP8266通信串口,波特率115200,8数据位、1停止位、无校验,开启接收中断;PA1配置为GPIO输出。这里建议不要用USART1来连接ESP8266,因为很多STM32的板子USART1默认和USB转串口芯片绑定,调试信息会混在一起。

开启接收中断之后,主循环里只需要检查状态标志位,再处理解析逻辑。接收每字节都用中断回调,这样可以避免在主循环里用阻塞式接收导致丢数据。关于串口接收还有不少细节,放到第4节详细说。

4. 固件侧的具体实现:AT指令、报文切分和JSON解析

4.1 用AT指令把ESP8266拉上线

ESP8266模块出厂时通常带AT固件,第一件事是先用USB转TTL工具单独给模块供电,打开串口助手,输入AT,如果返回OK说明模块正常。如果没反应,检查供电、使能引脚、串口的TXD/RXD是否交叉。

在我的方案里,STM32就是通过串口发送这些AT指令来控制ESP8266的。流程大致是这样:

AT+RST AT+CWMODE=1 AT+CWJAP="你的WiFi名","你的WiFi密码" AT+CIFSR

这几条命令搞定WiFi连接。AT+CWMODE=1把模块设为Station模式,就是让它作为热点客户端去连接路由器;AT+CWJAP是连接路由器;AT+CIFSR用来查询获得的IP地址,确认接入成功。

WiFi通了之后,接下来是MQTT连接。如果你的AT固件版本比较新,支持MQTT命令,可以直接操作:

AT+MQTTUSERCFG=0,0,"clientId","username","password",0,0,"" AT+MQTTCONN=0,"你的MQTT接入地址",1883,1 AT+MQTTSUB=0,"/sys/{productKey}/{deviceName}/thing/service/property/set",1

这里的clientId、username、password就来自云平台控制台给的MQTT连接参数。AT+MQTTCONN的第三个参数1表示自动重连,等设备掉线后模块自己尝试恢复。订阅成功后会返回OK,之后只要云端有消息推送,模块的串口就会收到+MQTTSUBRECV开头的内容。

如果你的AT固件不支持MQTT命令,那就用另一个思路:先通过AT+CIPSTART建立TCP连接,然后进入透传模式,由STM32自己打包MQTT报文。这样麻烦一些,但兼容性更好,也更能理解MQTT协议本身。我刚开始接触的时候就是用的透传方案,后来才切换到AT固件自带的MQTT命令,省掉了不少封包工作量。

4.2 串口接收是真正的技术活:中断、缓冲、粘包处理

硬件接好之后,大多数人会在这里翻车。现象是:STM32偶尔能收到一条消息,大多数时候收到的内容一半对一半乱,或者多条消息挤在一起。出现这种情况很正常,因为串口是字节流,不是“消息流”。云端推过来的JSON是一长串字符,模块可能在一次中断里发到部分,也可能把两条AT结果连着发过来。

我的做法是开一个环形缓冲,接收中断里只把字节放进去,主循环再按行或按完整JSON来处理。核心思路看下面这段伪代码能理解八成:

#define RX_BUF_SIZE 512 static uint8_t rxByte; static uint8_t lineBuf[RX_BUF_SIZE]; static uint16_t lineLen = 0; static volatile uint8_t lineReady = 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART2) { if (rxByte == '\n') { lineBuf[lineLen] = '\0'; lineReady = 1; lineLen = 0; } else if (lineLen < RX_BUF_SIZE - 1) { lineBuf[lineLen++] = rxByte; } HAL_UART_Receive_IT(&huart2, &rxByte, 1); } }

初始化的时候要先调用一次:

HAL_UART_Receive_IT(&huart2, &rxByte, 1);

这样每收到一个字节就会自动进入中断回调。主循环看见lineReady为1,就知道攒好了一行完整的AT输出,可以拿去做解析。千万不要在中断里做耗时的JSON解析,更不要在中断里调用HAL_Delay,否则一旦数据量上来,整个系统会变得很迟钝。

4.3 JSON解析:手动找字段还是用cJSON

云端下发的指令到达STM32后,报文一般长这样:

+MQTTSUBRECV: 0,"/sys/a1xxxx/led01/thing/service/property/set",124,{"method":"thing.service.property.set","id":"123456","params":{"PowerState":1},"version":"1.0"}

如果项目只是为了点灯,手动截取字符串就够了。我一开始就是直接找"PowerState"后面的数字,核心就两行逻辑:

char *p = strstr(lineBuf, "\"PowerState\""); if (p) { char *v = strchr(p, ':'); if (v && *(v + 1) == '1') { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); } }

这个方法简单粗暴,但一旦云端消息格式多了别的字段,或者顺序变了,手写解析就会变得不靠谱。后续我换成了cJSON库,解析起来安全很多:

cJSON *root = cJSON_Parse(lineBuf); if (root) { cJSON *params = cJSON_GetObjectItem(root, "params"); cJSON *power = cJSON_GetObjectItem(params, "PowerState"); if (power) { uint8_t state = power->valueint; HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, state ? GPIO_PIN_SET : GPIO_PIN_RESET); } cJSON_Delete(root); }

cJSON的解析结果非常直观,从根节点取params,再从params里取PowerState。对于这种嵌套不多的物联网消息,完全够用,而且不容易崩。要注意的是,cJSON_Parse解析失败会返回NULL,使用前一定要判断一下,否则空指针崩溃很难查。

4.4 状态上报与掉线重连

设备执行完开灯动作后,最好再把当前状态回传给云平台,这样云端和手机端就能显示正确的开关状态。上报的逻辑和收消息刚好相反:STM32构造一条属性上报JSON,再让ESP8266通过AT指令发布到上报主题。

static void reportPowerState(uint8_t state) { char payload[160]; snprintf(payload, sizeof(payload), "{\"method\":\"thing.event.property.post\",\"id\":\"1\"," "\"params\":{\"PowerState\":%d},\"version\":\"1.0\"}", state ? 1 : 0); char cmd[256]; snprintf(cmd, sizeof(cmd), "AT+MQTTPUB=0,\"/sys/%s/%s/thing/event/property/post\",\"%s\",1,0\r\n", PRODUCT_KEY, DEVICE_NAME, payload); uart2SendString(cmd); }

拼接字符串的时候注意转义,JSON双引号在C语言里要写成\"。AT命令里直接带上JSON可能会因为逗号和引号导致解析混乱,不同版本的AT固件表现不一样。如果发布不成功,可以把payload转成十六进制再发送,虽然麻烦一点,但在兼容性上更稳。

掉线重连是物联网设备绕不开的话题。WiFi偶尔不稳定,MQTT连接也会被云平台断开。使用AT固件的自动重连参数能解决一部分问题,但STM32这边最好也定时检查ESP8266的连接状态。简单方案是每隔30秒发送一次AT+MQTTCONN?查询,如果返回的是未连接状态,就重新执行AT+MQTTCONN并重新订阅一次Topic。

5. 联调阶段最容易翻车的五个位置:从连接失败到乱码掉线

5.1 AT没反应或者全是乱码

这个坑排在第一位,因为几乎所有第一次接线的人都会遇到。现象是STM32发送AT\r\n后完全等不到OK,或者串口助手收到一堆乱码。

排查顺序从外到内:先看ESP8266有没有独立供电,CH_PD/EN引脚有没有拉高;再看串口波特率是不是匹配,模块默认一般是115200,如果你用的是9600就收不到内容;最后看TXD/RXD是否接反。一个很管用的方法是:先用USB转TTL单独把ESP8266接到电脑上,用串口助手直接发AT指令。如果能通,说明模块没问题,问题在STM32端;如果单独也收不到,那就要怀疑模块固件损坏或供电不足。

另外模块的TXD脚在开机瞬间会有电平跳动,如果你正好用STM32的RX去接收,开机时会收到一个错误字节。这个属于正常现象,代码里要容忍首帧乱码,不要一看到非预期字符就强制复位模块。

5.2 MQTT连不上,报错也不直观

ESP8266的MQTT连接命令发出去后,模块返回的不一定是OK,有时候是ERROR,有时候是+MQTTCONN: 0后面跟错误码。很多人在这一步卡了很久。

我踩过最坑的一种情况是:clientId没复制完整。云平台给的clientId很长,里面包含竖线和签名参数,我用脚本从控制台复制时把末尾的空格带上了,设备始终被云平台拒绝。最后逐字节对比连接参数才发现问题。

还有一次是设备没有在控制台先创建好。我只是想着测测MQTT,随便填了个设备名就去连接,结果服务器直接拒绝。不要跳过云端设备注册这一步,设备和三元组必须在控制台真实存在。

遇到连接失败,最有效的定位方法是去控制台看设备日志。设备每一次的接入尝试、状态变更都会有记录,服务器返回什么错误提示也能看到。自己猜永远不会比真实日志来得快。

5.3 收不到云端下发的指令

如果设备已经上线,MQTT也订阅成功了,但在线调试发指令却没有任何反应,那就要分三段查:云端段、WiFi段、STM32解析段。

先确认设备确实是“在线”状态。如果控制台里显示离线,说明连接根本没建立起来,要么是前面MQTT连接失败,要么是掉线之后没有重连成功。再看订阅的Topic是不是和产品设备一致,很多人会把{productKey}和{deviceName}替换错,或者订阅的是“上报”Topic而不是“下发”Topic。最后看STM32串口有没有收到+MQTTSUBRECV开头的内容。如果串口收到了但LED没反应,问题就在解析代码,可以先用串口把收到的原始报文打印出来,对着报文检查字段名。

我当时的现场就是订阅Topic大小写错了,控制台一直显示设备在线,但指令就是到不了模块。排查了一个晚上,最后发现Topic里把设备名写成了LED01,而实际注册的是led01,物联网平台的Topic是区分大小写的。

5.4 控制时灵时不灵:缓存、粘包与判断时序

表现是:在线调试点十次,有两次有效,其余几次像失灵一样。这个问题大概率不在云端,而在STM32的串口接收。

最典型的原因是没有做缓冲,直接把报文塞给解析函数,报文被拆成两半,解析自然失败。另一个原因是像我在5.1里提到的,接收中断里做了比较耗时的操作,导致后续字节丢失。

解决办法是做好行缓冲和状态标志。缓冲区大小要留够,我用的512字节,因为云端下发的JSON不算长,但加上AT命令的前缀和Topic,整体可能接近200字节,如果缓冲区只开64字节,超出的内容会被截掉。另外,解析完成之后要及时清空标志位,否则下一条消息还没到,主循环就以为有数据可用。

5.5 模块反复重启、发热严重

ESP8266反复重启很大概率不是软件问题,而是供电被拉垮。你可以用万用表测模块VCC引脚,如果数据通信时电压掉到3.0V以下,那基本可以确定电源不行。解决方式就是第3节说的,外接5V适配器,经过AMS1117稳压,并加电解电容。另外一个原因是CH_PD引脚没有接好,如果它是悬空状态,模块会时不时进入异常状态。把这根引脚直接接到3.3V上,能省掉很多诡异故障。

模块发热严重,多半是长期过压或者IO口电流过大。摸一下模块外壳,如果烫手,立刻断电检查供电电压。ESP8266正常工作时有温度但不至于烫到不能碰,烫手就是基本安全出了问题。

6. 从远程控制LED到做一个远程控制系统:状态同步、扩展与安全建议

6.1 本地按钮和云端状态如何保持一致

如果你的系统只是在手机端控制,那前面的逻辑已经够用。但实际用起来,你很快会发现一个问题:设备旁边如果还有一个实体按钮,你按实体按钮把灯打开,手机APP却不知道,因为状态没有上报。

解决思路是:本地按钮触发的LED状态变化,也要走一遍“属性上报”流程。每次按键改变GPIO后,立即调用reportPowerState函数,把最新状态发给云平台。这样无论控制方是手机还是实体按钮,云端看到的都是真实状态。

更进一步,设备上电之后要主动上报一次状态,而不是等手机来问。这样手机端打开APP时,看到的就是设备当前的实际情况,避免出现“APP显示灯开着,实际灯已经关了”的尴尬。

6.2 从单路LED扩展到多路继电器和传感器

这套系统的核心代码一旦跑通,扩展其他设备非常方便。我现在把电路板上多焊了两路继电器,每路继电器对应一路负载,代码就是复制几个GPIO控制函数;每路设备都按照自己的属性标识符上报,云端物模型里也多定义几个属性即可。

如果接下来要接DHT11温湿度传感器或者DS18B20温度传感器,思路也是一样的:传感器数据由STM32读取,通过JSON上报,而不是让ESP8266去直接采集。有了这套边界清晰的架构,以后每加一个传感器,STM32端写采集逻辑,云端加属性,手机端加显示,链路都是重复的,不会产生什么惊喜和惊吓。

6.3 安全建议与后续成长方向

最后说几句安全方面的事。开发阶段把三元组直接写在代码里没问题,但如果代码要开源或者上传到代码托管平台,千万不要把真实的DeviceSecret一起传上去,否则任何人都能控制你的设备。更正规的做法是读取设备端的安全存储,或者使用平台提供的一机一密动态注册机制。

另外我建议你有时间的话,把ESP8266透传模式下的MQTT报文抓下来,自己分析一下CONNECT、SUBSCRIBE、PUBLISH的报文结构。这个动作看起来不直接提升功能,但对以后排查网络问题非常有帮助。你会在TCP层看到心跳包、ACK、重传,这些网络底层的细节,才是物联网项目里“值钱”的部分。

我做这套系统感触最深的一点,其实是调试的顺序:先让LED在本地按键下能亮,再拨通ESP8266和电脑的AT通信,然后让云端在线调试把消息推给模块,最后才把三部分串起来。任何一个中间环节都不跳过,问题就能被锁死在那个环节里。你如果也卡在某个联调点,建议回到这个顺序重新检查一遍,大部分坑都不会是玄学。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询