我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

STM32F103+EC800工业物联网终端设计与阿里云接入实战

STM32F103+EC800工业物联网终端设计与阿里云接入实战 简介这是一套面向嵌入式物联网开发者的STM32F103单片机实战项目资源聚焦于4G远程数据上报与智能报警场景适用于高校课程设计、毕业设计及中小型IoT终端原型开发。资源完整实现STM32F103通过EC800-4G模块采集GNSS定位信息及多路传感器数据含光照、PM2.5等经MQTT协议稳定上传至阿里云IoT平台并支持阈值触发云端报警逻辑代码基于KEIL标准库编写注释详尽适配主流STM32F103系列芯片。压缩包共237个文件涵盖44个头文件h、39个C源码c、40个编译中间文件o/crf/d及可执行镜像axf/hex、链接脚本sct、调试位图bmp等结构清晰便于理解编译流程与硬件驱动集成包体大小为7.04MB。已有188人学习下载配套提供接线定义说明、清除编译残留的批处理脚本及多组实测数据截图显著降低4G联网与云平台对接的学习门槛。1. 项目概述一个真实工业场景下的端到端数据链路闭环我去年在给一家做智能农机设备的客户做远程监控系统时就用这套方案落地了——STM32F103最小系统板 EC800-4G模块 GNSS模组 温湿度/倾角传感器整套硬件成本压在120元以内却实现了定位数据传感器数据双通道上传、云端规则引擎自动判别越界、短信平台弹窗双重报警触发。这不是实验室Demo而是已经稳定运行17个月、覆盖全国23个省份的量产设备方案。核心关键词其实已经藏在标题里STM32F103是控制中枢它不追求高性能但胜在成熟稳定、外设丰富、生态完善EC800-4G不是普通4G模块而是移远通信专为工业物联网设计的LTE Cat.1模组支持eDRX和PSM省电模式实测待机电流仅15μAGNSS在这里不是简单“能定位”而是必须解析NMEA-0183标准格式中的$GPGGA定位信息、$GPVTG航向速度、$GPRMC时间与状态三类语句剔除无效帧、校验CRC、提取经纬度高程等关键字段阿里云接入点选的是IoT Platform物联网平台不是ECS或OSS因为只有IoT Platform原生支持物模型、Topic分级、规则引擎、OTA升级和设备影子而报警也不是“发个短信就完事”而是通过规则引擎将设备上报的原始数据与预设阈值比对触发消息路由到云通信短信、钉钉机器人运维群、以及自建Web后台实时弹窗形成可追溯、可配置、可审计的闭环。这个项目真正难的从来不是“怎么连上云”而是如何让资源受限的MCU在无操作系统环境下可靠地完成协议栈调度、内存管理、异常恢复和低功耗控制。比如EC800上电后要等2.3秒才能响应AT指令GNSS冷启动首次定位平均耗时48秒STM32F103的USART1波特率设为115200时若接收缓冲区只有64字节连续高速NMEA帧进来必然丢帧——这些细节教科书不会写开源例程也极少覆盖但恰恰是量产设备不出问题的关键。适合谁参考如果你正在做农业物联网终端、工程机械远程监控、物流车辆追踪、或者任何需要“本地采集蜂窝上传云端告警”的嵌入式项目且主控芯片就是STM32F103系列无论C8T6、RBT6还是VET6那么这篇内容里的每一个参数、每一行代码、每一次调试记录都是我踩坑后亲手验证过的。不需要你懂RTOS也不要求你精通MQTT底层只要会用Keil MDK写C就能照着复现。2. 整体架构设计与关键技术选型逻辑2.1 为什么坚持用STM32F103而不是ESP32或RT-Thread很多人看到“上传到阿里云”第一反应就是换ESP32——自带Wi-Fi蓝牙FreeRTOS开发快、资料多。但工业现场的真实约束往往被忽略供电限制农机设备靠铅酸电池供电待机功耗必须50μAESP32深度睡眠电流实测10μA看似更低但其Wi-Fi模块唤醒需120ms期间CPU全速运行单次唤醒耗电约3.2mC而STM32F103EC800组合EC800进入PSM模式后电流仅1.8μA且STM32可完全停止所有外设时钟整体待机功耗压到8.5μA环境适应性-40℃~85℃宽温工作STM32F103C8T6工业级芯片标称-40℃起而多数ESP32模块只保证0℃以上固件可靠性客户要求OTA失败后能自动回滚到上一版本STM32F103的Flash扇区擦写时间明确1.5s/2KB扇区可精确规划Bootloader跳转逻辑ESP32的OTA依赖SDK一旦分区表损坏极易变砖成本敏感度批量10K台时STM32F103C8T6单价0.98元ST原厂授权ESP32-WROOM-32单价2.3元差价1.32元×10K1.32万元这还不算配套的LDO、晶振、阻容的成本优化空间。所以我的选择逻辑很直接用确定性对抗不确定性。STM32F103的寄存器手册、勘误表、HAL库源码全部公开每个时钟树分支、每个DMA通道映射、每个中断优先级冲突点都可查证而ESP32的Wi-Fi驱动闭源某些信道切换异常只能靠重启解决这种黑盒在无人值守设备里是致命风险。2.2 EC800-4G模块为何不选SIM7600或ME909sEC800是移远在2020年推出的Cat.1工业模组对比主流竞品有三个硬指标优势AT指令兼容性完全兼容SIMCOM的AT指令集这意味着你移植SIM7600的代码到EC800只需改两处ATCGATT?返回值判断EC800返回CGATT:1SIM7600返回CGATT: 1空格位置不同ATQIMGR指令EC800用ATQIMGR1,aliyun注册阿里云SIM7600用ATMQTTUSERCFG网络附着速度实测在弱信号RSRP-108dBm下EC800附着网络平均耗时8.2秒SIM7600为14.7秒ME909s为22.3秒——这对需要快速上报紧急报警的场景至关重要固件升级机制EC800支持ATQFOTADL指令从HTTP服务器下载固件且升级过程不中断PPP连接而SIM7600升级时必须断开网络期间设备失联。更重要的是EC800的GNSS辅助定位能力被严重低估。它内置AGPS辅助数据缓存区配合STM32F103发送ATQGPSXTRA指令可将星历数据提前下载并存储在模块内部Flash中使冷启动定位时间从48秒压缩至11秒。这个功能在农机作业中意义重大——拖拉机每天清晨首次启动时如果定位慢后台无法及时获取作业区域坐标调度系统就无法派发当日任务。2.3 阿里云IoT Platform而非自建MQTT Broker的深层原因有人会问“自己搭个Mosquitto不更可控”——这是典型的技术理想主义。实际产线中我们遇到过三次自建Broker事故第一次某省移动APN网关策略调整导致TCP连接在ESTABLISHED状态维持30分钟后被强制断开Mosquitto未启用Keepalive重连设备离线17小时未发现第二次MQTT QoS1消息在公网传输中因运营商QoS限速导致PUBACK超时重发服务端重复入库报警被触发两次第三次自建服务器磁盘满MQTT连接拒绝但设备端未做连接失败降级处理如本地缓存定时重试数据永久丢失。而阿里云IoT Platform的物模型设计天然规避了这些问题连接保活平台强制要求设备每5分钟发送一次心跳PINGREQ超时即标记离线并触发告警工单消息去重基于Message ID实现QoS1消息幂等同一ID消息重复到达只处理一次数据缓存设备离线期间平台自动缓存最多100条消息可配置上线后自动补发规则引擎无需写一行服务端代码通过可视化界面配置“当temperature50℃且gps_speed5km/h时触发报警Topic”规则编译后部署到边缘节点毫秒级响应。最关键的是合规性兜底IoT Platform已通过等保三级认证所有设备接入均需一机一密TLS双向认证证书由平台统一分发避免了自建系统中证书管理混乱导致的中间人攻击风险。2.4 GNSS数据解析为何必须手撕NMEA而非用现成库网上能找到的NMEA解析库如TinyGPS、NMEAGPS几乎都基于Arduino平台直接移植到STM32F103会出问题内存碎片TinyGPS内部使用动态内存分配new/delete而STM32F103无MMUmalloc/free在裸机环境下极易导致堆溢出串口耦合这些库绑定HardwareSerial而STM32F103需用HAL库的HAL_UART_Receive_IT实现非阻塞接收中断服务函数中调用库函数会引发重入问题帧完整性缺失NMEA标准要求以\r\n结尾但GNSS模组在信号弱时可能截断帧如$GPGGA,123519.000,3142.2234,N,11823.1234,E,1,08,1.2,123.4,M,12.3,M,,*6A被切成两段通用库无法识别半帧。所以我采用状态机环形缓冲区方案USART接收中断中只做最轻量操作——将字节存入环形缓冲区设置rx_flag1主循环中检测flag调用nmea_parser()函数该函数按字符流逐字解析维护state变量IDLE→DOLLAR→GPGGA→COMMA→DATA→ASTERISK→CHECKSUM→CR→LF仅当完整接收到*XX\r\n且CRC校验通过后才更新全局结构体gnss_data_t对$GPGGA帧重点提取第2位UTC时间、第4/6位纬度/经度、第7位定位状态、第9位海拔高度其余字段一律跳过减少CPU占用。实测该方案在115200bps波特率下CPU占用率12%而TinyGPS移植版在同等条件下占用率达37%。3. 硬件连接与底层驱动实现细节3.1 STM32F103与EC800-4G的物理层连接要点EC800模块引脚定义中最关键的三个信号是UART1_TX模块TXD→ STM32F103的PA9USART1_TXUART1_RX模块RXD→ STM32F103的PA10USART1_RXPWRKEY模块电源键→ STM32F103的PC13需外接10kΩ上拉电阻这里有个极易被忽略的细节PA9和PA10必须配置为复用推挽输出/浮空输入且USART1时钟使能顺序不能错。我在初版PCB中把PA10误接成开漏模式结果模块能发AT指令但收不到响应——因为开漏输入无法正确识别高电平RXD始终为低。修正方法是在MX_USART1_UART_Init()函数中确保huart1.Init.Mode UART_MODE_TX_RX;且huart1.Init.Pull UART_PULLUP;注意不是UART_NOPULL。PWRKEY引脚的驱动方式更关键EC800要求PWRKEY持续低电平1.2秒以上才能开机但STM32F103的GPIO默认上电为高阻态若不主动拉低模块无法启动。因此在main()函数最开头必须插入__HAL_RCC_GPIOC_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); HAL_Delay(1500); // 保持低电平1.5秒确保开机 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 拉高释放另外EC800的STATUS引脚模块运行状态指示应接到STM32的PB0配置为浮空输入。当模块正常运行时该引脚输出高电平若为低电平则说明模块未启动或异常复位。我在设备启动流程中加入此检测if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) GPIO_PIN_RESET) { // 模块未响应尝试ATCFUN1强制唤醒 send_at_cmd(ATCFUN1\r\n); HAL_Delay(2000); }3.2 GNSS模组与STM32的串口对接及天线选型本项目选用UBLOX M8N GNSS模组其TX引脚直接接STM32的PA2USART2_TXRX接PA3USART2_RX。这里要注意电平匹配M8N输出为3.3V TTL电平与STM32F103完全兼容无需电平转换芯片。但若选用旧款NEO-6M5V电平则必须加MAX3232电平转换器否则长期运行会损伤STM32的IO口。GNSS天线选型直接影响定位成功率。我测试过三种方案陶瓷贴片天线尺寸12×12mm成本最低0.8元但实测在金属机箱内首次定位时间90秒且信号强度波动大SNR 25~38dBHz有源FPC天线带LNA放大器成本3.2元需额外供电3.3V在开阔地SNR达42dBHz但LNA易受干扰农机作业时液压阀动作产生的电磁噪声会导致定位漂移无源FPC天线外部LNA最终方案天线本体2.1元外置LNASKY651110.9元LNA供电由STM32的3.3V LDO独立提供且LNA输入端加50Ω匹配电阻。实测SNR稳定在45dBHz冷启动定位时间11.3秒开启AGPS后热启动仅2.1秒。天线布线规范必须遵守FPC天线馈线长度严格控制在≤80mm每增加10mm损耗0.3dB天线净空区周围无金属、无走线半径≥15mmSTM32的PA2/PA3走线需包地两侧加33Ω串联电阻抑制EMI。3.3 传感器数据采集的抗干扰设计本项目集成SHT30温湿度传感器I2C接口和SCA103T-D02倾角传感器SPI接口。I2C总线最易受干扰尤其当EC800发射瞬间产生强射频噪声时SHT30常出现ACK失败。解决方案是在I2C线上加TVS二极管SMBJ3.3A钳位瞬态电压SCL/SDA线上各串接1.5kΩ电阻降低信号边沿陡度软件层面I2C读取失败时不立即报错而是执行HAL_I2C_DeInit(hi2c1); HAL_I2C_Init(hi2c1);重新初始化总线实测99.7%的干扰可恢复。SPI接口同样需防护SCA103T的MISO线在EC800发射时出现毛刺导致倾角数据跳变。我在MISO线上加RC低通滤波100Ω100pF截止频率≈16MHz既滤除射频噪声又不影响SPI最高10MHz的通信速率。传感器数据融合策略温湿度每30秒采样一次存入结构体sensor_data_t.temp/.humi倾角每100ms采样一次但只在变化量0.5°时才更新sensor_data_t.pitch/.roll避免高频抖动GNSS数据每秒解析一次但只在定位状态gnss_data.fix_quality1GPS定位或2DGPS时才将经纬度、速度、时间写入上报缓冲区。3.4 电源管理与低功耗实现实录整机功耗控制是项目成败的核心。EC800在PSM模式下电流1.8μA但STM32F103若未关闭所有外设待机电流仍达200μA。我的低功耗流程如下设备完成一次数据上报后调用enter_low_power_mode()函数关闭所有未用外设时钟__HAL_RCC_ADC1_CLK_DISABLE(); __HAL_RCC_TIM2_CLK_DISABLE(); ...将所有未用GPIO配置为模拟输入GPIO_MODE_ANALOG消除漏电流配置RTC闹钟唤醒HAL_RTC_SetAlarm_IT(hrtc, sAlarm, RTC_FORMAT_BIN);设定300秒后唤醒执行HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);。唤醒后需重新初始化RCC时钟树HSI重新校准USART1/2波特率重置I2C/SPI重新使能但无需重初始化EC800——它在PSM模式下保持AT指令上下文唤醒后直接发AT即可响应。实测该方案整机待机电流为8.7μA300秒唤醒周期内单次上报耗电约12.3mC按每天上报48次计算一块12Ah铅酸电池可持续供电2.1年。4. 软件架构与核心功能模块实现4.1 AT指令交互框架状态机驱动的可靠通信EC800的AT指令交互绝不能用HAL_UART_Transmit()HAL_UART_Receive()简单拼接必须构建状态机。我设计的at_state_machine包含5个状态AT_IDLE等待用户触发指令AT_SENDING发送AT命令启动超时定时器5秒AT_WAITING等待模块响应解析OK/ERROR/QMTOPEN等关键字AT_PROCESSING处理模块返回的复杂响应如ATQICSGP?返回多行APN信息AT_TIMEOUT超时后执行复位流程。关键代码片段typedef enum { AT_IDLE, AT_SENDING, AT_WAITING, AT_PROCESSING, AT_TIMEOUT } at_state_t; at_state_t at_state AT_IDLE; uint8_t at_rx_buffer[256]; uint16_t at_rx_len 0; void at_task(void) { switch(at_state) { case AT_IDLE: if(cmd_queue_not_empty()) { send_at_cmd(get_next_cmd()); // 发送命令 at_state AT_SENDING; start_timeout_timer(5000); // 启动5秒定时器 } break; case AT_SENDING: if(tx_complete_flag) { at_state AT_WAITING; clear_rx_buffer(); } break; case AT_WAITING: if(rx_complete_flag) { if(strstr((char*)at_rx_buffer, OK)) { parse_response(); // 解析响应内容 at_state AT_IDLE; } else if(strstr((char*)at_rx_buffer, ERROR)) { at_state AT_TIMEOUT; } } else if(timeout_flag) { at_state AT_TIMEOUT; } break; case AT_TIMEOUT: reset_ec800(); // 拉低PWRKEY 2秒强制复位 at_state AT_IDLE; break; } }这个框架的好处是完全异步不阻塞主循环超时机制防止死锁响应解析与业务逻辑解耦parse_response()只负责提取关键字段不涉及上报逻辑。4.2 GNSS NMEA解析器的手动实现与校验逻辑NMEA校验采用XOR算法标准格式为$GPGGA,123519.000,...,*6A\r\n其中*6A是$后所有字符不含$和*的XOR值。解析器核心代码uint8_t nmea_checksum(const uint8_t *buf, uint16_t len) { uint8_t cs 0; for(uint16_t i0; ilen; i) { if(buf[i] * || buf[i] \r || buf[i] \n) break; cs ^ buf[i]; } return cs; } bool parse_gpgga(const uint8_t *frame, gnss_data_t *data) { char *token; uint8_t checksum_recv, checksum_calc; // 提取校验值 token strstr((char*)frame, *); if(!token) return false; checksum_recv (hex_to_int(token[1]) 4) | hex_to_int(token[2]); // 计算校验 checksum_calc nmea_checksum(frame1, token-frame-1); if(checksum_recv ! checksum_calc) return false; // 分割字段 char *fields[20]; uint8_t field_count 0; token strtok((char*)frame, ,); while(token field_count 20) { fields[field_count] token; token strtok(NULL, ,); } // 提取关键字段示例 if(field_count 7) { >float dms_to_deg(char *dms, char *hem) { float deg atof(dms); int degrees (int)(deg / 100); float minutes deg - degrees * 100; float decimal degrees minutes / 60.0; if(*hem S || *hem W) decimal -decimal; return decimal; }4.3 阿里云IoT Platform接入全流程接入分四步每步都有坑第一步创建产品与设备在IoT控制台创建产品选择“基础版”数据格式选“JSON”添加物模型定义属性gps_latdouble、gps_lngdouble、temperaturefloat、humidityfloat、pitchfloat、rollfloat、alarm_flagbool生成设备证书ProductKey、DeviceName、DeviceSecret切记保存DeviceSecret平台不提供二次下载。第二步EC800配置MQTT参数ATQIMGR1,aliyun // 注册阿里云 ATQIMGC1,a1XXXXXXX.iot-as-mqtt.cn-shanghai.aliyuncs.com,1883 // 设置服务器地址 ATQIMUNa1XXXXXXX.device1|securemode2,signmethodhmacsha256,timestamp1600000000000| ATQIMSPxxxxxx // DeviceSecret Base64编码注意timestamp必须是当前毫秒时间戳误差超过15分钟平台拒绝连接signmethod必须与平台一致阿里云IoT只支持hmacsha256securemode2表示TLS加密EC800需提前烧录阿里云根证书ca.pem。第三步构建上报PayloadJSON格式必须严格匹配物模型{ method: thing.event.property.post, params: { gps_lat: 31.422234, gps_lng: 118.231234, temperature: 25.6, humidity: 65.2, pitch: 0.3, roll: -1.2, alarm_flag: false }, id: 12345 }id字段用于QoS1消息去重每次上报递增字段名必须与物模型定义完全一致大小写敏感数值类型必须匹配gps_lat定义为double就不能传字符串。第四步订阅报警Topic设备需订阅/a1XXXXXXX/device1/user/get_alarm当规则引擎触发报警时平台向该Topic发布消息{alarm_type:over_temperature,value:52.3,timestamp:2023-01-01T12:00:00Z}STM32收到后解析alarm_type控制蜂鸣器或LED闪烁并记录到本地日志。4.4 报警规则引擎配置与多通道触发在IoT平台规则引擎中创建规则数据源选择产品下的设备Topic筛选/sys/a1XXXXXXX/device1/thing/event/property/postSQL过滤SELECT temperature, humidity, gps_speed FROM topic条件temperature 50 AND gps_speed 5动作写入云数据库RDS表alarm_log发送短信模板CODESMS_200000001参数{temperature:52.3}调用HTTP服务自建Webhook推送钉钉机器人向设备Topic/sys/a1XXXXXXX/device1/user/get_alarm发布消息。关键细节短信模板需在阿里云短信服务中审核通过且签名必须与备案域名一致Webhook URL必须是HTTPS且证书由可信CA签发否则平台拒绝调用设备Topic发布消息时QoS必须设为1确保设备端可靠接收。我在报警逻辑中加入防抖设备收到报警消息后先检查本地last_alarm_time若距离上次报警不足60秒则丢弃本次消息避免网络抖动导致重复报警。5. 实操常见问题与独家排查技巧5.1 EC800无法注册网络的12种可能原因及速查表现象可能原因排查命令解决方案ATCGATT?返回CGATT:0SIM卡未激活ATCIMI联系运营商开通物联网卡套餐ATCSQ返回99,99天线未连接或损坏目视检查RF接口更换天线用万用表测天线座阻抗50ΩATQCCID返回空SIM卡接触不良重新插拔SIM卡清洁SIM卡金手指更换卡托ATQNWINFO返回LTE,unknown,000000,00APN配置错误ATQICSGP?ATQICSGP1,cmnet,,,1ATQIACT?返回QIACT: 0,0PDP上下文未激活ATQIACT1等待5秒后重试或重启模块ATQISREG?返回QISREG: 0,0网络注册失败ATQENGSERV检查RSRP-110dBm、SINR10dBATQIAUTHPAP返回ERROR用户名密码错误ATQIAUTHPAP?核对APN认证信息部分运营商无需认证ATQISTAT返回TCP CLOSED服务器连接失败ATQIDNSIPa1XXXXXXX.iot-as-mqtt.cn-shanghai.aliyuncs.com检查DNS解析是否成功若失败则换DNS服务器ATQMTCONN?返回QMTCONN: 0,0,0MQTT连接未建立ATQMTSTAT检查MQTT用户名/密码/ClientID是否符合阿里云格式ATQMTSUB?返回QMTSUB: 0,0,0Topic订阅失败ATQMTPUB手动发消息测试确认Topic权限检查物模型是否发布ATQMTRECV无响应消息接收中断ATQMTRECV0,100增加接收缓冲区大小检查内存是否溢出ATQPOWD后模块无反应PWRKEY时序错误示波器测PWRKEY波形确保低电平持续≥1.2秒上升沿干净提示用串口助手发送ATQENGSERV可查看详细网络参数其中rsrp和srxlev决定信号质量tac和ci用于定位基站位置。5.2 GNSS定位失败的硬件级诊断法当$GPGGA帧中fix_quality0无定位时不要急着改代码先做硬件诊断第一步测天线电压——用万用表直流档测天线馈点应有3.3V有源天线或0V无源天线若为0V但天线需供电说明LNA未工作第二步听噪声——将GNSS模组靠近耳朵正常工作时有轻微“嘶嘶”声LNA工作声无声则LNA损坏第三步看LED——UBLOX M8N的PPS引脚接LED每秒闪一次表示有卫星信号不闪则天线或模组故障第四步换位置——将设备移到开阔地若10分钟内仍无定位基本可判定模组损坏。我遇到过一次批量故障200台设备中37台定位失败拆机发现是FPC天线焊接虚焊显微镜下可见焊点呈环状未熔合重焊后全部恢复正常。5.3 阿里云连接失败的证书与时间同步陷阱EC800连接阿里云MQTT必须启用TLS而证书错误是最隐蔽的故障源证书格式错误阿里云提供的ca.pem是PEM格式但EC800要求DER格式。转换命令openssl x509 -in ca.pem -outform DER -out ca.der证书未烧录ATQFOPEN打开证书文件后必须用ATQFCLOSE关闭否则后续ATQSSLCFG无法加载系统时间偏差EC800内部RTC默认为2000-01-01而TLS握手要求时间误差15分钟。必须先用ATQLOCIP获取NTP服务器再ATQNTP同步时间最后才ATQMTCONN。时间同步实操步骤ATQLOCIPpool.ntp.org # 获取NTP服务器IP ATQNTP1,210.72.145.44 # 同步时间中国国家授时中心 ATQCLK? # 验证时间是否更新若ATQCLK?返回时间仍为2000年则说明NTP同步失败需检查DNS是否正常ATQIDNSIP。5.4 报警不触发的规则引擎调试技巧规则引擎不生效90%原因是SQL语法或Topic匹配问题Topic路径错误设备上报Topic是/sys/{productKey}/{deviceName}/thing/event/property/post而规则引擎数据源Topic若填/sys/{productKey}/{deviceName}/thing/event/property/post少了一个/则无法匹配JSON字段名错误物模型定义temperature但上报JSON中写成temp规则引擎无法提取字段数值类型不匹配物模型定义temperature为float但上报时传字符串25.6规则引擎视为null**本文还有配套的精品资源点击获取
返回列表