基于新版onenet的http上报设备数据python代码适用树莓派和本地

本文介绍了如何使用新版OneNET的HTTP接入方式,包括URL构建、请求头设置(尤其是Content-Type和token获取)、设备属性信息(如OneJson格式)以及提供了一个Python示例代码来帮助用户进行设备属性上报。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

       最近onenet也是彻底停止了多协议接入的新添产品和设备

也是想折腾一下新版onenet的接入,在搞这个东西的时候还是遇到一些问题,这个物模型设置属性貌似需要设备在线所以想试一下用http接入。

      也希望可以帮助大家

新版的http接入开发文档:OneNET - 中国移动物联网开放平台 (10086.cn)

自己跟着api应该可以学到很多东西

这里截取了官方开发文档的一部分    

二、url分析:

可以看到   属性上报地址是 adress+url       其实也是对应了代码的   

url = f"https://open.iot.10086.cn/fuse/http/device/thing/property/post?topic={topic}&protocol={protocol}"

三、请求头:

那么请求头headers:也是官方文档提到的重点:

包括两部分:Content-Type和token

Content-Type:application/json

那么还有token

token需要官方工具:token1.0

token工具的参数:

res:products/产品ID/devices/设备名字

et:时间戳,比现在的时间戳大就行,获取地址:时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)

key:设备的密钥(不是产品的啊)

四、设备属性信息body

讲完了http的url,请求头,接下来就是body

官方开发文档中的这个就是OneJson格式:

body = {
"id": "123",
"version": "1.0",
"params": {
"temp": {"value": 27},
"RH": {"value": 84}
}
}

也是对应了代码的body  我在产品里添加的RH和temp标识符,可以看一下

五、python代码:用代码之前请关掉你的魔法工具

import requests
import json

# 直连设备属性上报
def report_device_property():
    # 设备信息
    product_id = "产品id"
    device_name = "设备名字"

    # 构造topic和protocol参数
    topic = f"$sys/{product_id}/{device_name}/thing/property/post"
    protocol = "http"

    # 构造完整的URL
    url = f"https://open.iot.10086.cn/fuse/http/device/thing/property/post?topic={topic}&protocol={protocol}"

    # 请求头部信息
    headers = {
        "Content-Type": "application/json",
        "token": "你的token"
    }

    # 设备属性信息
    body = {
        "id": "123",
        "version": "1.0",
        "params": {
            "temp": {"value": 27},
            "RH": {"value": 84}
        }
    }

    # 发送POST请求
    response = requests.post(url, headers=headers, json=body)
    print("Response:", response.json())

# 测试直连设备属性上报
report_device_property()

<think>好的,用户现在需要根据之前分析的设备模拟器登录信息,输出一个树莓派传输数据OneNET的完整代码。首先,我得回顾之前的对话,了解用户的问题所在。之前用户提供的登录信息中存在Token生成参数版本过时签名算法使用MD5的问题,以及有效期过长。在回答中已经给出了修正后的Python示例,现在用户需要完整的传输代码。 接下来,我需要考虑树莓派通常使用Python进行数据传输,所以代码应该用Python编写。OneNET常用的协议是MQTT,所以需要使用MQTT客户端库,比如paho-mqtt。同时,代码需要生成符合最新规范的Token,使用HMAC-SHA256,版本号2022-05-01,并且处理URL编码。 然后,用户可能需要代码结构清晰,包含必要的注释,方便理解修改。需要包括生成Token的函数,连接MQTT服务器的逻辑,数据上传的函数,以及主循环处理。此外,异常处理重连机制也很重要,确保稳定性。 还要注意设备密钥等敏感信息的处理,提醒用户替换占位符,并确保密钥的安全性。可能需要指导用户如何安装所需的库,比如paho-mqttrequests。 另外,用户可能需要代码验证步骤,比如连接测试、数据发送示例,以及如何查看数据是否成功上传OneNET平台。常见问题排查部分也需要涵盖,比如网络问题、Token错误、时间同步等。 需要确认代码是否包含所有必要的部分:生成正确的Token,建立MQTT连接,发布数据到正确的主题,处理断开连接的情况,以及示例数据发送。同时,要确保代码中的参数如产品ID、设备ID、API密钥等都被正确替换。 最后,检查代码是否符合OneNET的最新文档要求,避免使用过时的方法或参数。确保代码中的URL编码处理正确,比如替换斜杠为%2F,签名计算正确使用HMAC-SHA256,并且Token参数版本正确。 总结下来,步骤包括:导入库、定义生成Token的函数、MQTT连接回调、数据发送函数、主函数配置参数并启动循环,以及示例用法。此外,提供安装命令验证步骤,帮助用户顺利运行代码。</think>--- ### **基于PythonOneNET MQTT数据上传完整代码**(适配树莓派) ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- import time import hmac import json import base64 import hashlib import paho.mqtt.client as mqtt from urllib.parse import quote # ========== 配置区(根据实际情况修改)========== PRODUCT_ID = "nkJ8872V0U" # 产品ID DEVICE_ID = "Device_01" # 设备ID DEVICE_SECRET = "你的设备密钥" # 从OneNET控制台获取 DATA_STREAM = "temperature" # 数据流名称(自定义) # ========== Token生成函数 ========== def generate_token() -> str: """生成符合OneNET 2022规范的设备Token""" version = "2022-05-01" et = str(int(time.time()) + 3600) # 有效期1小时 res = f"products/{PRODUCT_ID}/devices/{DEVICE_ID}" method = "sha256" # 计算签名(注意密钥需要base64解码) key = base64.b64decode(DEVICE_SECRET) message = f"{res}\n{method}\n{et}".encode('utf-8') signature = hmac.new(key, message, digestmod=hashlib.sha256).digest() sign = base64.b64encode(signature).decode() # URL编码特殊字符 encoded_res = quote(res, safe='') # 强制编码/ return f"version={version}&res={encoded_res}&et={et}&method={method}&sign={sign}" # ========== MQTT回调函数 ========== def on_connect(client, userdata, flags, rc): """连接成功回调""" if rc == 0: print("[成功] 已连接到OneNET平台") else: print(f"[错误] 连接失败,错误码:{rc}") def on_disconnect(client, userdata, rc): """连接断开回调""" print(f"连接断开,正在尝试重连... (错误码: {rc})") client.reconnect() # ========== 数据上传函数 ========== def upload_data(client, value: float): """发送数据OneNET""" timestamp = int(time.time() * 1000) # 精确到毫秒 payload = { "id": "123", # 消息ID(可自定义) "dp": { DATA_STREAM: [ { "v": value, "t": timestamp } ] } } topic = f"$sys/{PRODUCT_ID}/{DEVICE_ID}/dp/post/json" # 数据点主题 client.publish(topic, json.dumps(payload), qos=1) print(f"已发送数据:{value} ℃") # ========== 主程序 ========== def main(): # 创建MQTT客户端 client = mqtt.Client(client_id=DEVICE_ID, protocol=mqtt.MQTTv311) client.username_pw_set(username=PRODUCT_ID, password=generate_token()) # 设置回调 client.on_connect = on_connect client.on_disconnect = on_disconnect # 连接服务器 client.connect("mqtts.heclouds.com", 1883, 60) client.loop_start() try: while True: # 示例:读取传感器数据(此处模拟随机数) sensor_value = 25.3 + (time.time() % 10)*0.1 # 模拟温度波动 upload_data(client, sensor_value) time.sleep(60) # 每分钟发送一次数据 except KeyboardInterrupt: client.disconnect() print("\n程序已终止") if __name__ == "__main__": main() ``` --- ### **代码使用说明** #### 1. 环境准备 ```bash # 安装依赖库(树莓派需先执行) sudo pip3 install paho-mqtt cryptography ``` #### 2. 配置修改 - 替换 `DEVICE_SECRET` 为设备**真实密钥**(在OneNET控制台 > 设备管理 > 设备详情中查看) - 根据需要修改 `DATA_STREAM` 名称(需与平台数据流名称一致) #### 3. 运行测试 ```bash chmod +x onenet_mqtt.py ./onenet_mqtt.py ``` --- ### **关键代码解析** | 代码模块 | 功能说明 | |------------------|--------------------------------------------------------------------------| | `generate_token` | 动态生成符合2022版规范的Token,自动处理URL编码SHA256签名 | | `upload_data` | 构建符合OneNET JSON格式的数据包(支持多数据流扩展) | | MQTT主题 | `$sys/{产品ID}/{设备ID}/dp/post/json` 是官方规定的数据上报主题 | | 断线重连机制 | 通过`on_disconnect`回调实现自动重连 | --- ### **数据验证方法** 1. **控制台查看**: - 登录[OneNET控制台](https://open.iot.10086.cn/) - 进入设备详情页 > 数据流查看实时数据 2. **API查询**: ```bash curl -X GET \ "https://api.heclouds.com/devices/Device_01/datastreams/temperature" \ -H "api-key: 你的API_KEY" ``` --- ### **常见问题处理** | 现象 | 解决方案 | |--------------------------|--------------------------------------------------------------------------| | 连接超时 | 检查树莓派网络连接,测试 `ping mqtts.heclouds.com` | | 错误码5(鉴权失败) | 检查设备密钥是否正确,确认Token生成中的`res`格式 | | 数据未显示 | 检查数据流名称是否与控制台一致,确认JSON格式符合规范 | | 高CPU占用 | 调整`time.sleep()`间隔,避免频繁发送数据 | --- ### **扩展功能建议** 1. **多传感器支持**: ```python # 修改payload结构 "dp": { "temperature": [{"v": 25.3, "t": 1677648231000}], "humidity": [{"v": 68, "t": 1677648231000}] } ``` 2. **本地数据缓存**: ```python import sqlite3 # 断网时将数据保存到本地数据库 conn = sqlite3.connect('sensor_data.db') c = conn.cursor() c.execute('CREATE TABLE IF NOT EXISTS data (timestamp INTEGER, value REAL)') ``` 3. **报警阈值设置**: ```python if sensor_value > 30: client.publish("$sys/.../post/alarm", json.dumps({"msg": "温度过高!"})) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式学不会不改名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值