最近在帮同学解决毕设问题,接触到了onenet物联网平台,发现网上找到的都是旧版本的教程,而且官方文档给的实在是过于混乱,对于新手特别不友好,于是在这里记录一下我的调试结果和思路。
首先我们进入到onenet官网https://open.iot.10086.cn/,注册登录,并点进右上角的控制台,进入到控制台页面,如下图所示
我们可以大概看到Studio的功能主要分为两大部分:我的产品,我的项目
我的产品: 指的是将物联网设备接入平台
我的项目: 对前端应用的开发
我们是要将树莓派获取到的数据上传,所以属于对我的产品进行开发
平台概览: 大家可以自行看下了解下
设备接入与管理: 重点,所有操作都是在此完成
产品:一组相同功能的设备的集合
设备:具体的设备,产品的子集,比如我的设备就是树莓派
3.1 点击产品管理–添加产品
产品名称和省市自己填就好了重点是产品类别,选择和自己要开发的接近的
节点类型直连,接入协议http,联网方式wifi,点击确定
3.2 现在我们进入刚创建好的产品页面查看,可以看到具体信息
这里重点看一下物模型,这里会大家选择的产品类别自动帮你生成一些物模型,简单说就是帮你定义好了一些数据名,提高开发效率,为了演示,我这里只保留一个温度的数据。
点击–设置物模型–批量删除,就可以删除你不需要的数据名
3.3 接入设备
点击左侧的设备管理—添加设备–输入设备名字,即可完成创建
点击详情,可以看到设备详情,已经自动有了温度属性,但是没有数据,接下来就是http上传数据
在这里卡了很久,对于一个新手,官网文档的体验实在是太糟糕了,根本无从下手,新版旧版的接口不同,文档中也没有标注。
这里整理了新版接口的文档,供大家参考。
.http接入简介 了解大致接入流程
https://open.iot.10086.cn/doc/iot_platform/book/device-connect&manager/HTTP/HTTP-introduce.html
.设备属性上报API(设备属性就是设备数据,比如我的温度就是我新建的树莓派设备的属性)
https://open.iot.10086.cn/doc/iot_platform/book/device-connect&manager/HTTP/api/devicePropertyNotify.html
.接入安全认证(http请求时需要在header加入token参数,这里介绍了token的生成原理)
https://open.iot.10086.cn/doc/v5/develop/detail/624
大家尽量多看看文档,看不懂的结合下一步的POST测试就能看懂了
1. 根据http简介里的说明和设备属性上报API的说明, POST的地址为
https://open.iot.10086.cn/studio/http//device/thing/property/post?topic=$sys/产品ID/设备名称/thing/property/post&protocol=http
2.POST参数
参数我们直接复制官方提供的参数,自己修改
https://open.iot.10086.cn/doc/iot_platform/book/device-connect&manager/thing-model/protocol/OneJSON/property&event.html
我这里复制是上传设备属性,并且只保留了一个
注意:改好标识符,复制之前的物模型的标识符
{
"id": "123",
"version": "1.0",
"params": {
"CurrentTemperature": {
"value": 23
}
}
}
3.header参数
有两个
Content-Type:application/json
token:version=2018-10-31&res=products%*****************
token具体是什么请参考这里 https://open.iot.10086.cn/doc/v5/develop/detail/624
官方提供了工具,输入自己的参数后可以自动生成
随便找一个在线post的网站,填入我们上一步的内容
返回的信息是成功了
我们在OneNet网页里的设备里刷新,发现已经有数据显示了
如果失败了可以自己排查下问题
既然在线post成功了,python实现就很简单了,直接附上代码
"""
@author:xiaoing
@Time:2022/4/14 10:34
@Version: v1.0
"""
import urllib.request
import json
import time
from time import sleep
# 设备名
deviceId = ""
# 产品id
product_id = ""
# 产品key
APIKey = ""
# 鉴权token详见https://open.iot.10086.cn/doc/v5/develop/detail/624
token = "version=2018-10-31&res=products%***********"
# 上传函数,调用的是设备属性API
def http_put_data(data):
url = "https://open.iot.10086.cn/studio/http//device/thing/property/post?topic=$sys/" + \
product_id+"/"+deviceId+"/thing/property/post&protocol=http"
d = time.strftime('%Y-%m-%dT%H:%M:%S')
# CurrentTemperature是物模型的标识符,数值这里直接给了固定数date
values = {
"id": "123",
"version": "1.0",
"params": {
"CurrentTemperature": {
"value": data
},
"LightLux": {
"value": data
}
}
}
header = {"Content-Type": "application/json", "token": token}
jdata = json.dumps(values).encode("utf-8")
request = urllib.request.Request(url, jdata, header)
request.get_method = lambda: 'POST'
request = urllib.request.urlopen(request)
return request.read()
if __name__ == '__main__':
R = http_put_data(10)
print(R)
写的比较乱,不想研究的直接复制python代码配置参数运行就好了,可以满足上传传感器数据的需要。