OneNET 平台传感器数据采集与展示

29 阅读6分钟

OneNET 平台传感器数据采集与展示 — 完整入门教程

适合零基础入门,以温湿度采集为例,完整走通「注册 → 建产品 → 接设备 → 上传数据 → 可视化展示」全流程。


一、整体流程概览

传感器(DHT11等) → 单片机(STM32/ESP32/ESP8266) → MQTT协议 → OneNET云平台 → View可视化大屏

整个过程分 5 步

  1. 注册 OneNET 账号,进入 OneNET Studio
  2. 创建产品 & 定义物模型(告诉平台你有哪些数据)
  3. 创建设备(在平台上注册一个虚拟设备)
  4. 硬件端通过 MQTT 协议上传传感器数据
  5. 用 OneNET View 做数据可视化展示

二、第 1 步:注册账号 & 进入平台

  1. 打开 OneNET 官网:open.iot.10086.cn/
  2. 点击右上角「注册」,使用手机号注册(免费)
  3. 登录后,进入控制台,点击左侧菜单的 「OneNET Studio」(这是新版统一入口)

注意:2023 年 4 月后,OneNET 将 NB-IoT 套件、MQTT 套件、物生活平台合并为统一的 OneNET Studio,老版教程的截图可能不一样,以新版为准。


三、第 2 步:创建产品 & 定义物模型

3.1 创建产品

  1. 在 OneNET Studio 控制台,点击 「产品管理」→「创建产品」
  2. 填写产品信息:
    • 产品名称:例如 温湿度监测器
    • 联网方式:选择 Wi-Fi(如果用 ESP8266/ESP32)或 蜂窝网络(如果用 4G 模组)
    • 数据协议:选择 「OneJSON」(推荐,基于物模型)或「数据流」(更简单但功能少)
    • 设备接入协议:选择 「MQTT」(最常用)
  3. 点击「创建」

3.2 定义物模型(功能定义)

物模型就是告诉平台「你的设备有哪些属性」。

  1. 进入刚创建的产品 → 点击 「功能定义」(或「设置物模型」)
  2. 点击「添加自定义功能点」,逐个添加:
功能名称标识符数据类型取值范围单位
温度temperaturefloat-40 ~ 80
湿度humidityfloat0 ~ 100%RH
  1. 添加完成后点击 「保存」 使物模型生效

提示:如果选择了「数据流」协议而非 OneJSON,则不需要定义物模型,数据流名称(key)可以在上传数据时自由指定。


四、第 3 步:创建设备

  1. 在产品页面,切换到 「设备管理」→「添加设备」
  2. 填写:
    • 设备名称:例如 sensor_001(建议用英文)
  3. 创建成功后,记录以下 三个关键信息(连接时要用):
    • 产品 ID(product_id)
    • 设备名称(device_name)
    • 设备密钥(device_key)或 产品密钥(product_key)

五、第 4 步:设备端接入 — 上传传感器数据

5.1 MQTT 连接参数

OneNET MQTT 接入地址:

参数
服务器地址mqtts.heclouds.com
端口1883(TCP) / 8883(TLS 加密)
Client ID设备名称
Username产品ID
Password经过 Token 算法计算的鉴权字符串

5.2 Token 计算

OneNET 使用 Token 鉴权,密码不是直接用密钥,而是需要计算:

Token 格式:
version=2018-10-31&res=products/{产品ID}/devices/{设备名称}&et={过期时间戳}&method=sha256&sign={签名}
  • 官方提供了 Token 生成工具,可在 OneNET 文档中心下载
  • 也可以用 Python 自行计算(下面给出示例)

Python Token 生成示例:

import base64
import hmac
import hashlib
import time
from urllib.parse import quote

def generate_token(product_id, device_name, device_key, expire_time=None):
    """生成 OneNET MQTT 连接所需的 Token"""
    if expire_time is None:
        expire_time = int(time.time()) + 3600 * 24 * 365  # 1年后过期

    # 资源路径
    res = f"products/{product_id}/devices/{device_name}"

    # 待签名字符串
    string_to_sign = f"{expire_time}\n{hashlib.sha256(res.encode()).hexdigest()}"

    # 使用设备密钥进行 HMAC-SHA256 签名
    key = base64.b64decode(device_key)
    sign = base64.b64encode(
        hmac.new(key, string_to_sign.encode(), hashlib.sha256).digest()
    ).decode()

    # 组装 Token
    token = (
        f"version=2018-10-31"
        f"&res={quote(res, safe='')}"
        f"&et={expire_time}"
        f"&method=sha256"
        f"&sign={quote(sign, safe='')}"
    )
    return token

# 使用示例
product_id = "你的产品ID"
device_name = "sensor_001"
device_key = "你的设备密钥"

token = generate_token(product_id, device_name, device_key)
print(f"Password: {token}")

提示:初学者建议先用官方提供的 Token 计算小工具,填入参数即可生成。

5.3 数据上报格式(OneJSON 物模型模式)

连接成功后,向以下 Topic 发送数据:

上报属性 Topic:

$sys/{产品ID}/{设备名称}/thing/property/post

消息体(JSON):

{
    "id": "1",
    "version": "1.0",
    "params": {
        "temperature": {
            "value": 25.6
        },
        "humidity": {
            "value": 65.3
        }
    }
}

5.4 硬件方案选择

根据你的情况选择一种:

方案说明适合场景
ESP8266 + DHT11最便宜,Arduino 开发课设/毕设入门
ESP32 + 传感器性能更强,支持蓝牙 + Wi-Fi稍复杂的项目
STM32 + ESP8266STM32 采集数据,ESP8266 负责联网需要学 STM32 的场景
STM32 + 4G 模组无需 Wi-Fi,SIM 卡联网户外/无 Wi-Fi 环境
树莓派Python 直接开发快速原型验证

5.5 ESP8266 (Arduino) 示例代码

以 ESP8266 + DHT11 为例的核心代码框架:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

// Wi-Fi 配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// OneNET MQTT 配置
const char* mqtt_server = "mqtts.heclouds.com";
const int mqtt_port = 1883;
const char* client_id = "sensor_001";        // 设备名称
const char* mqtt_user = "你的产品ID";         // 产品ID
const char* mqtt_pass = "计算好的Token";       // Token

// 传感器配置
#define DHTPIN D4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

WiFiClient espClient;
PubSubClient client(espClient);

// 上报数据的 Topic
char topic[128];

void setup() {
    Serial.begin(115200);
    dht.begin();

    // 连接 Wi-Fi
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("WiFi connected");

    // 连接 MQTT
    client.setServer(mqtt_server, mqtt_port);

    // 拼接 Topic
    sprintf(topic, "$sys/%s/%s/thing/property/post", mqtt_user, client_id);
}

void reconnect() {
    while (!client.connected()) {
        if (client.connect(client_id, mqtt_user, mqtt_pass)) {
            Serial.println("MQTT connected");
        } else {
            delay(5000);
        }
    }
}

void loop() {
    if (!client.connected()) {
        reconnect();
    }
    client.loop();

    // 读取传感器数据
    float temp = dht.readTemperature();
    float humi = dht.readHumidity();

    if (!isnan(temp) && !isnan(humi)) {
        // 构造 OneJSON 格式消息
        char payload[256];
        sprintf(payload,
            "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{"
            "\"temperature\":{\"value\":%.1f},"
            "\"humidity\":{\"value\":%.1f}"
            "}}",
            temp, humi);

        // 发布到 OneNET
        client.publish(topic, payload);
        Serial.printf("Published: temp=%.1f, humi=%.1f\n", temp, humi);
    }

    delay(10000);  // 每10秒上报一次
}

5.6 没有硬件?用 MQTTX 工具模拟

如果你暂时没有硬件,可以用 MQTTX 桌面工具模拟设备上报数据:

  1. 下载 MQTTX:mqttx.app/
  2. 新建连接,填入上面的 MQTT 参数
  3. 连接成功后,向对应 Topic 发布 JSON 数据
  4. 回到 OneNET 平台查看设备状态是否变为「在线」,数据是否有上报

六、第 5 步:数据可视化展示

6.1 在设备详情页查看数据

最简单的方式:进入 OneNET Studio → 设备管理 → 点击你的设备 → 查看「设备详情」页面,可以看到上报的属性值和历史数据曲线。

6.2 使用 OneNET View 3.0 制作可视化大屏

这是 OneNET 提供的拖拽式可视化工具,可以做出专业的数据展示页面。

操作步骤:

  1. 在 OneNET Studio 左侧菜单找到 「数据可视化」→「OneNET View」
  2. 点击 「新建项目」,选择一个模板或空白项目
  3. 进入编辑器后,从左侧组件库拖入需要的组件:
    • 仪表盘:实时显示当前温度/湿度值
    • 折线图:显示温湿度随时间的变化趋势
    • 数字翻牌器:突出显示关键数值
    • 文字标题:添加页面说明
  4. 点击组件 → 右侧「数据」面板 → 选择数据来源:
    • 数据源类型:OneNET 设备
    • 选择你的产品和设备
    • 绑定对应的属性(temperature / humidity)
  5. 调整样式、颜色、布局
  6. 点击 「预览」 查看效果
  7. 满意后点击 「发布」,生成一个可分享的链接

6.3 通过 API 自己开发展示页面

如果你想更灵活地开发前端页面,可以调用 OneNET 的 RESTful API 获取数据:

GET https://iot-api.heclouds.com/thingmodel/query-device-property
Header: authorization: 你的Token
参数: product_id, device_name

然后用 ECharts、Chart.js 等前端图表库自行渲染。


七、常见问题

Q1: 设备一直显示「离线」?

  • 检查 MQTT 连接参数是否正确(产品ID、设备名称、Token)
  • Token 是否过期
  • 网络是否能访问 mqtts.heclouds.com:1883

Q2: 物模型和数据流有什么区别?

  • 物模型(OneJSON):结构化的,先定义属性再上传,推荐新项目使用
  • 数据流:更灵活,key-value 方式直接上传,适合简单场景

Q3: 一个账号能接多少设备?

  • 免费用户可以接入一定数量的设备(通常几十到上百台),对于学习和小项目完全够用

Q4: 数据多久刷新一次?

  • 取决于你设备端的上报频率,一般设为 5~60 秒上报一次即可

八、推荐学习资源

  • OneNET 官方文档open.iot.10086.cn/doc/v5/
  • OneNET Studio 帮助文档open.iot.10086.cn/studio/summ…
  • CSDN 搜索:「OneNET 2024 MQTT 教程」有大量图文教程
  • B站搜索:「OneNET 物联网」有视频演示教程
  • MQTTX 下载mqttx.app/ (无硬件时模拟测试)
  • Token 计算工具:OneNET 文档中心提供下载

总结:OneNET 做传感器数据采集展示的核心就是三件事 —— ① 平台上建好产品和设备,② 硬件端通过 MQTT 把数据发上去,③ 用 View 或 API 把数据展示出来。