ONENET API创建设备并返回设备密钥和设备ID

一、基本信息

1.API鉴权了解 https://iot.10086.cn/doc/aiot/fuse/detail/1464

主要有三种 需要根据不同范围使用不同的 鉴权

2.新增设备API https://iot.10086.cn/doc/aiot/fuse/detail/1465

二、python 生成token 和时间戳自动创建设备

token目录下两个文件 config.json 和 onenet_token.py这两个文件

config.json

{ "product_id": "产品ID", "access_key": "产品密钥" }

onenet_token.py

import base64 import hmac import time import json from urllib.parse import quote import requests import os def generate_onenet_token(product_id: str, access_key: str, debug: bool = False) -> str: """ 生成 OneNET 平台的鉴权Token(用于创建设备等API调用) Args: product_id: 产品ID access_key: 产品级 Access Key debug: 是否输出调试信息 Returns: 生成的鉴权Token字符串 """ version = '2018-10-31' # OneNET 平台使用此版本 resource = f'products/{product_id}' # 产品级资源格式 expiration_time = str(int(time.time()) + 3600) # 1小时后过期 method = 'sha1' # 对 Access Key 进行 base64 解码 decoded_key = base64.b64decode(access_key) # 构造签名字符串 (按 et, method, res, version 顺序) signature_string = f'{expiration_time}\n{method}\n{resource}\n{version}' # 使用 HMAC-SHA1 算法计算签名 signature_bytes = hmac.new(decoded_key, signature_string.encode(), method) signature_raw = base64.b64encode(signature_bytes.digest()).decode() # 对签名进行 URL 编码 signature_encoded = quote(signature_raw, safe='') resource_encoded = quote(resource, safe='') # 组装最终的 Token token = f'version={version}&res={resource_encoded}&et={expiration_time}&method={method}&sign={signature_encoded}' if debug: print('=== OneNET 平台 Token 生成信息 ===') print(f'产品ID: {product_id}') print(f'资源路径: {resource}') print(f'版本: {version}') print(f'过期时间: {expiration_time}') print(f'签名方法: {method}') print(f'签名字符串: {repr(signature_string)}') print(f'原始签名: {signature_raw}') print(f'最终 Token: {token}') return token def create_device_request(product_id: str, access_key: str, device_name: str, desc: str = ""): """ 创建设备的完整请求示例 """ print("=== 创建设备请求示例 ===") # 生成鉴权 Token token = generate_onenet_token(product_id, access_key, debug=True) # 请求地址 url = "https://iot-api.heclouds.com/device/create" # 请求头 headers = { "Content-Type": "application/json", "Authorization": token } # 请求体 payload = { "product_id": product_id, "device_name": device_name, "desc": desc } print(f"\n请求地址: {url}") print(f"请求方法: POST") print(f"请求头: {headers}") print(f"请求体: {json.dumps(payload, indent=4, ensure_ascii=False)}") return url, headers, payload def send_create_device_request(product_id: str, access_key: str, device_name: str, desc: str = ""): """ 发送创建设备的实际请求(需要网络连接) """ try: # 生成鉴权 Token token = generate_onenet_token(product_id, access_key) # 请求地址 url = "https://iot-api.heclouds.com/device/create" # 请求头 headers = { "Content-Type": "application/json", "Authorization": token } # 请求体 payload = { "product_id": product_id, "device_name": device_name, "desc": desc } print(f"正在发送请求到: {url}") print(f"Headers: {headers}") print(f"Payload: {payload}") # 发送请求 response = requests.post(url, headers=headers, json=payload) print(f"响应状态码: {response.status_code}") # 解析响应 try: result = response.json() print(f"响应内容: {json.dumps(result, indent=2, ensure_ascii=False)}") # 检查请求是否成功 if result.get("code") == 0: data = result.get("data", {}) print("\n=== 创建成功 ===") print(f"设备ID (did): {data.get('did')}") print(f"设备名称: {data.get('name')}") print(f"设备描述: {data.get('desc')}") print(f"设备安全密钥 (sec_key): {data.get('sec_key')}") print(f"产品ID: {data.get('pid')}") print(f"设备状态: {data.get('status')} (0-离线, 1-在线, 2-未激活)") print(f"创建时间: {data.get('create_time')}") else: print(f"\n=== 错误信息 ===") print(f"错误码: {result.get('code')}") print(f"错误消息: {result.get('msg')}") except json.JSONDecodeError: print(f"响应内容 (非JSON): {response.text}") return response except Exception as e: print(f"请求发生错误: {str(e)}") return None def load_config(config_file='config.json'): """ 从配置文件加载产品ID和Access Key """ if os.path.exists(config_file): with open(config_file, 'r', encoding='utf-8') as f: config = json.load(f) return config['product_id'], config['access_key'] else: # 如果配置文件不存在,返回None return None, None def save_config(product_id, access_key, config_file='config.json'): """ 保存产品ID和Access Key到配置文件 """ config = { 'product_id': product_id, 'access_key': access_key } with open(config_file, 'w', encoding='utf-8') as f: json.dump(config, f, indent=2, ensure_ascii=False) print(f"配置已保存到 {config_file}") if __name__ == '__main__': print('=== OneNET 平台 - 产品级鉴权(创建设备使用)===') # 尝试从配置文件加载产品信息 product_id, product_access_key = load_config() if product_id and product_access_key: print(f"从配置文件加载产品ID: {product_id}") else: # 如果配置文件不存在,提示用户输入并保存 print("配置文件不存在,请输入产品信息:") product_id = input("请输入产品ID: ").strip() product_access_key = input("请输入产品Access Key: ").strip() # 询问是否保存到配置文件 save_choice = input("是否保存配置到文件? (y/n): ").strip().lower() if save_choice == 'y': save_config(product_id, product_access_key) # 为了避免设备名称重复,添加时间戳 import datetime timestamp = datetime.datetime.now().strftime("%H%M%S") device_name = f'test_device_{timestamp}' device_desc = '测试设备' print(f"使用产品ID: {product_id}") print(f"使用设备名称: {device_name}") # 生成请求示例 create_device_request(product_id, product_access_key, device_name, device_desc) print("\n" + "="*60) print("注意:要真正发送请求,请取消下面代码的注释") print("="*60) # 如果要实际发送请求,请取消下面的注释 response = send_create_device_request(product_id, product_access_key, device_name, device_desc)

运行python

python onenet_token.py

新增设备成功

=== OneNET 平台 - 产品级鉴权(创建设备使用)=== 从配置文件加载产品ID: ** 使用产品ID: ** 使用设备名称: test_device_130110 === 创建设备请求示例 === === OneNET 平台 Token 生成信息 === 产品ID: ** 资源路径: products/** 版本: 2018-10-31 过期时间: 1769148070 签名方法: sha1 签名字符串: '1769148070\nsha1\nproducts/**\n2018-10-31' 原始签名: xx 最终 Token: token 请求地址: https://iot-api.heclouds.com/device/create 请求方法: POST 请求头: {'Content-Type': 'application/json', 'Authorization': 'token'} 请求体: { "product_id": "**", "device_name": "test_device_130110", "desc": "测试设备" } ============================================================ 注意:要真正发送请求,请取消下面代码的注释 ============================================================ 正在发送请求到: https://iot-api.heclouds.com/device/create Headers: {'Content-Type': 'application/json', 'Authorization': 'token'} Payload: {'product_id': '**', 'device_name': 'test_device_130110', 'desc': '测试设备'} 响应状态码: 200 响应内容: { "code": 0, "data": { "did": 2536174570, "pid": "**", "access_pt": 2, "auth_info": "test_device_130110", "data_pt": 1, "name": "test_device_130110", "desc": "测试设备", "status": 2, "create_time": "2026-01-23T13:01:11.907318222+08:00", "activate_time": "0001-01-01T00:00:00Z", "last_time": "0001-01-01T00:00:00Z", "imsi": "", "imei": "", "psk": "", "group_id": "", "enable_status": true, "tags": null, "lat": "", "lon": "", "auth_code": "", "sec_key": "##=", "chip": 0, "obsv": false, "obsv_st": false, "private": false, "imsi_old": [ "" ], "imsi_mt": "0001-01-01T00:00:00Z", "intelligent_way": 1, "viot_protocol": 1 }, "msg": "succ", "request_id": "08d262e58847445aafaaa3d925de1d66" } === 创建成功 === 设备ID (did): 2536174570 设备名称: test_device_130110 设备描述: 测试设备 设备安全密钥 (sec_key): ## 产品ID: ** 设备状态: 2 (0-离线, 1-在线, 2-未激活) 创建时间: 2026-01-23T13:01:11.907318222+08:00

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1206273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导师严选2026 TOP10 AI论文平台:专科生毕业论文全场景测评

导师严选2026 TOP10 AI论文平台:专科生毕业论文全场景测评 2026年AI论文平台测评:专科生毕业论文必备工具全解析 随着人工智能技术的不断进步,越来越多的专科生开始借助AI写作工具提升毕业论文的撰写效率。然而,面对市场上种类繁…

GITLAB Docker 容器化部署指南 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:【ComfyUI】Stable Zero123 单图生成3D视图

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

TB352FC原厂刷机包免费下载_CN_ZUI_16

原厂刷机包下载 https://pan.quark.cn/s/5cf2fdae58c2联想平板电脑 昭阳 K11原厂刷机包下载 转载请标注来源: 所有固件都是我手动上传的,不是机器人或程序,保持固件更新不是我的义务。如果你发现设备有系统更新,而…

npm 离线安装软件包指南(离线安装 claude code)

本文以离线安装 anthropic-ai/claude-code(Claude Code 客户端)和 musistudio/claude-code-router(Claude Code Router)为例,介绍如何通过 npm 原生命令实现离线全局安装。该方法适用于任何 npm 包的离线安装场景。 流…

导师推荐!MBA必看10个AI论文网站测评

导师推荐!MBA必看10个AI论文网站测评 2026年MBA学术写作工具测评:为什么你需要这份指南 随着人工智能技术在学术领域的广泛应用,AI论文网站已成为MBA学生和研究者不可或缺的辅助工具。然而,面对市场上五花八门的平台,如…

消费增值:让顾客回头的新商业密码

做生意的人都明白一个道理:吸引新顾客的成本,是留住老顾客的5倍。但问题是,怎么才能让顾客真正留下来,而且愿意持续消费? 今天我要介绍的消费增值模式,可能就是你一直在寻找的答案。 一、市场痛点&#x…

C++小项目: 通讯录管理系统

#include <iostream> #include <string> using namespace std; const int MAX=1000;//联系人结构体 struct Person{string name;int gender;int age;int phoneNum;string address; }; //通讯录结构体 stru…

为什么 loss 几乎没用:微调里最容易让人“自嗨”的指标

loss 在微调里不是没用,而是作用范围被严重高估了。它能告诉你“训练有没有在跑”,却几乎无法告诉你“模型有没有变成你想要的样子”。如果你把 loss 当成主要决策依据,那你很可能会在一条看起来很平滑的曲线上,慢…

LoRA 不是“免费午餐”:你省下的算力,往往会在别的地方还回去

LoRA 确实解决了很多现实问题,这一点没有任何争议。但问题在于,LoRA 被过度神话了。很多人把它当成了一种“几乎没有代价的微调方式”,仿佛只要挂上 LoRA,就能放心大胆地训练。而真实工程里,LoRA 带来的,从来不是…

ABC242Ex Random Painting 题解

ABC242Ex Random Painting 题解题目描述 给定数轴 \([1,n]\) 上的 \(m\) 个区间 \([l_i,r_i]\) ,每次随机取出一个区间并放回,求期望取多少次后能被取出的区间能覆盖 \([1,n]\) ,对 \(998244353\) 取模。 数据范围\…

2026年正规的防火卷帘门生产厂家与无机卷帘门品牌的优质选择

在选择正规的防火卷帘门企业和品牌时,了解市场动态与产品特点是至关重要的。市场上有不少企业提供防火卷帘门,质量各异。因此,用户应关注企业是否具备必要的生产资质、认证及良好的行业信誉。同时,产品的设计与技术…

大数据领域存算分离:云环境下的最佳实践

大数据领域存算分离&#xff1a;云环境下的最佳实践 关键词&#xff1a;存算分离、云原生、大数据架构、弹性扩展、成本优化 摘要&#xff1a;在大数据时代&#xff0c;传统"存算一体"架构因资源浪费、扩展僵化等问题逐渐被淘汰。本文将以"餐馆厨房与仓库的进化…

Flink与Elasticsearch集成:实时大数据搜索方案

Flink与Elasticsearch集成&#xff1a;实时大数据搜索方案实践 引言 痛点引入&#xff1a;为什么需要实时大数据搜索&#xff1f; 在数字化时代&#xff0c;实时性已成为企业竞争力的核心要素。比如&#xff1a; 电商平台需要实时展示用户浏览过的商品&#xff0c;并推荐相关产…

uv vs pip:为什么现代Python包管理工具能快100倍?

uv vs pip:为什么现代Python包管理工具能快100倍?Posted on 2026-01-23 19:19 steve.z 阅读(0) 评论(0) 收藏 举报uv vs pip:为什么现代Python包管理工具能快100倍? 引言:一个普遍的Python开发痛点 如果你是…

「LUCKY STUN穿透」使用webhook自动修改 qbittorrent 的监听端口

「LUCKY STUN穿透」使用webhook自动修改 qbittorrent 的监听端口「LUCKY STUN穿透」使用webhook自动修改 qbittorrent 的监听端口 2024.02.08 在 lucky stun 穿透获得的外部端口发生变化后除了要修改路由设备上的映射规…

大数据领域数据预处理:优化数据存储与管理的关键

大数据领域数据预处理:优化数据存储与管理的关键 关键词:大数据预处理、数据清洗、数据集成、数据转换、数据归约、存储优化、管理效率 摘要:在大数据时代,数据预处理作为数据生命周期管理的核心环节,直接影响数据存储效率、分析质量和应用价值。本文系统解析数据预处理的…

android MQTT封装

单纯的记录一下代码 1. build.gradle implementation org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5 implementation org.eclipse.paho:org.eclipse.paho.android.service:1.1.1 2. activity_mian.xml <?xml version"1.0" encoding"utf-8"…

「LUCKY STUN穿透」使用邮件通知端口变化情况

「LUCKY STUN穿透」使用邮件通知端口变化情况「LUCKY STUN穿透」使用邮件通知端口变化情况 2024.05.21 在之前的一系列教程中我们介绍了一些STUN的用法 其中也包括了固定或更新端口的方法 但还有许多服务我们还不能实现…

「LUCKY STUN穿透」在Windows下使用VNT组网为非HTTP服务固定STUN穿透端口

「LUCKY STUN穿透」在Windows下使用VNT组网为非HTTP服务固定STUN穿透端口「LUCKY STUN穿透」在Windows下使用VNT组网为非HTTP服务固定STUN穿透端口 2024.10.23 索引文章结构 索引 │ ├─关于本教程 │ ├─已知的解决…