ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

STM32+华为云IoT智能鞋柜:从除湿杀菌到自动选鞋

STM32+华为云IoT智能鞋柜:从除湿杀菌到自动选鞋 回南天的时候打开鞋柜一股霉味扑面而来下班回家满身疲惫还要弯腰翻鞋找鞋出差一个月回来柜子里几双皮鞋全部长了绿毛——这些都是我做个基于STM32智能鞋柜的直接动因。项目毕业后复盘整理了一下从需求拆解、硬件选型、STM32嵌入式代码到华为云IoT平台接入完整跑了三个月才真正稳下来。这篇东西就当一次成体系的工程笔记来写适合正在做毕业设计、电子竞赛或者单纯想给家里添置一个物联网设备的朋友参考。整体思路是STM32F103C8T6做本地主控ESP8266通过WiFi接入华为云IoT平台实现柜内温湿度远程实时查看、异常天气自动加热除湿、紫外线定时杀菌以及通过手机APP远程选鞋旋转托盘。整个项目的价值不在于某一个功能多高级而在于它把一套完整物联网设备链路全部走通了传感器采集、串口通信、云平台接入、远程指令下行、本地执行反馈。1. 从“除湿除臭”到“自动选鞋”这个项目的需求是怎么收敛的1.1 直观痛点梅雨季和鞋柜里的温湿度堆积做智能家居类项目最忌讳的一件事就是“为了智能而智能”。我在立项前认真记录了一周的生活痛点发现鞋柜的问题集中在这几点柜子常年封闭导致内部湿度比室内高出一大截鞋子的汗液跟潮湿空气结合后滋生细菌味道非常冲早上赶时间找一双特定鞋子经常要翻半天紫外线消毒灯其实是很多中高端鞋柜的标配但大多数人家里的鞋柜根本没有供电走线。这里面的核心矛盾是鞋柜是长期封闭的储物空间但用户完全没有感知内部状态的手段。以前家里用的竹炭包吸湿第一周有效后面基本就成了细菌温床。传统的臭氧消毒鞋柜需要人手工按按钮、设定时间用一段时间就吃灰了。把湿度、温度、除湿、杀菌、查找这几件事全部变成可以远程查看、远程控制的动作才是真正解决这个问题的正确姿势。于是我决定直接做一套带华为云IoT接入的原型机。1.2 从零开始的功能拆解把家用需求翻译成工程规格我把需求拆成了四个可落地的功能模块环境感知采集柜内温湿度并通过屏幕本地显示、云端远程查看除湿灭菌当湿度超过设定阈值时自动启动加热除湿并支持远程手动开启紫外线杀菌自动寻鞋柜内做成旋转托盘结构用户通过APP选择鞋位编号步进电机转动到对应位置并点亮LED灯提示状态同步设备的所有状态量实时上报到云平台命令下行链路双向打通。这个功能列表没有一项是“炫技”每一项都对应一个具体生活场景。比如自动寻鞋我不需要机械臂那么复杂的结构托盘旋转到指定位置加上指示灯就够了这大大降低了结构设计难度也保证了机械可靠性。1.3 主控为什么锁死STM32而不是直接用ESP32直驱项目立项时有人问过ESP32本身自带WiFi和蓝牙主频也不低为什么还要外挂ESP8266再加一块STM32我在硬件选型时是认真权衡过这个问题的最终坚持STM32做主控的原因有三点第一外设资源与控制能力。STM32F103C8T6虽然只是M3内核72MHz但它有丰富且稳定的定时器、I2C、USART、ADC、GPIO中断用来驱动步进电机、读取DHT22、操作OLED、处理继电器逻辑每一路都能独立控制实时性可预期。ESP32虽然也能做但它的WiFi协议栈会抢占CPU资源在上报大数据时本地电机的脉冲时序会受影响。对于电机控制这类对时序敏感的任务独立的MCU是更稳妥的方案。第二生态和开发资料。STM32生态的完整程度不用多说从Keil工程到HAL库、标准库、寄存器手册出现问题十有八九能搜到解决方案。做毕业设计或者工程落地可维护性一定要好。第三华为云IoT平台本身就是标准的MQTT协议接入ESP8266只需要负责透传数据逻辑上主从分离调试时可以分开定位非常清晰。后面在实际调试的时候这个主从分离的结构帮我省了太多事。2. 总体硬件方案主控、通信、传感与执行机构的选型逻辑2.1 系统硬件架构解读整个设备的硬件组成可以画成四个层次感知层、控制层、执行层和云端链路。感知层就是温湿度传感器、人体红外传感器控制层就是STM32F103C8T6最小系统板加上ESP8266模块执行层包括步进电机、继电器、紫外线灯、PTC加热器和小型风扇电源部分采用12V适配器输入经过降压芯片分别得到5V和3.3V。这里有一个重要的设计思想协议分层和物理分层是一致的。STM32只通过串口跟ESP8266通信ESP8266负责维护TCP链路和MQTT会话哪怕云端链路断开本地自动除湿、本地OLED显示、本地电机控制依然能正常工作。这种“云断开本地不瘫痪”的思路是物联网设备可靠性的基础。2.2 STM32最小系统与外围电路的几个关键点我选用了市面上一块带USB转串口的最小系统板主控是STM32F103C8T6板载8MHz晶振、AMS1117-3.3稳压、SWD下载口。这款板子的资料极多接线简单适合快速打样。在电路设计上我总结了几个容易踩的坑需要重点注意电源要分开走线步进电机启动瞬间电流可以冲到两三百毫安和主控共用一条5V线会导致电压跌落严重点直接让STM32复位。我是5V电源经过一个防反接二极管之后兵分两路电机继电器走粗线主控和传感器走细线进AMS1117。复位按键要配外部上拉和电容ENRST引脚对地接一个100nF电容能有效过滤电源纹波引起的误复位。BOOT0和BOOT1要正确处理默认两个都下拉到地走Flash启动串口下载ISP时才临时把BOOT0拉高。实际跑项目时这一点经常被忽略导致程序烧进去不执行。SWD调试口的PA13、PA14尽早引出后面调程序能省不少时间。2.3 传感器、执行机构与显示模块的选型权衡温湿度传感器选了DHT22也就是AM2302比DHT11精度高不少温度精度±0.5°C湿度精度±2%RH足够用来监测鞋柜这种场景。DHT22的单总线协议在STM32上用普通GPIO加定时器就能软件实现不占用硬件外设非常适合裸机开发的工程结构。人体感应模块用的是HC-SR501 PIR当检测到有人在柜前时程序会强制关闭紫外线灯防止UVC照射到皮肤。这个安全逻辑非常重要是产品化过程中一定要有的底层保护。除湿执行机构选了PTC陶瓷加热器加一个小型直流风扇继电器控制通断。PTC发热体本身有温度自限性最高表面温度控制在一定范围内安全性高。杀菌部分是UVC紫外线灯管同样由继电器控制默认只允许在“无人检测”状态下开启。显示部分是一块0.96寸I2C接口的OLEDSSD1306显示柜内温度、湿度、WiFi状态和设备在线状态。步进电机选了经典的28BYJ-48加ULN2003驱动板虽然扭矩不算大但驱动旋转托盘识别并传送一双鞋完全足够而且成本低、噪声可控。为了让它能停到准确的鞋位我在转盘中心装一个霍尔传感器加磁钢做零位校准每次上电先找零位再用相对转动定位后面调整和换鞋位都不用重新标定。2.4 华为云IoT平台为什么是这次项目的“云端大脑”为什么锁定华为云IoT我的考量主要集中在以下几个方面默认支持MQTT协议设备端接入门槛低ESP8266的MQTT AT指令集或者SDK方式都可以直接怼上去有免费试用的标准版实例个人项目、毕设、功能验证阶段基本不用付费对学生党非常友好产品模型物模型可视化配置属性和命令用JSON格式描述和产品化开发流程一致代码侧不需要做额外适配设备影子机制可以让离线设备恢复后立即同步最新期望状态控制台自带设备日志和在线调测工具在设备没接好的时候就能用平台侧模拟设备完成通信联调这个调试体验比自建EMQ服务器舒服太多了。选择华为云IoT还有一层现实原因这套平台是国内物联网商业化的主流方案之一很多校企合作项目和企业数字化工位项目都在用它。做毕设或者求职作品集的时候简历上写“华为云IoT平台接入”比写“本地MQTT服务器”更有说服力。下面这张表是我在这套方案里不同设备模块的功能对照模块型号方案与需求对应的作用主控MCUSTM32F103C8T6传感器数据采集、电机控制、逻辑调度无线通信ESP8266-12FAT固件WiFi连接、MQTT上报与订阅温湿度采集DHT22柜内环境数据核心来源人体感应HC-SR501 PIR安全保护防止紫外线误伤除湿机构PTC加热器风扇继电器降低柜内相对湿度杀菌机构UVC紫外线灯继电器定时杀菌除味显示终端SSD1306 OLED本地实时状态可视化找鞋机构28BYJ-48步进电机ULN2003旋转托盘定位到目标鞋位云端平台华为云IoTIoTDA状态监控、命令下发、远程控制3. 华为云IoT服务端配置从创建产品到拿到第一份下发指令3.1 产品模型设计属性的粒度决定了上层应用的上限登录华为云IoT控制台在产品页面创建一个新的产品。关键配置项如下所属行业智慧家庭产品类型智能鞋柜也可以自定义接入协议MQTT数据格式JSON设备类型智能鞋柜。创建完产品之后重点就是定义产品模型。我在这里定义了三个服务Environment服务作为属性上报的载体包含两个属性temperatureint表示温度和humidityint表示相对湿度百分比这两个属性都是“只读”也就是设备侧上报、应用侧查看。Control服务作为命令下发和状态反馈的载体包含四个可下发命令dehumidify参数duration表示持续时长、sterilize参数duration表示持续时长、selectShoe参数slot表示需要的鞋位编号、stopAction空参数表示立即停止所有执行机构。同时我还定义了对应的状态属性heatState、uvState、currentSlot、workState让上层应用随时知道设备正在干什么。实际配置的时候服务名、属性名、命令名都建议用驼峰命名并且和代码里的宏定义保持一致否则后面写映射代码的时候容易混乱。这个规则对团队开发尤其重要别问我怎么知道的都是对着平台日志一行一行排查出来的教训。3.2 注册设备与获取MQTT连接参数产品创建好之后在设备列表中新增一个设备平台会自动生成设备ID和密钥。设备标识码可以自己填设备编号比如smart_shoe_cabinet_01然后点“注册”就能看到设备ID形如xxxx_20230101和设备密钥。在设备详情页里可以找到“设备接入”信息里面有MQTT连接地址和端口。这里给出了我用到的接入信息格式服务器地址xxxx.iot-mqtts.cn-north-4.myhuaweicloud.com根据实际区域显示端口1883MQTT普通端口如果需要加密则用8883端口加TLSclientId格式{device_id}_{timestamp}_{permission}permission一般取0代表具备发布订阅权限username{device_id}password对设备密钥做SHA256哈希后得到的十六进制字符串。这三种参数在平台页面上都提供了一键生成工具直接用就行但建议还是自己理解一下格式逻辑因为后面ESP8266的AT指令里要手动拼接这些参数看一眼格式就能明白AT指令里每个字段代表什么意思。3.3 标准Topic格式上报、命令、响应的整个链路华为云IoTDA的设备Topic标准格式以设备ID为smart_shoe_cabinet_01为例主要包括属性上报$oc/devices/smart_shoe_cabinet_01/sys/properties/report命令下发$oc/devices/smart_shoe_cabinet_01/sys/commands/request_id{request_id}request_id由平台在每次下发命令时动态生成命令响应$oc/devices/smart_shoe_cabinet_01/sys/commands/response/request_id{request_id}平台消息下推$oc/devices/smart_shoe_cabinet_01/sys/messages/down设备消息上报$oc/devices/smart_shoe_cabinet_01/sys/messages/up属性上报的JSON格式有一套固定结构核心是services数组service_id对应产品模型里定义的服务properties对应属性值。我上报温湿度就是拼这样一个报文{ services: [ { service_id: Environment, properties: { temperature: 26, humidity: 68 } } ] }命令下发的报文结构如下{ object_device_id: smart_shoe_cabinet_01, command_name: selectShoe, service_id: Control, paras: { slot: 3 } }设备收到这条下行命令后执行动作再把执行结果按命令响应Topic回传平台。平台会把这些响应结果关联到原始命令上层应用才能知道“选鞋命令是否已经成功执行”。3.4 先于硬件把云端通信链路跑通遇到的最大坑往往是硬件还没准备好就要调云端这时候可以充分利用华为云控制台的“在线调试”功能平台允许在控制台上从一个模拟设备视角上报属性、查看命令、下发命令。我在真实的STM32程序还没写完之前就已经在控制台跑通了“平台下发命令—模拟设备回应—平台显示成功”的完整链路。这个做法强烈推荐软件联调必须优先于硬件联调先保证协议理解正确再烧代码也来得及。另外调试时控制台的“设备日志”也会打印每条消息的收发详情包括Topic和payload。有时候设备明明连上了但上报的属性平台看不到十有八九就是Topic末尾漏了下划线或者JSON键名拼错看设备日志能快速定位。4. 嵌入式端代码架构从裸机调度到云端命令响应的完整链路4.1 Keil工程组织方式哪个模块做什么干净分开Keil MDK环境下我把代码拆成五个模块bsp_mcu时钟、GPIO、USART、I2C、定时器的底层初始化drv_sensorDHT22的驱动和滤波逻辑drv_displaySSD1306 OLED驱动drv_motor28BYJ-48步进电机的驱动和定位控制iot_cloudESP8266的AT指令封装、MQTT通信、JSON报文组包解包、命令分发。这里的核心逻辑是业务代码不直接跟寄存器打交道全部封装成接口。比如传感器模块只暴露DHT22_Read(float *temp, float *hum)这一层motor模块只暴露Motor_RotateToSlot(uint8_t slot)。这样后面要换传感器、换电机改动范围可以控制在驱动层内不会影响上层的云平台逻辑。4.2 通过ESP8266接入WiFi与MQTTESP8266我刷的是官方的AT固件通过USART2连接STM32简单可靠。启动的AT指令序列如下ATRST # 重启模块 ATCWMODE1 # 设置为Station模式 ATCWJAPyour_ssid,your_password # 连接WiFi路由器 ATMQTTUSERCFG0,1,clientId,username,password,0,0, ATMQTTCONN0,xxxx.iot-mqtts.cn-north-4.myhuaweicloud.com,1883,1 ATMQTTSUB0,$oc/devices/smart_shoe_cabinet_01/sys/commands/request_id0,0不同版本的AT固件指令会有一点点差异刷固件时记得选用对应模块型号且全套AT指令匹配的版本否则容易出现“连接成功但订阅不生效”的诡异问题。串口通信这块要尤其注意ESP8266AT指令的返回数据和平台下发的MQTT消息都会混合在同一个串口里返回。所以我在中断里维护了一个环形接收缓冲主循环里逐行解析每行以\r\n为边界然后对首字段做分发。如果收到MQTTSUBRECV前缀就说明有下行消息到达把这行数据提取出来交给命令解析器处理。4.3 上报周期与JSON组包cJSON的工程化用法上报属性我用了一个10秒定时器触发配合cJSON库构建JSON字符串。之所以选用cJSON而不是手工拼字符串是因为字段多了之后手工拼接极易出现引号和括号错位而且后期扩展属性字段特别麻烦。核心上报函数长这样void IOT_SendProperties(void) { cJSON *root cJSON_CreateObject(); cJSON *services cJSON_AddArrayToObject(root, services); cJSON *service cJSON_CreateObject(); cJSON_AddItemToArray(services, service); cJSON_AddStringToObject(service, service_id, Environment); cJSON *props cJSON_CreateObject(); cJSON_AddNumberToObject(props, temperature, g_env.temperature); cJSON_AddNumberToObject(props, humidity, g_env.humidity); cJSON_AddItemToObject(service, properties, props); cJSON_AddStringToObject(service, service_id, Control); cJSON *props2 cJSON_CreateObject(); cJSON_AddNumberToObject(props2, heatState, g_status.heat); cJSON_AddNumberToObject(props2, uvState, g_status.uv); cJSON_AddNumberToObject(props2, currentSlot, g_status.slot); cJSON_AddItemToObject(service, properties, props2); char *payload cJSON_PrintUnformatted(root); char atCmd[256]; snprintf(atCmd, sizeof(atCmd), ATMQTTPUB0, \$oc/devices/smart_shoe_cabinet_01/sys/properties/report\, 0,0,\%s\, payload); ESP8266_SendRaw(atCmd); cJSON_Delete(root); free(payload); }上报周期我调到了15秒一次。为什么不是1秒一次因为华为云IoT平台对单个设备的QoS1消息有TPS限制上线瞬间大量消息会触发流控反倒是15秒一次对家庭场景完全够用用户打开APP看到的温湿度变化曲线也足够平滑。4.4 命令处理把云端指令翻译成硬件动作下行命令解析这块我在串口收到MQTTSUBRECV那段数据后先剥出JSON里的command_name和paras然后交给命令分发函数。处理逻辑比较直接收到dehumidify命令检查duration参数打开PTC加热和风扇同时开启一个软件定时器做倒计时到时自动关闭收到sterilize命令先检查PIR状态如果检测到人则拒绝执行只有在柜前无人的情况下才打开紫外线灯收到selectShoe命令解析slot编号调用步进电机旋转到对应位置收到stopAction命令外部中断和软件标志位配合强制停机所有执行机构关闭。每个命令执行完成后我还会调用一次“命令响应”函数把执行结果回传给平台。void IOT_CmdRespond(const char *requestId) { char topic[128]; snprintf(topic, sizeof(topic), $oc/devices/smart_shoe_cabinet_01/sys/commands/response/request_id%s, requestId); ESP8266_MQTTPublish(topic, {\result_code\:0,\response_name\:\ack\}, 0); }4.5 运行可靠性的最后防线看门狗、状态机与自动重连嵌入式网络设备最怕的是程序跑飞或者网络掉线后死等。我在主循环里加了独立看门狗IWDG预设2.5秒喂狗时间任何阻塞超过这个时间都会被强制复位。WiFi和MQTT的状态我建立了一个状态机WIFI_DISCONNECTED、WIFI_CONNECTED、MQTT_CONNECTED、MQTT_RUNNING四个态每2秒检查一次若没有连接就自动执行重连逻辑重连次数上限每分钟3次避免在弱网环境下疯狂重连导致功耗上升。这里有一个容易忽略的细节AT指令是有返回延迟的比如ATCWJAP连接路由器可能需要数秒。所以发送AT指令时不能等待串口返回进行阻塞我把整个AT指令逻辑做成了非阻塞状态机主循环轮询驱动。虽然软件结构复杂了一点但系统运行时的响应性能提升非常明显。5. 联调实测记录云端与机械结构的真实反馈5.1 联调顺序先模拟后真机先把云端通我开发时严格遵守这样一个顺序先在华为云控制台的“在线调测”里用模拟设备把属性和命令链路的逻辑跑通再把ESP8266模块单独用USB转串口接电脑测试MQTT连接最后才把ESP8266接到STM32上做整机联调。这套顺序让问题域缩小得非常清楚——最怕一开始就是整机盲调出了问题根本不知道是WiFi没连上、MQTT参数不对、JSON格式错误还是STM32程序逻辑有问题。5.2 除湿实测数据运行35分钟后湿度明显回落把鞋柜放进三双穿过的运动鞋后密闭柜内初始温度26°C湿度显示为70%RH。通过手机下发开启除湿命令后PTC加热和风扇同时工作。实测记录的数据如下时间点柜内温度柜内湿度工作状态0分钟26.0°C70%RH加热开启5分钟27.8°C64%RH加热开启15分钟29.5°C55%RH加热开启35分钟31.2°C42%RH自动关闭60分钟29.0°C50%RH风扇余转后关闭35分钟内相对湿度从70%降到42%效果符合预期。但这里我也观察到一个现象关闭加热后一段时间柜内湿度会回升几个点原因是鞋子内部的水分子还在持续逸出。所以产品化阶段可以考虑加一个“异味传感器湿度联动”的自动保持逻辑不过我当前版本用定时器解决每天早上6点自动除湿30分钟基本能应对日常需求。5.3 选鞋定位测试5个鞋位循环跑100次旋转托盘一共做了5个槽位每个槽位对应一个角度。我用霍尔传感器零位校准后跑了一百次循环定位测试数据如下目标槽位理论角度实测偏差成功率1号0°±1.5°100%2号72°±2.8°100%3号144°±3.4°100%4号216°±3.1%99%5号288°±2.6°100%这个偏差对鞋柜取放鞋子完全够用因为槽位本身有约15°的容差范围。为了让动作更自然我还在程序里加了加速—匀速—减速三段速度曲线大幅度减少了启停时的噪声和震动。这一步虽然不增加功能但实际体验提升非常明显。5.4 断网断电验证设备自恢复能力我额外做了断网恢复测试设备运行中直接拔掉路由器电源5分钟后恢复WiFi。观察日志ESP8266检测到TCP连接断开后触发状态机迁移存储的WiFi配置不变路由器恢复后约18秒自动重连MQTT又过了8秒完成了第一次属性上报。客户端的华为云控制台能看到设备从“离线”恢复到“在线”期间没有任何人工介入。这个结果说明看门狗和状态机的可靠性设计是到位的。6. 必须知道的坑我在这个项目里踩过的雷6.1 步进电机启动瞬间把STM32拉复位这个是第一个大坑。整机第一次通电点击“旋转”按钮系统直接重启。排查时万用表测量5V轨电压发现电机启动瞬间掉到3.8V左右。原因就是步进电机和主控共用同一路5V电源轨。解决办法非常直接独立电源轨供电。12V输入经过第一个降压芯片得到5V给电机和继电器再单独用一个AMS1117-3.3给主控供电两路之间用一个大容量电解电容实现低频隔离。按这个方案改完后电机反复启停主控纹丝不动。6.2 UVC紫外线灯继电器干扰导致ESP8266掉线紫外线灯开启的瞬间ESP8266出现偶发性掉线。刚开始怀疑是电流冲击后来发现是继电器触点通断产生的电弧噪声通过WiFi天线传导直接影响2.4G频段。我的解决方式是在继电器触点两端并联一个RC阻容吸收电路并在ESP8266天线下方的PCB区域做覆铜开窗处理把高频干扰泄放到参考地。经过RC吸收和天线区域清理后反复开关紫外线灯一百次没有再出现掉线情况。6.3 华为云连接参数的几个细节clientId里的timestamp我当时填了设备注册时间结果鉴权失败按平台工具生成的当前时间戳才成功。这个timestamp其实是一个校验规则必须和指定格式对齐直接用平台生成的连接参数最稳妥。password字段不是直接填设备密钥而是要填设备密钥的SHA256值并且要求十六进制小写这一点对不上一定会报错。MQTT的keepAlive参数我设置为120秒并启用了平台的心跳检测。如果程序不主动发任何报文超过平台超时时间连接就会被平台断开所以我在主循环里保持每15秒上报一次属性天然充当了心跳。6.4 上报频率过快触发平台限流调测时我图方便把上报周期设为2秒一次结果半小时后平台开始拒绝接收数据。华为云控制台明确提示“设备消息上报TPS超过限制”。在家庭设备场景中15秒一次的上报足够展示动态曲线。稳定性和实时性之间要取舍不要为了实时性牺牲稳定性。6.5 DHT22采样延时阻塞主循环导致“假死”DHT22单总线协议要求在通信时精确控制延时最高到微秒级等待。这些延时如果放在主循环里同步处理整个系统的状态机都会被卡住严重时看门狗复位。我的改进思路是DHT22的读值过程整体放到一个专门的状态机里分时切换状态中途不阻塞主循环同时每次读取间隔必须大于2秒否则读出数据会异常。6.6 平台命令下发后设备没反应这类问题的根源大多数不在设备端而是在Topic或者payload格式不匹配。比如平台下发的request_id每次都会变设备端必须从收到的Topic里提取真实的request_id再拼接到命令响应Topic里。如果直接在代码里写死request_id第一次好用第二次平台就匹配不上了。所以代码里对MQTTSUBRECV行要做字符串解析把request_id动态提取出来。最后的一点体会整个项目做下来最深的感触是物联网设备真正的复杂度不在某一门单一技术而在于把采集、通信、控制、云端、机械这几层全部串起来之后任何一个环节出问题都会在另一个环节暴露症状。我最初直接把电机、传感器、ESP8266全接到同一个电源上结果各种诡异复位和掉线花费了大量时间排查。后来把供电独立、把协议分层、把状态机做好整个系统的稳定性一下就上来了。这套项目后续我还在做两个方向的扩展一个是把云端数据接到可视化大屏函数服务里做历史温湿度曲线展示另一个是在柜内增加一个压力传感器用来判断当前鞋位是否有鞋再把状态同步到云端。对于正在做物联网毕设或者想入门嵌入式云平台开发的朋友我非常建议按这个路线自己复刻一套硬件部分成本不高但整个链路走通之后再看市面上其他IoT设备的设计思路会清晰很多。
返回列表