
简介面向物联网嵌入式开发者这份资源提供基于 RT-Thread Studio 与 ESP8266 接入 OneNET 云平台的完整工程源码与依赖组件适合学习 RTOS、STM32 联网及云平台对接的初中级开发者。压缩包为 rar 格式共 2000 个文件约 17.94MB其中以 C 源文件与头文件为主涵盖 STM32L4 HAL 驱动、FatFS 文件系统、RT-Thread 内核及组件源码并包含 SConstruct、Kconfig 构建脚本、HTML/Markdown 说明文档及 IDE 工程配置目录结构完整便于直接导入查看与二次开发。通过资源可梳理 ESP8266 网络接入代码、云平台数据上传流程及 RT-Thread 工程组织方式资源内还保留较多编译中间文件、示例脚本与配置文档便于比对不同阶段的工程状态。对于毕业设计、课程项目或个人实验是一份可对照学习的完整参考。已有 1959 人学习下载适合希望从零搭建 ESP8266 上云链路、掌握 OneNET 平台对接流程的读者。1. 为什么每个 ESP8266 项目都要先过 OneNET 云平台这一关调试一块 ESP8266最常见的场面是串口监视器里温度、湿度、开关状态刷得飞快数据正确但没有一个人真正用到它。把这些数据搬到 OneNET 云平台等于给设备配了一个随取随用的数据库平台自动存历史、画折线图、开数据接口手机端和 Web 端不用再写后端。对只想让传感器数据上网、又不想维护服务器的团队来说这是最短的上云路径。下面按「平台建模型 → 设备写代码 → 参数排错 → 协议升级」的顺序把 ESP8266 连接 OneNET 云平台的完整做法讲透。适合手里已经有 NodeMCU 或 ESP-01 开发板、想立刻见到数据曲线的工程师也适合给现有 STM32 项目加联网能力的同学把 ESP8266 当透传模块用。2. 接入 OneNET 云平台先从平台侧把设备模型搭对2.1 为什么接入 OneNET 云平台要先建产品再建设备OneNET 云平台的数据模型是四级结构产品、设备、数据流、数据点。ESP8266 的所有上报动作最终都会落在一个具体数据点上但平台做权限校验时是从产品一路查到数据流产品下的 APIKey 决定你能不能写设备 ID 决定写到哪台设备数据流名决定这条时间序列存进哪个表。三者缺一个数据要么静默丢失要么直接被平台驳回。创建产品时控制台会让你选接入协议HTTP、MQTT、EDP 都可以选。很多第一次接入的人在这里就看花了眼。我的建议是先选 HTTP 把链路跑通验证完再在同一产品下加开 MQTT 能力两种协议共享设备列表和数据流不需要重建产品。平台侧建模型的顺序是创建产品 → 创建设备 → 在设备下创建数据流数据流也可由设备上报时自动创建但强烈建议手工建好。数据流名字段只接受字母、数字、下划线别用中文和减号后面做 HTTP URL 拼接和 MQTT topic 订阅时减号会出现无法预料的解析问题。2.2 设备鉴权信息device_id、api-key 与数据流名的关系设备创建成功后平台会分配一串数字形式的 device_id同时产品页里能看到 master-api-key。这两个值加上你自己命名的数据流就是 ESP8266 与 OneNET 云平台打交道的全部凭据。这里有一个非常容易搞混的点产品页的 api-key 是给 HTTP 接口签名用的设备详情页里还有一串设备 key那是走 MQTT 双向 TLS 用的两者不能互换。拿设备 key 去填 HTTP 的 header平台永远回 401。凭据位置用途device_id设备创建后由平台生成标识哪台设备在传数据拼在 URL 路径里api-key产品管理页自动生成HTTP 调用时的签名放在请求头设备 key设备详情页单独显示MQTT/TLS 双向认证HTTP 场景不要用datastream 名用户自定义区分同一设备的温度、湿度等多类数据生成 api-key 后立刻复制到记事本里。这个 key 只在生成时完整展示一次后面在固件里要同时用两处一处是请求头一处是拼接 URL。如果丢了只能重新生成重新生成会让所有旧固件全部失效已经烧到现场的设备必须挨个重新配置。2.3 上报协议选型HTTP 与 MQTT 在 ESP8266 上的取舍接入 OneNET 云平台的协议选择本质上是在「开发成本」和「实时性」之间做权衡。ESP8266 跑 HTTP 非常省事一个 POST 请求把数据丢过去断开连接设备继续休眠MQTT 则要维持一条 TCP 长连接每隔一段时间还要发心跳保活代码量多出一截但换来的是平台下行指令可以实时推到设备。协议开发成本实时性适合场景HTTP POST低单次请求秒级延迟传感器周期上报、快速验证链路MQTT中需维护长连接毫秒级远程控制、指令下发、频繁双向通信EDP中高较好老设备兼容新项目不推荐再入坑选择逻辑可以一句话说清只要数据上行HTTP 完全够用省掉长连接维护的精力如果产品规划里已经明确要做 App 控制、远程开关直接上 MQTT 更划算免得固件二次返工。在写 ESP8266 代码之前先用 curl 在电脑上模拟一次上报验证平台侧配置没有问题curl -X POST \ https://api.heclouds.com/devices/DEVICE_ID/datapoints?type3 \ -H api-key: YOUR_MASTER_API_KEY \ -H Content-Type: application/json \ -d {datastreams:[{id:temp,datapoints:[{value:25.6}]}]}把 DEVICE_ID 和 YOUR_MASTER_API_KEY 替换成实际值id改成你在平台建好的数据流名。执行后如果返回体里出现succ字样说明平台上这一侧已经通了后面调 ESP8266 只需要排查设备端。如果这一步就报 401 或 404问题基本出在 key 复制多了空格、或者 device_id 写错——先别碰单片机把这条 curl 调通再继续。3. ESP8266 上报数据到 OneNET 的 HTTP 实现与参数解析3.1 用 Arduino IDE 搭好环境先确认 NodeMCU 管脚没接反ESP8266 的开发环境Arduino IDE 和 PlatformIO 二选一。我一般建议第一次接触的人直接用 Arduino IDE打开开发板管理器搜索 esp8266安装 ESP8266 Community 提供的支持包然后在开发板列表里选 NodeMCU 1.0 或 Generic ESP8266 Module。由此带来的一个隐藏问题是驱动——NodeMCU 常见的串口芯片有 CP2102 和 CH340 两种Windows 不认 CH340 的板子很常见连不上串口时先检查设备管理器里有没有出现对应 COM 口而不是怀疑板子坏了。管脚问题上DHT11、DS18B20 这类传感器只接一根数据线很多人贪方便直接插在 D3/GPIO0 上。GPIO0 是启动模式选择脚上电瞬间的电平决定芯片进入运行模式还是下载模式。如果传感器在 GPIO0 上把电平拉低最典型的现象是插着传感器无法烧录拔掉就能烧。这不是代码逻辑问题是硬件设计时没避让。做 OneNET 数据上报项目传感器数据线优先接 GPIO2、GPIO4、GPIO5 这几个没有启动时序要求的脚烧录、运行两不误。3.2 HTTP 上报的核心代码与 JSON 拼接细节下面的代码实现 ESP8266 连接 WiFi 后把温度值以 JSON 格式 POST 到 OneNET 云平台串口打印出 HTTP 状态码和平台原始返回#include ESP8266WiFi.h #include ESP8266HTTPClient.h #include ArduinoJson.h const char* ssid YOUR_WIFI_SSID; const char* wifiPass YOUR_WIFI_PASS; const char* apiKey YOUR_MASTER_API_KEY; const char* deviceId YOUR_DEVICE_ID; WiFiClient client; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, wifiPass); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(\nWiFi connected); } void loop() { float temp readSensor(); // 用户自己的传感器读取函数 StaticJsonDocument192 doc; JsonArray streams doc.createNestedArray(datastreams); JsonObject stream streams.createNestedObject(); stream[id] temp; JsonArray points stream.createNestedArray(datapoints); points.createNestedObject()[value] temp; char payload[128]; serializeJson(doc, payload); HTTPClient http; String url String(https://api.heclouds.com/devices/) deviceId /datapoints?type3; http.begin(client, url); http.addHeader(api-key, apiKey); http.addHeader(Content-Type, application/json); int httpCode http.POST(payload); Serial.printf(HTTP %d, resp: %s\n, httpCode, http.getString().c_str()); http.end(); delay(10000); // 10 秒一轮上报 }这里有几个细节要拎出来讲。JSON 的根字段必须是datastreams复数 s 漏掉就返回 400每个数据流对象里的id与平台数据流名严格一致大小写敏感value是数字类型不能加引号。URL 末尾的?type3作用是告诉平台 body 是 JSON 格式这个参数漏了平台按其他格式解析数据会直接丢弃。HTTPClient 的begin传入的是完整 URLaddHeader设置的是请求头平台对api-key这个 header 的拼写是精确匹配的写成API-KEY或Api-Key在部分网关节点上会被拒绝。3.3 时间戳到底要不要自己传数据点里有一个可选字段t表示数据产生的时间。很多人一上来就纠结要不要传这里给出明确建议固定周期上报的项目不传让平台以接收时刻为准只有需要补传历史数据、或者设备离线缓存了多条记录要追报时才手动指定时间戳。传参写法是否推荐说明不传 t推荐平台自动打接收时间周期上报最省心t: 1720000000推荐Unix 秒级时间戳补传历史数据时用t: 2025-01-01 12:00不推荐字符串时间新版本校验会直接 400如果需要补传在代码里给数据点对象加一个字段即可points.createNestedObject()[value] temp; points[points.size() - 1][t] 1720000000;注意时间戳单位是秒不是毫秒。Arduino 上拿到毫秒级时间要先除以 1000否则平台会把 2025 年的时间解析成 1974 年折线图上出现一条穿越几十年的斜线。这种错误在串口里看不出任何异常因为 HTTP 返回仍是 succ只有去平台看数据点列表才会发现时间错乱。提示ArduinoJson 库 v6 和 v7 的serializeJson输出行为一致但如果用的是 v5 老版本createNestedArray的调用方式不同建议直接安装最新版省去兼容性烦恼。4. OneNET 鉴权与返回码排查ESP8266 连不上时先看这几个参数4.1 api-key 与设备 key 混用导致 401是接入 OneNET 云平台最常见的返工点连接失败的问题里超过一半出在鉴权层而不是网络层。现象很统一ESP8266 WiFi 已连接HTTP POST 发出去了返回 401 Unauthorized。查代码逻辑没有任何问题URL 也拼对了唯一可疑的是两个 key 都试过但都不行。这里有个特别容易踩的坑产品详情页里展示的 api-key 是一长串十六进制字符设备详情页里的设备 key 也是一长串十六进制字符复制的时候稍不注意就拿错。区分方法很简单登录 OneNET 控制台从「产品列表」进入产品详情看到的密钥是产品级 APIKey供所有 HTTP 接口调用从「设备列表」进入单个设备详情显示的密钥是设备级凭证供 MQTT 连接时做客户端认证。ESP8266 HTTP 上报用的是前者。如果控制台里找不到 api-key可以去产品详情页的「APIKey 管理」里重新生成生成后旧 key 立即失效已经烧录的设备全部需要更新固件配置。4.2 校验 HTTP 返回码与响应体的三步走排错法ESP8266 上报 OneNET 云平台失败时不要只看串口里那个 HTTP 状态码就下结论。状态码是传输层的结论业务层的错误原因在响应体里。代码里http.getString()已经拿到的字符串是排查的第一手材料。完整的排查顺序是这样第一步确认 HTTP 状态码是 200 还是其他值。连接超时或 DNS 解析失败时http.POST会返回负数比如 -1 表示未连接到主机-11 表示连接被拒绝。出现负数问题往往在 WiFi 信号强度或服务器域名可达性上。第二步看响应体里的 errno 和 error 字段。OneNET 在业务失败时会在 JSON 返回体里给出错误码errno: 0、error: succ才是成功errno: 9这类业务码需要对照平台错误码表。把响应体原样打印出来而不是只看 HTTP 码。第三步回到平台控制台看数据流是否有新点。有些时候 HTTP 返回 200、响应体也是 succ但平台的折线图就是没变化。这种静默丢失九成是数据流名不一致或者数据上报频率超过了平台流控阈值。数据流名不一致时平台不会报错它只认名字不认物理含义。故障现象可能原因检查动作401 Unauthorizedapi-key 错误或拿成设备 key从产品页重新复制 key注意别带空格404 Not Founddevice_id 写错或 URL 里少了斜杠串口打印完整 URL逐字符核对400 Bad RequestJSON 字段拼错value 加了引号把 payload 字符串贴进 JSON 校验器200 但无数据数据流名与平台不一致平台侧手工新建同名数据流负数状态码DNS 解析失败、WiFi 掉线检查 RSSI 信号强度和 SSID 密码4.3 供电波动造成 ESP8266 反复重启是连接 OneNET 云平台失败的最后一块绊脚石代码全对、鉴权全对设备还是连不上这时候回头检查硬件。ESP8266 射频发射瞬间电流可以达到 300mA 以上远高于普通单片机工作电流。劣质 USB 线、过长杜邦线、或者开发板自带的低压差线性稳压器散热不足都会在上报瞬间把电压拉到 3.0V 以下芯片直接硬件复位。判断方法很简单串口监视器里刚上电时能看到 boot 启动日志之后每隔几秒出现一模一样的启动信息说明设备在持续重启。WiFi 连接成功的那一瞬间功耗最高所以很多人看到的现象是「能连上 WiFi一发 HTTP 就重启」。解法是换 5V/2A 电源给模块单独供电不要和电机、继电器共用一个电源或者外接 AMS1117-3.3 稳压模块避开板载 LDO 的电流上限。这个问题在 ESP-01 这类小板上尤其常见模块没有板载稳压直接接 3.3V 悬空供电很容易掉压。5. 进阶用 MQTT 重做 ESP8266 到 OneNET 的控制链路5.1 从 HTTP 切到 MQTT 后鉴权方式完全变了HTTP 方案只解决数据上行平台要下发指令时只能靠设备定时去拉取实时性很差。MQTT 则让 OneNET 云平台主动把指令推到 ESP8266开关灯、设置采样周期、远程重启都能做到毫秒级响应。但换协议不是换一个端口那么简单鉴权模型整个变了HTTP 用产品级 APIKeyMQTT 改为三重身份——username 填产品 IDpassword 填 APIKeyclientId 填设备名。三个字段任何一个对不上MQTT Broker 都会悄悄断开连接而且很多客户端库默认不打印原因排查起来比 HTTP 难受得多。一次性把三个参数定义写对比反复试错省时间。还有一个细节MQTT 客户端的 keepalive 间隔默认是 60 秒但部分网络环境里 60 秒内没有数据交互NAT 网关会静默断开 TCP 连接。做法是把 keepalive 缩短到 30 秒并在业务上启动一个定时发布线程比如每 20 秒发布一次设备心跳数据让链路始终处于活跃状态。5.2 一条 MQTT 代码实现的订阅发布与重连参数排查#include PubSubClient.h const char* mqttHost YOUR_ONENET_MQTT_HOST; const uint16_t mqttPort 6002; const char* productId YOUR_PRODUCT_ID; const char* apiKey YOUR_MASTER_API_KEY; const char* deviceName YOUR_DEVICE_NAME; WiFiClient netClient; PubSubClient mqtt(netClient); void reconnect() { while (!mqtt.connected()) { if (mqtt.connect(deviceName, productId, apiKey)) { mqtt.subscribe($dp); } else { delay(3000); } } } void loop() { if (!mqtt.connected()) { reconnect(); } mqtt.loop(); publishData(); // 发布数据到 $dp }$dp是 OneNET 数据点发布主题设备向它发布的 payload 结构与 HTTP 的 datastreams JSON 相同可以复用上一章的序列化代码。mqtt.connect的三个参数依序是 clientId、username、password这里最容易写反顺序导致平台验证总是失败。连接成功后用mqtt.subscribe($dp)监听的其实是平台下发给设备的资源指令在回调函数里解析 JSON 就可以执行开灯、调速等控制动作。调试阶段建议用 MQTTX 桌面客户端做对端验证在 MQTTX 里配置相同的产品 ID 和 APIKey连接成功后手动发布一条控制指令观察 ESP8266 是否收到并串口打印出来。这样可以快速区分是平台的 topic 结构问题还是单片机代码解析问题。确认指令格式无误后再把 MQTTX 的测试数据清掉让 ESP8266 重新走一遍完整的连接流程。最终把 HTTP 上报的数据流名与 MQTT 发布的数据流名统一成同一个名字平台侧的折线图会自动续上历史曲线不需要改任何平台配置。本文还有配套的精品资源点击获取