最近在实现esp32收集数据通过MQTT上报数据,小程序获取ONENET数据并在实现小程序调用API接口获取数据下卡壳很久,终于弄出来记录一下。
刚开始一直报错: (来自ONENET文档中心OneNET - 中国移动物联网开放平台)
后来阅读文档发现并不是直接在headert添加api-key,原因是
因为进行了token算法加密,从而发送的请求header从原来的 api-key变成 Authorization,而则是由res,et,key,method组成,接下来详细介绍这四个参数,以及生成的Authorization
res:products/586xxx/devices/106253xxxx
其中api.heclouds.com是ONENET的API服务地址,586xxx是你的产品ID,106253xxxx是你的设备ID
et:1711698292
是时间戳,建议时间要往后,避免失效,这个是时间戳转换工具网址https://tool.lu/timestamp/
key:xxxxxxxxHPDmyOaWahZtWullKy0QEDv2NN6vcVgw=
这个是access_key,每个用户设备都有唯一的key
method:sha1是签名方法
然后通过ONENET官方提供的工具进行计算出Authorization(链接https://open.iot.10086.cn/doc/mqtt/images/tools/token.exe)
终于得到啦
Authorization:version=2018-10-31&res=products%xxxxx452&et=xxxxxxxx92&method=sha1&signxxxxxxxxxxxxV%2FsGa4mUInArPSTI%3D
然后将header里面原来的api-key的替换Authorization成就可以获取ONENET物联网平台的数据了
API调试工具在线网站:Apipost-基于协作,不止于API文档、调试、Mock、自动化测试
部分核心代码:
wx.request({
url:"http://api.heclouds.com/devices/"+ deviceid +"/datastreams?datastream_id",
//设备ID
//api-key
header:{
//'content-type': 'application/x-www-form-urlencoded',
"Authorization":apiID
},
data:{
limit:1
},
method :"GET",
success: function (res) {
console.log(res)
wx.showToast({
title: '连接成功',
icon: 'success',
mask: true
})
console.log("data is ", res.data)
// 进行数据处理
that.setData({
//tem_value:res.data.data.datastreams[0].datapoints[0].value,
})
},
fail: function (res) {
console.error('连接 MQTT 服务器失败')
// 进行错误处理
}
})