ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32+ESP8266物联网实战:从硬件到APP的远程温湿度监控系统开发

STM32+ESP8266物联网实战:从硬件到APP的远程温湿度监控系统开发 简介本资源是一套面向嵌入式物联网开发初学者与毕业设计学生的完整实践方案聚焦STM32F103C8T6平台对接机智云云平台并实现手机APP远程监控与控制解决从硬件搭建、固件烧录、协议移植到APP配网调试的全链路技术难点。资源包共491个文件涵盖83个C源码、86个头文件.h、79个编译中间文件.o/.d及关键可执行文件.axf/.bin、OLED与DHT11驱动模块、Keil工程配置.uvprojx/.uvoptx、机智云生成代码与Android APK安装包ioeDemo_2.21.22_945.apk以及配套批处理脚本keilkill.bat和原理图PDF文档总容量108.04MB。已有750人学习下载内容覆盖项目创建、ESP8266固件烧写、STM32本地采集OLED显示、机智云SDK移植、Wi-Fi配网与云端数据同步等核心环节所有步骤均配有对应工程结构与实测可用代码便于快速复现并扩展为温控、照明、安防等典型物联网应用。1. 项目缘起从零到一打造一个看得见摸得着的物联网设备几年前我第一次接触物联网项目时总感觉它离自己很远。那些动辄上云的智能家居、工业监控听起来高大上但真要自己动手面对一堆陌生的名词——MCU、Wi-Fi模块、云平台、APP——常常不知从何下手。后来我意识到最好的学习方式就是亲手做一个。今天我想分享的这个项目就是一个非常经典的物联网入门实战用STM32单片机通过ESP8266 Wi-Fi模块连接到机智云平台最终在手机APP上实现远程查看温湿度数据和控制一盏LED灯。这个项目麻雀虽小五脏俱全。它几乎涵盖了物联网终端设备开发的全部核心环节硬件选型与电路设计、单片机程序开发、网络模块的驱动与协议对接、云平台的数据点定义与设备接入、以及手机APP的界面交互。完成它你不仅能点亮一盏被手机控制的灯更能建立起一套完整的物联网开发思维框架。无论你是电子专业的学生、嵌入式开发的初学者还是想跨界了解物联网的软件工程师这个项目都能给你带来实实在在的收获。接下来我将手把手带你走完全程从原理图到源码从固件烧写到云端配置把每个环节的“为什么”和“怎么做”都讲清楚。2. 硬件架构深度解析为什么是STM32ESP8266这个黄金组合在开始写代码之前我们必须先理解手中的“兵器”。选择STM32和ESP8266作为核心并非偶然而是经过市场验证和成本权衡后的最优解之一。2.1 主控MCUSTM32F103C8T6的核心优势在这个项目中我选择了STM32F103C8T6也就是大家常说的“蓝色药丸”或“最小系统板”。它的流行有其必然性。首先从性能上看它基于ARM Cortex-M3内核主频72MHz拥有64KB Flash和20KB RAM。对于处理温湿度传感器如DHT11的数据、驱动LED、以及通过串口与ESP8266进行AT指令通信来说这个性能绰绰有余且不会造成资源浪费。其次它的外设资源非常丰富。我们至少需要用到以下外设USART通用同步异步收发器这是与ESP8266通信的“高速公路”。我们将使用一个USART例如USART2以固定的波特率如115200与ESP8266进行全双工通信发送AT指令并接收模块的响应。GPIO通用输入输出用于连接LED灯输出模式和温湿度传感器的数据线输入模式可能需要配合定时器做时序读取。ADC模数转换器如果我们使用模拟输出的温湿度传感器如某些型号的土壤湿度传感器则需要用到ADC。但本项目以数字传感器DHT11为例暂不涉及ADC。定时器用于提供精确的延时替代低效的delay循环、产生PWM信号如果需要调节LED亮度或者捕获传感器数据时序。选择STM32F103系列还有一个巨大优势极其丰富的生态。无论是标准外设库SPL、硬件抽象层库HAL还是LL库都有成熟的资料和社区支持。当你遇到串口接收中断数据丢失、定时器配置不对等问题时很容易找到解决方案。注意新手常犯的一个错误是混淆了不同库的API。例如在HAL库中开启串口接收中断是HAL_UART_Receive_IT()而在标准库中可能是USART_ITConfig()和配套的中断服务函数。在开始编程前务必确定你使用的库类型并保持整个工程的一致性。2.2 网络连接枢纽ESP8266的AT指令模式与透传原理ESP8266本身就是一个功能强大的SOC可以独立运行Lua或AT固件。在本项目中我们让它运行AT固件将其作为一个单纯的“Wi-Fi翻译器”来使用。这样做的最大好处是降低了STM32的开发复杂度。STM32无需处理复杂的TCP/IP协议栈只需要通过串口发送简单的AT指令就能命令ESP8266执行连接Wi-Fi、连接服务器、发送数据等操作。其工作模式我们通常选择TCP透传模式。一旦ESP8266通过AT指令连接到机智云平台指定的服务器和端口后就会进入该模式。在此模式下STM32通过串口发送给ESP8266的任何数据除了特定的退出指令都会被ESP8266原封不动地打包成TCP数据包发送给云平台服务器。反之服务器下发的数据也会由ESP8266通过串口直接传递给STM32。对于STM32而言它仿佛是在和一个“串口设备”通信而复杂的网络交互被ESP8266完全屏蔽了。这里有一个关键细节AT指令的响应与稳定性处理。你不能简单地发送一条ATCIPSEND就认为数据发出去了。一个健壮的驱动必须包含以下步骤发送指令后等待并解析ESP8266返回的“OK”或“ERROR”等响应。对于数据发送指令需要等待“”提示符后再发送实际数据。需要处理网络异常时的错误码如IPD消息表示收到服务器数据CLOSED表示连接断开并实现重连机制。由于串口通信是异步的强烈建议使用串口空闲中断IDLE配合DMA或环形缓冲区来接收不定长的AT指令响应和数据避免使用阻塞式的HAL_UART_Receive导致主程序卡死。2.3 传感器与执行器DHT11与LED的电路设计要点硬件连接看似简单但设计不当会导致调试困难。DHT11温湿度传感器是单总线设备数据线需要接一个4.7K-10K的上拉电阻到VCC。它的通信时序要求比较严格主机STM32需要先拉低总线至少18ms起始信号然后释放并切换到输入模式等待DHT11的响应。读取数据位时需要测量高电平的持续时间26-28us代表‘0’70us代表‘1’。这里我推荐使用一个通用定时器如TIM2的输入捕获功能来测量高电平脉宽这比用微秒级延时函数delay_us轮询判断要精准和可靠得多而且不占用CPU资源。LED电路我建议不要直接将STM32的GPIO引脚连接到LED尤其是功率稍大的LED。正确的做法是GPIO引脚连接一个限流电阻如220Ω-1KΩ根据LED规格书计算后再连接到LED阳极LED阴极接地。如果需要驱动更大电流的负载如继电器、电机则必须使用三极管或MOS管进行隔离驱动STM32的GPIO仅作为控制信号。一个完整的最小系统原理图应包含STM32最小系统晶振、复位电路、Boot模式选择、电源滤波、ESP8266模块接口VCC、GND、TXD、RXD、必要时还有EN和IO0引脚用于固件烧录模式、DHT11接口、LED接口以及为整个系统供电的AMS1117-3.3V稳压芯片及其输入输出滤波电容。电源的稳定性是项目成功的基石务必重视。3. 云端桥梁机智云平台的数据点定义与设备接入逻辑硬件准备就绪后我们需要在云端为设备建立一个“数字身份”。机智云平台作为物联网PaaS服务商提供了从设备接入、数据解析到应用开发的一整套工具。3.1 创建产品与数据点定义设备能做什么在机智云开发者中心第一步是“创建新产品”。产品名称和型号可以自定义比如“智能温湿度灯控器”。关键在于数据点Data Point的定义。数据点是设备与云端、APP交换信息的“语言词典”每个数据点代表设备的一个功能或状态。对于本项目我们需要定义至少三个数据点温度Temperature数据类型为“数值”读写类型为“只读”表示设备上报数据。需要设定取值范围如-20~60、分辨率0.1、单位℃。湿度Humidity同上数据类型“数值”只读。LED开关LED_Switch数据类型为“布尔”读写类型为“可写”表示APP可以下发控制指令。通常“1”代表开“0”代表关。定义数据点时标识名Data Point Name非常重要例如Temperature、LED_Status。这个标识名会在后续的设备端代码和APP代码中被引用用于匹配具体的数据点。定义完成后平台会为这个产品生成一个唯一的Product KeyPK和Product SecretPS这是设备联网时向云端标识自己身份的关键信息。3.2 设备端与云端的通信协议如何“说人话”设备STM32ESP8266和机智云服务器之间需要通过一种约定的格式交换数据。机智云使用了一种精简的二进制协议而不是直观的JSON。这样做是为了减少网络流量适应低带宽、低功耗的物联网场景。协议的核心是一个叫做“数据点数据”的结构。例如当STM32读取到温度25.6℃、湿度60%时它需要按照协议规则将这些数值打包成一个字节数组包含数据点标识、数据类型、数据长度和具体数值然后通过ESP8266发送出去。云端收到这个字节数组后会根据产品定义的数据点自动解析还原成{“Temperature”: 25.6, “Humidity”: 60}这样的结构化数据。反之当用户在APP上点击“开灯”时云端会下发一个控制指令包。这个包同样是一个二进制字节流STM32收到后需要按照协议解析出是哪个数据点LED_Switch被修改以及新的值是什么1然后执行相应的GPIO操作。为了简化开发机智云提供了针对不同MCU的移植示例代码GAgent。这套代码已经实现了协议打包、解包、心跳维持、设备激活等复杂逻辑。我们的主要工作就是移植这套代码到自己的STM32工程中并在指定的回调函数里填充自己的数据上报逻辑和处理下发的控制指令。3.3 设备注册与绑定从“设备”到“我的设备”一个新设备第一次上电联网时会向机智云发送包含PK、PS和设备MAC地址等信息进行“注册”。注册成功后云端会为它分配一个唯一的设备IDDid和一个用于通信的授权码Auth Key。这个过程通常被称为“设备激活”。但是激活后的设备并不会自动出现在任何用户的APP里。用户需要有一个“绑定”操作。常见的绑定方式有AirLink智能配置和SoftAP设备热点两种。AirLink模式设备ESP8266进入混杂模式监听网络中的所有报文。用户在APP中输入家庭Wi-Fi的账号密码APP会通过广播或组播的方式将这些信息以特定格式的UDP包发送出去。设备捕获到这些包并解析出Wi-Fi信息后即可连接路由器并进而连接机智云。SoftAP模式设备自身开启一个Wi-Fi热点如“Gizwits_XXXX”。用户手机连接到这个热点后再通过APP将家庭Wi-Fi信息发送给设备。设备成功连接云端后用户在APP中扫描或手动输入设备二维码内含Did等信息即可完成绑定。此后这个设备就专属该用户可以进行远程监控和控制了。在调试阶段我们也可以在开发者中心的“设备日志”里实时查看设备的上下线状态和数据收发情况这对排查问题至关重要。4. 设备端固件开发STM32程序的核心框架与代码剖析现在我们进入最核心的环节——编写运行在STM32上的固件。我将以HAL库为例拆解整个程序框架。4.1 工程搭建与外设初始化首先使用STM32CubeMX工具初始化工程是一个高效的选择。配置步骤如下选择MCU型号STM32F103C8Tx。配置系统时钟树RCC选择外部高速晶振HSE将系统时钟SYSCLK设置为72MHz。配置USART2为异步模式波特率115200字长8位无校验1位停止位。务必开启串口全局中断。配置一个GPIO引脚如PA5为推挽输出模式作为LED控制引脚。配置连接DHT11数据线的GPIO引脚如PB6为开漏输出模式初始状态或上拉输入模式读取状态具体模式切换需要在代码中动态实现。配置一个通用定时器如TIM3用于基本的毫秒级延时HAL库的HAL_Delay依赖SysTick但为了更精准的传感器时序我们可能还需要一个微秒级延时函数或使用定时器输入捕获。生成代码选择IDE为Keil MDK或IAR。生成的代码会包含main.c、stm32f1xx_hal_msp.c以及各个外设的.c/.h文件。我们需要在此基础上添加自己的应用逻辑。4.2 串口驱动与AT指令框架封装与ESP8266稳定通信是整个项目的基础。我们不能在主循环里简单调用printf发送AT指令。一个健壮的驱动层应该包括环形缓冲区Ring Buffer用于存储从串口中断服务程序USART2_IRQHandler中接收到的原始字节。防止数据覆盖丢失。AT指令解析状态机从环形缓冲区中取出数据逐行解析以“\r\n”为分隔符。判断是“OK”、“ERROR”、“IPD”还是其他自定义响应。指令发送与等待响应函数封装一个如esp8266_send_cmd(char* cmd, char* expected_response, uint32_t timeout)的函数。它发送指令然后启动一个超时定时器在定时器超时前状态机如果匹配到了预期的响应如“OK”则返回成功否则返回失败。// 示例连接Wi-Fi的指令序列 if(esp8266_send_cmd(AT\r\n, OK, 1000)) { // 测试模块 if(esp8266_send_cmd(ATCWMODE1\r\n, OK, 1000)) { // 设置为Station模式 sprintf(cmd_buf, ATCWJAP\%s\,\%s\\r\n, WIFI_SSID, WIFI_PASS); if(esp8266_send_cmd(cmd_buf, OK, 10000)) { // 连接Wi-Fi超时设长些 // 连接成功继续后续TCP连接等操作 } } }4.3 机智云GAgent嵌入式SDK的移植与对接这是连接云端的关键一步。你需要从机智云官网下载对应STM32F1xx系列的GAgent嵌入式代码包。通常包含以下核心文件gizwits_product.c/.h产品相关定义你需要在这里填写你的PK、PS并实现几个关键的回调函数。gizwits_protocol.c/.h协议处理的核心负责数据打包、解包、心跳。一些平台相关的接口文件如uart驱动、timer驱动、malloc等。移植工作主要包含以下几点实现协议要求的底层接口在gizwits_product.c中通常需要你实现一个串口发送函数uartWriteGAgent会用这个函数发送数据给ESP8266。你需要将这个函数指向你驱动ESP8266的串口发送函数如HAL_UART_Transmit。填充设备状态数据结构在gizwits_product.h中有一个结构体如dataPoint_t用来映射你在云端定义的所有数据点。你需要定义一个该结构体的全局变量如currentDataPoint并定期更新它的温度、湿度成员。实现关键回调函数gizwitsEventProcess这是处理云端下发的控制指令的地方。当APP控制灯时云端指令经解析后会调用这个函数并传入一个eventInfo参数。你需要在这个函数里判断eventInfo中的事件类型如果是LED_Switch事件则根据其值1或0去控制STM32的GPIO引脚电平。数据上报你需要在合适的时间主动调用gizwitsHandle函数通常放在主循环中。这个函数会检查是否有数据需要上报比如定时上报温湿度并调用你实现的uartWrite函数将数据发出。同时你还需要定期如每30秒调用gizwitsPassthroughData函数来维持与云端的心跳。修改串口中断你需要修改你的串口中断服务函数在接收到ESP8266的数据后除了存入自己的环形缓冲区还要调用GAgent提供的接口函数如gizpUartInput将数据喂给GAgent协议层处理。4.4 传感器数据读取与主程序逻辑流主程序的逻辑可以设计为一个简单的超级循环Super Loop配合定时器中断来执行周期性任务。int main(void) { // HAL初始化、外设初始化 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); MX_TIM3_Init(); // 初始化自己的ESP8266驱动、环形缓冲区 esp8266_init(); // 初始化机智云GAgent gizwitsInit(); // 启动一个1ms的定时器中断用于计时和调度 HAL_TIM_Base_Start_IT(htim3); while (1) { // 任务1处理串口接收缓冲区解析AT指令或云端数据 uart_rx_process(); // 任务2执行机智云协议处理心跳、数据上报检查 gizwitsHandle(); // 任务3每2秒读取一次DHT11传感器 if(read_sensor_flag 1) { read_sensor_flag 0; if(DHT11_Read(temperature, humidity) SUCCESS) { currentDataPoint.temperature temperature * 10; // 假设协议要求放大10倍 currentDataPoint.humidity humidity * 10; // 更新数据点后gizwitsHandle会在下次循环中检查并上报 } } // 其他任务... } } // 定时器中断服务函数 void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(htim3); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM3) { static uint32_t sensor_cnt 0; sensor_cnt; if(sensor_cnt 2000) { // 2000ms 2s sensor_cnt 0; read_sensor_flag 1; } // 其他定时任务如LED状态闪烁指示网络状态 } }5. 手机APP的快速构建利用机智云APP框架对于物联网设备一个配套的手机APP是用户体验的关键。从头开发一个原生APPAndroid/iOS成本很高。机智云提供了两种快速方案自动生成的APP和APP开源框架。5.1 使用机智云APP自动生成功能对于简单的演示和测试这是最快的方法。在机智云产品开发页面找到“APP开发”或“自动生成APP”功能。平台会根据你定义的数据点温度、湿度、开关自动生成一个标准界面的APP。你只需要下载安卓的APK安装包安装到手机上即可。这个自动生成的APP通常包含设备列表、设备控制面板显示数据点、历史数据曲线等基本功能。它的优势是零代码、分钟级部署非常适合用于前期功能验证和演示。但缺点是界面和交互是固定的无法自定义。5.2 基于开源框架进行二次开发如果你需要更个性化的界面、品牌Logo或者更复杂的逻辑就需要进行二次开发。机智云为Android和iOS平台都提供了开源APP框架SDK。以Android为例你需要下载Android Studio和机智云IoT APP开源框架。在项目的配置文件中填入你的Product Key。框架已经集成了设备发现、绑定、控制、推送等所有基础功能。你的开发工作主要集中在UI界面修改上。找到与控制面板相关的Activity和布局文件XML修改其UI元素TextView显示温度湿度Button或Switch控制LED并将这些UI控件与你产品数据点的标识名进行绑定。编译生成你自己的APK。开源框架将复杂的网络通信、协议解析封装成了简单的API你只需要关心业务逻辑和界面展示大大降低了APP开发门槛。iOS端的流程类似使用Xcode和对应的iOS开源框架。5.3 APP与设备的交互流程测试在APP开发或使用过程中理解其与设备的交互流程有助于调试设备发现APP通过局域网广播或扫描设备二维码获取设备的Did和IP局域网内信息。用户绑定APP将用户Token和设备Did发送到机智云服务器建立绑定关系。状态同步设备定时上报状态温湿度。APP上线时会主动向云端拉取设备的最新状态并更新UI。控制指令用户在APP点击开关APP将{“LED_Switch”: 1}这样的指令发送给云端云端通过设备的长连接通道将二进制指令包下发给设备。设备解析后执行动作并可以上报一个状态变化确认可选。远程唤醒当设备处于离线状态APP发送控制指令时云端会通过推送服务如极光推送给APP返回“设备离线”的提示。在整个流程中你可以利用机智云开发者中心的“设备日志”和“消息队列”功能查看每一笔数据上报和下发的具体内容是定位通信问题的利器。6. 系统联调与实战问题排查手册将硬件、固件、云端、APP全部连接起来的过程就是联调。这里是最容易出问题也是最能学到东西的阶段。6.1 固件烧写与硬件检查清单在给STM32烧写程序前请对照此清单检查硬件[ ]供电使用万用表测量STM32和ESP8266的VCC引脚是否为稳定的3.3V电流是否足够ESP8266启动时峰值电流可能超过200mA[ ]串口连接确认STM32的TX引脚连接到了ESP8266的RXRX连接到了TX。这是最常见的接线错误。[ ]Boot模式STM32的BOOT0和BOOT1引脚是否已正确配置为从主Flash启动通常BOOT0接低电平[ ]ESP8266模式确保ESP8266的EN使能引脚已上拉至高电平IO0在正常工作模式下也为高电平不是拉低进入烧录模式。[ ]下载器连接ST-Link/V2的SWDIO、SWCLK、GND、3.3V四根线是否连接牢固烧写工具推荐使用ST-Link Utility或STM32CubeProgrammer。在Keil或IAR中配置好下载器后点击下载即可。第一次下载如果失败尝试先按下板子的复位键再点击下载。6.2 ESP8266 AT固件烧录与基础AT指令测试如果你的ESP8266模块是新的或者不确定其固件版本最好先烧录一个稳定的AT固件。乐鑫官方提供了esptool.py这个强大的命令行工具。烧录步骤以Windows为例安装Python并通过pip install esptool安装esptool。将ESP8266的IO0引脚拉低到GND然后上电模块进入烧录模式。通过USB转TTL工具连接ESP8266的TX、RX、GND到电脑。打开命令行执行擦除和烧录命令需要提前下载好AT固件的bin文件esptool.py --port COM3 erase_flash # COM3替换为你的实际端口 esptool.py --port COM3 write_flash 0x0 path/to/AT_firmware.bin烧录完成后断开IO0与GND的连接重新上电。基础AT指令测试使用串口调试助手如XCOM、SSCOM打开对应串口波特率115200发送以下指令观察回复AT- 应回复OK。这是最基本的通信测试。ATGMR- 查看固件版本信息。ATCWMODE1- 设置模式为Station客户端。ATCWLAP- 扫描附近的Wi-Fi热点。如果连AT都无响应请检查波特率是否正确、TX/RX是否接反、模块供电是否充足。6.3 云端连接失败与数据不通的经典排查步骤当设备上电后APP里始终找不到设备或显示离线可以按照以下步骤排查步骤一检查Wi-Fi连接在STM32代码中在发送ATCWJAP连接路由器后增加调试信息通过串口打印连接结果。确保ESP8266已经成功获取到IP地址ATCIFSR。常见问题Wi-Fi密码错误、路由器设置了MAC地址过滤、2.4G和5G网络混淆ESP8266只支持2.4G。步骤二检查与机智云服务器的TCP连接在连接Wi-Fi成功后代码会发送ATCIPSTART指令建立TCP连接。你需要确认连接的目标地址和端口是否正确。机智云设备的接入地址通常是183.230.40.39或183.230.40.40端口为80。可以通过串口打印ATCIPSTATUS来查看当前的网络连接状态。步骤三检查设备激活注册过程TCP连接建立后设备会发送包含PK、PS等信息的注册包。这是第一个关键数据交互。务必在机智云开发者中心的“设备日志”中查看。如果能看到设备上线、并有一条“设备激活”的日志说明设备到云端的通道已经打通。如果看不到问题可能出在PK/PS填写错误。协议打包出错云端无法解析。设备MAC地址不合法全0或全F。步骤四检查数据点上报与下发设备激活后温湿度数据应该能定时上报。在“设备日志”里你应该能看到“数据上报”的条目点开可以查看原始数据和解析后的数据点值。如果数据点值全是0或异常问题出在STM32读取传感器或数据填充到currentDataPoint的环节。对于控制指令在APP上操作后查看“设备日志”是否有“数据下发”记录。如果有但设备没反应问题可能出在STM32的gizwitsEventProcess回调函数没有正确实现或未被调用。在回调函数中事件判断逻辑有误没有执行到控制GPIO的代码。GPIO引脚配置或控制代码有误。6.4 稳定性优化与进阶思考一个能跑通的Demo和一个可靠的产品之间还有很长的路要走。以下是一些进阶的优化方向看门狗IWDG/WWDG务必启用STM32的独立看门狗或窗口看门狗在程序跑飞时能自动复位提高系统鲁棒性。断线重连机制在网络异常断开IPD,CLOSED或长时间无心跳响应时代码应能自动尝试重新连接Wi-Fi和云端服务器而不是死等。低功耗设计如果设备是电池供电需要考虑低功耗。可以让STM32在采集数据的间隙进入睡眠模式Stop或Standby并通过ESP8266的外部中断或定时器唤醒。ESP8266本身也支持深度睡眠。本地控制与云端控制的优先级可以考虑在设备上增加一个物理按键。当本地按键控制LED时如何同步状态到云端和APP这涉及到本地与云端状态冲突的处理逻辑。OTA远程升级机智云平台支持设备的固件远程升级OTA。你可以将编译好的新固件bin文件上传到平台在设备端实现接收固件包、校验、写入Flash并重启的逻辑。这是产品化必不可少的功能。完成这个项目后你获得的不仅仅是一个能远程看温湿度、控制灯的设备更是一套应对物联网复杂性的方法论。从芯片选型、电路设计到驱动编写、协议对接再到云端配置和移动端交互每一个环节的坑踩过之后都会成为你宝贵的经验。物联网的世界很大但这个小小的项目是一个绝佳的起点。本文还有配套的精品资源点击获取
返回列表