物联网平台设备接入
设备接入物联网平台的协议是MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)。要完成设备的接入需要做以下步骤
1. 项目注册
业务侧提供项目信息,包括项目名称和所属场景。物联网平台运营人员为业务侧创建调用OPENAPI时的Accesskey和访问密码,在获取JWT时使用,创建Accesskey时需要提供企业ID,例如:思特奇是10000;11位手机号码或者客户标识号(可以自动生成);创建时输入的密码,可以是业务侧提供或客户标识号的后6位;项目的ID
2. 设备注册
确认设备的类别,型号,联网方式,是否满足业务需要。产品既是设备的类别,联网方式主要确定设备是接入边缘网关,还是直接接入物联网平台,接入边缘网关的通信协议等
产品注册
产品等同于设备的类别,产品名称,产品类别,用在哪个行业、产品型号、联网方式等,创建产品实例,生成产品唯一标识ProductKey。根据产品的属性和提供的服务,创建物模型
添加设备
添加设备时生成设备的唯一标识ProductKey + DeviceName。添加成功后返回连接MQTT服务器的参数clientid,username,password,这些参数供设备连接物联网平台使用
# MQTT服务器地址
broker = "tcp://mqtt.thingshub.com.cn:1883"
# ${ProductKey}:${DeviceName}
username = ""
# 添加设备时生成的secret
password = ""
# ${ProductKey}:${DeviceName}
clientid = ""
3. 设备端开发
若设备的联网协议不是MQTT,需要做设备端开发,完成数据传输协议的转换,由设备自身联网协议转换成MQTT
4. 业务侧开发
业务侧接收设备上报数据接口开发,数据上行(设备→业务应用)
物联网平台调用业务侧接口推送设备上报的属性数据和事件数据。参考实现如下:
请求URL
业务侧定义
请求方法
POST
Content-Type
application/json
请求参数
参数 | 数据类型 | 是否必填 | 说明 |
---|---|---|---|
productKey | string | 是 | ProductKey |
deviceName | string | 是 | DeviceName |
method | string | 是 | 消息类型 |
timestamp | int64 | 是 | 请求时间戳。单位毫秒 |
nonce | string | 是 | 一次性随机数 |
signature | string | 否 | 消息签名 |
消息类型 method
事件。thing.event.${identifier} ,其中identifier标识事件标识,用于区分事件种类
属性。thing.event.property.post
请求体
参数 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
id | string | 是 | 消息ID |
productKey | string | 是 | ProductKey |
deviceName | string | 是 | DeviceName |
method | string | 是 | 消息类型 |
version | string | 是 | 消息版本。默认1.0 |
timestamp | int64 | 是 | 时间戳。单位毫秒 |
params | object | 是 | 消息内容 |
响应参数
参数 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
code | int | 是 | 返回码 |
msg | string | 是 | 返回消息 |
返回码
成功。200
失败。500
URL样例
http://host:port/device/message?productKey=${productKey}&deviceName=${deviceName}&method=${method}×tamp=${timestamp}&nonce=${nonce}&signature=${signature}
请求样例
{
"id": "1",
"productKey": "a",
"deviceName": "b",
"method": "thing.event.property.post",
"version": "1.0",
"timestamp": 0,
"params": {
"temperature": 36.5
}
}
响应样例
{
"code": 200,
"msg": "success"
}
安全性
提供消息验证和完整性服务
# productKey 是请求参数中 productKey 的值
# deviceName 是请求参数中 deviceName 的值
# method 是请求参数中 method 的值
# timestamp 是请求参数中 timestamp 的值
# nonce 是请求参数中 nonce 的值
# content是请求体内容
# 密钥是accesskey
# HmacSHA256 算法
HmacSHA256(${productKey}${deviceName}${method}${timestamp}${nonce}${content})
业务侧通过调用物联网平台提供的OPENAPI完成设备的远程控制,数据下行(业务应用→设备)
Thingshub OPENAPI
https://www.thingshub.com.cn/openapi/v2/function/InvokeCustomizedService
见附件
附
设备上报属性消息样例
// 实时上报
{
"id": "", // UUID
"productKey": "", // 注册产品时返回的ProductKey
"deviceName": "", // 添加设备时的DeviceName
"method": "thing.event.property.post", // 设备属性上报
"version": "1.0", // 固定值1.0
"timestamp": 0, // 消息时间戳
"params": {
"temperature": 36.50
}
}
设备上报事件消息样例
// 事件触发后上报
{
"id": "", // UUID
"productKey": "", // 注册产品时返回的ProductKey
"deviceName": "", // 添加设备时的DeviceName
"method": "thing.event.${identifier}", // 设备事件上报。
"version": "1.0", // 固定值1.0
"timestamp": 0, // 消息时间戳
"params": {
"temperature": 38.20
}
}