设备接入概述
设备接入概述
概述
本文主要描述了如何注册和管理云平台设备.
前端设备主要通过消息订阅/发布模式以和云端消息队列进行通信
本文定义的接口主要供前端设备调用.
系统前缀
API:
http(s)://{domain-name}/v2/stream/
版本
V2.0
作者
@author ChengZhen
修改历史
2019/4/21
- 添加公共组件
- 移出 HTTP API
2019/2/13
- 重写 API
2018/10/9
- 修改注册消息内容, 添加事物描述等信息
- 删除设备状态 API
- 修改边缘节点管理 API 名称
- 添加新的签名算法
消息主题
前端设备通过消息队列和服务器进行通信,下面是主要的消息主题:
messages - 上行主题
/messages/:did
did
设备 ID
前端设备通过这个主题向云端发送消息
- 只有认证的设备有发布的权限
- 只有认证的服务器有订阅的权限
actions - 下发主题
/actions/:did
did
设备 ID
前端设备通过订阅这个主题接收云端下发的消息
- 只有认证的设备有订阅的权限
- 只有认证的服务器有发布的权限
消息类型
云平台将所有设备和云, 设备和设备之间的通信数据统称为消息.
消息通常是 JSON 格式:
普通消息
普通消息格式
{
"did": String,
"type": "message",
"data": {}
}
did
设备的 ID, 由设备端定义,必须是唯一的type
消息的类型data
消息的内容
数据流消息
前端设备通过发送这个消息来主动上报数据流和属性值
{
"did": String,
"token": String,
"timestamp": Number,
"type": "stream",
"data": {
"<name>": {
"points": [{
"isOn": false,
"temperature": 25.5,
"battery": 95,
"status": "on",
"at": 1234567890
}],
"tags": {
"location": "d2s"
}
}
}
}
did
设备的 IDtype
消息类型总是为stream
token
设备访问令牌timestamp
时间戳data
数据流name
数据流的名称points
数据点数组tags
标签信息
操作消息
请求消息
云端通过发送这个消息来调用设备指定的操作方法
{
"did": String,
"mid": String,
"type": "action",
"data": {
"<name>": <input>
}
}
did
设备 IDtype
消息类型总是为action
mid
消息 IDdata
操作数据name
操作名称input
{any} 输入参数
应答消息
设备通过发送这个消息向云端返回操作调用结果
{
"did": String,
"mid": String,
"type": "action",
"result": {
"<name>": <output>
}
}
did
设备 IDtype
消息类型总是为action
mid
消息的 ID, 必须和相关的请求消息的 mid 相同result
操作结果name
操作名称output
输出参数
错误消息
设备通过发送这个消息向云端返回操作调用结果
{
"did": String,
"mid": String,
"type": "action",
"result": {
"<name>": {
"code": Number,
"error": String
}
}
}
did
设备 IDtype
消息类型总是为action
mid
消息的 ID, 必须和相关的请求消息的 mid 相同result
操作结果name
操作名称code
错误码error
错误短语
属性消息
读取属性消息
云端通过发送这个消息来读取设备的属性值
{
"did": String,
"mid": String,
"type": "action",
"data": {
"read": ["<name>"]
}
}
did
设备的 IDmid
消息 IDtype
消息类型总是为action
data
要读取的属性read
读取操作name
可选,要读取的属性的名称
应答消息
{
"did": String,
"mid": String,
"type": "action",
"result": {
"read": {
"<name>": <value>
}
}
}
did
设备的 IDmid
可选的消息 ID,和 read 消息的 mid 相同type
消息类型总是为action
result
操作结果read
读取操作name
属性的名称value
{any} 属性的值
修改属性消息
云端通过发送这个消息来修改设备的属性值
{
"did": String,
"mid": String,
"type": "action",
"data": {
"write": {
"<name>": <value>
}
}
}
did
设备的 IDmid
消息 IDtype
消息类型总是为action
data
要修改的属性write
修改操作name
要修改的属性的名称value
要修改的属性的值
应答消息
{
"did": String,
"mid": String,
"type": "action",
"result": {
"write": {
"code": 0
}
}
}
did
设备的 IDmid
可选的消息 ID,和 read 消息的 mid 相同type
消息类型总是为action
result
操作结果write
修改操作code
执行结果, 0 表示执行成功,否则表示错误码
事件消息
设备通过发送这个消息来发布事件通知
{
"did": String,
"token": String,
"timestamp": Number,
"type": "event",
"data": {
"<name>": <data>
}
}
did
设备的 IDtoken
设备访问令牌timestamp
时间戳type
消息类型总是为event
data
事件数据name
事件名称data
{any} 事件的内容
注册消息
注册请求消息
设备通过发送这个消息向服务端注册
{
"did": String,
"type": "register",
"sign": String,
"data": {}
}
- did 设备的 ID
- type 消息类型总是为
register
- sign 设备签名
- data 设备事物描述, 具体格式请参考
事物描述
一文
注册应答消息
由云端返回给设备
{
"did": String,
"type": "register",
"result": {
"id": String,
"token": String,
"expires": Number,
}
}
- did 设备的 ID
- type 消息类型总是为
register
- result 注册信息
- expires 注册有效期, 单位为秒,
-1
表示注销注册 - token 设备访问令牌, 注册有效期内可用
- expires 注册有效期, 单位为秒,
注册错误消息
由云端返回给设备
{
"did": String,
"type": "register",
"result": {
"code": Number,
"error": String
}
}
- did 设备的 ID
- type 消息类型总是为
register
- result 注册结果
- code 错误码
- error 错误信息
更多信息请参考设备注册
一节
设备接入
接入方式
设备直连接入
设备通过有线, BN-IoT 或 4G 等直接连接到物联网云平台
- 有线以太网
- 无线局域网
- BN-IoT 窄带广域网
- 4G
通过网关接入
设备通过 Bluetooth, Modbus 等连接到网关,再间接连接到物联网云平台
- RS485/Modbus
- 工业以太网
- Bluetooth
- ONVIF/RTSP 适合网络摄像机等
接入协议
平台支持多种主流接入协议,以便适应不同类型的设备,下面是不同协议的特点。
CoAP (LwM2M)
- 使用 NB-IoT 网络;
- 对成本和功耗十分敏感;
- 对数据传输的实时性要求不高;
- 存在海量连接
- 对于覆盖广度要求高;
MQTT
- 使用 4G 网络或有线宽带
- 需要保持长连接状态;
- 需要实时接收控制指令;
- 有充足的电量支持设备保持在线;
HTTP
- 只上报传感器数据到平台;
- 无需下行控制指令到设备;
- 适合简单数据上报场景
Modbus
- 采用串行或网线有线通信;
- 需要通过支持 modbus 协议 DTU 中转
- 适用于连接标准 modbus 协议通信设备
Bluetooth
- 采用短距离无线通信;
- 对功耗极端敏感;
- 需要通过支持 Bluetooth 协议网关中转
设备接入流程
start=>start: 开始开发
sub2=>operation: 创建产品
sub3=>operation: 创建设备
sub4=>operation: 注册设备
sub5=>operation: 状态上报
sub6=>operation: 设备操作
start(right)->sub2(right)->sub3(bottom)->sub4(right)->sub5(right)->sub6
图1. 设备接入流程
- 准备硬件方案,移植 SDK 或实现通信协议
- 在平台上创建新的产品
- 为新的产品创建新的设备
- 使用创建的设备的 ID 和密钥,将硬件设备注册到云平台
- 向云平台上报状态信息
- 向云平台订阅操作消息,接收并处理云平台发送的操作请求
设备注册
# 示意图
设备->网管服务: 1)注册 (POST /register) 设备描述信息
网管服务->数据库: 2)查询并验证设备
数据库-->网管服务: 2)设备属性
网管服务-->设备: 1)返回访问令牌等注册信息
设备->网管服务: 3)更新注册 (POST /register)
网管服务-->设备: 3)返回注册信息
设备->网管服务: 1)注销注册 (POST /register with -1)
网管服务-->设备: 1)返回注销成功信息
图2. 设备注册通信流程
设备注册流程:
- 通过 APP 或串口配置设备注册参数
- 设备向配置的服务器地址发送注册请求
- 设备接收并保存云平台返回的注册信息
- 设备向云平台订阅操作消息主题
- 设备定时向云平台上报设备状态和数据流
- 需要时设备上云平台发送注销请求
- 注销成功即可关闭设备,不再上报数据和处理云端操作命令
添加设备
设备注册的目的是为了取得设备的 ID, 并验证设备的合法性, 在注册之前必须先在云端创建相关的设备
设备在线状态
需要根据不同接入协议来判定设备的在线状态
- HTTP
设备注册到云端视为上线, 在控制台显示为在线状态 当超时没有收到设备的任何数据时 (如 30 分钟) 视为下线, 在控制台显示为离线状态
- MQTT
设备注册到云端视为上线, 在控制台显示为在线状态 当设备断开和 MQTT 服务端的连接时视为下线, 在控制台显示为离线状态
- CoAP
设备注册到云端视为上线, 在控制台显示为在线状态 设备通过心跳消息保持在线状态 当 CoAP 服务器超时没有收到设备的心跳消息时 (如 2 分钟) 视为下线, 在控制台显示为离线状态
设备属性
读取属性
应用程序可以远程读取设备属性
设备->消息队列: 订阅 actions/:did
应用程序->消息队列: 订阅 messages/:did
应用程序->消息队列: 发布请求到 actions/:did
消息队列->设备: 请求
设备->消息队列: 发布属性值到 messages/:did
消息队列->应用程序: 属性值
修改属性
应用程序可以远程修改设备属性
设备->消息队列: 订阅 actions/:did
应用程序->消息队列: 订阅 messages/:did
应用程序->消息队列: 发布请求到 actions/:did
消息队列->设备: 请求
设备->消息队列: 发布结果到 messages/:did
消息队列->应用程序: 结果
主动上报
设备可以主动上报属性值及其数据流
数据采集
一般通过以下两种方式采集数据
- 通过定时器采集传感器数据
- 实时监控传感器数据,当数据发生突变时才上报数据
数据缓存
设备应能缓存最近多次采集的数据, 在网络恢复的时候能再次上传给云端
- 通过 MQTT 实现数据断线续传,通过在发布时将 QoS 设置为 1 或 2 即可实现
- 在网关上通过嵌入式数据库保存最近一段时间的数据
设备操作
设备事件
发布事件
设备可通过事件消息上报事件到云端
查询事件
云端会记录设备上报的事件, 应用程序可以查询最近发生的事件