IOT技术架构
# 1 系统架构图

# 2. 协议设计
# 2.1 IOT 平台与设备通信协议
# 2.1.1 握手协议
握手协议是首先通过通过 curve25519 完成共享密钥交换,并且通过 ED25519 提前生成的公私钥对来验证双方通信身份的有效性以及数据完整性,完成握手后通信双方约定出一种对称加密算法,以及一个对称加密密钥。
# 2.1.1.1 初始化
- 请求 (Device -> Cloud)
{ "iq": { "id": "411", "type": "query", "method": "urn:xiot:initialize", "content": { "version": "1.0", "authentication": "device-id" } } }
1
2
3
4
5
6
7
8
9
10
11
authentication,指定认证方式为根据单个设备认证,还根据设备类型认证:
authentication | 说明 |
---|---|
device-id | 根据单个设备认证 |
device-type | 根据设备类型认证 |
- 应答 (Cloud -> Device)
{ "iq": { "id": "411", "type": "result", "method": "urn:xiot:initialize" } }
1
2
3
4
5
6
7
8
# 2.1.1.2 开始验证
- 请求 (Device -> Cloud)
{
"id": "412",
"type": "query",
"method": "urn:xiot:verify-start",
"content": {
"public-key": "<A>"
}
}
2
3
4
5
6
7
8
- 应答 (Cloud -> Device)
{
"iq": {
"id": "412",
"type": "result",
"method": "urn:xiot:verify-start",
"content": {
"public-key": "<B>",
"signature": "<encryptedSignature>"
}
}
}
2
3
4
5
6
7
8
9
10
11
# 2.1.1.3 结束验证
- 请求 (Device -> Cloud)
{
"iq": {
"id": "413",
"type": "query",
"method": "urn:xiot:verify-finish",
"content": {
"device-id": "<encryptedDeviceId>",
"device-type": "<encryptedDeviceType>",
"signature": "<encryptedSignature>",
"codec": 0
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
其中: codec 指定对称加密方法:
codec | 说明 |
---|---|
0 | 不加密 |
1 | chacha20+poly1305 |
2 | aes+hkdf+sha1 |
- 应答 (Cloud -> Device)
{
"iq": {
"id": "413",
"type": "result",
"method": "urn:xiot:verify-finish"
}
}
2
3
4
5
6
7
# 2.1.2 设备控制
# 2.1.2.1 读属性
- 请求 (Cloud -> Device)
{
"iq": {
"id": "421",
"type": "query",
"method": "urn:xiot:get-properties",
"content": {
"properties": [
"abc.1.1",
"abc.1.2",
"abc.1.3"
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- 应答 (Device -> Cloud)
{
"iq": {
"id": "421",
"type": "result",
"method": "urn:xiot:get-properties",
"content": {
"properties": [
{
"pid": "abc.1.1",
"value": 26
},
{
"pid": "abc.1.2",
"status": -1
},
{
"pid": "abc.1.3",
"status": -3
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 2.1.2.2 写属性
- 请求 (Cloud -> Device)
{
"iq": {
"id": "422",
"type": "query",
"method": "urn:xiot:set-properties",
"content": {
"properties": [
{
"pid": "abc.2.3",
"value": 37
},
{
"pid": "abc.2.4",
"value": 3600
},
{
"pid": "abc.2.5",
"value": 10.7
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 应答 (Device -> Cloud)
{
"iq": {
"id": "422",
"type": "result",
"method": "urn:xiot:set-properties",
"content": {
"properties": [
{
"pid": "1.2.3",
"status": 0
},
{
"pid": "1.2.4",
"status": -2,
"description": "设备不在线"
},
{
"pid": "1.2.5",
"status": -4,
"description": "属性不可写"
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2.1.2.3 执行方法
- 请求 (Cloud -> Device)
{
"iq": {
"id": "423",
"type": "query",
"method": "urn:xiot:invoke-actions",
"content": {
"actions": [
{
"aid": "aaa.1.9",
"in": [37, 3600]
},
{
"aid": "bbb.1.10",
"in": [37, 3600]
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 成功应答(Device -> Cloud)
{
"iq": {
"id": "423",
"type": "result",
"method": "urn:xiot:invoke-action",
"content": {
"actions": [
{
"aid": "abc.1.9",
"status": -434,
"descripion": "中文出错信息"
},
{
"aid": "abc.1.10",
"out": [3600],
"status": 0
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 失败应答(Device -> Cloud)
{
"iq": {
"id": "423",
"type": "result",
"method": "urn:xiot:invoke-action",
"content": {
"actions": [
{
"aid": "abc.1.9",
"status": -3,
"description": "action not found"
},
{
"aid": "abc.1.10",
"status": -3,
"description": "action not found"
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2.1.2.4读取所有子设备
- 请求 (Cloud -> Device)
{
"iq": {
"id": "5009",
"type": "query",
"method": "urn:xiot:get-children",
"content": {
"did": "ppp"
}
}
}
2
3
4
5
6
7
8
9
10
- 应答 (Device -> Cloud)
{
"iq": {
"id": "5009",
"type": "result",
"method": "urn:xiot:get-children",
"content": {
"children": [
{
"did": "aaa",
"summary": {
"type": "urn:homekit-spec:device:outlet:00000a01:abc:aaa:1",
"online": true,
"parentId": "ppp",
"protocol": "zigbee"
}
},
{
"did": "bbb",
"summary": {
"type": "urn:homekit-spec:device:motion-sensor:00000a11:abc:bbb:2",
"online": true,
"parentId": "aaa",
"protocol": "zigbee"
}
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 2.1.3 设备消息
# 2.1.3.1 子设备已添加
通知(Device -> Cloud)
{
"message": {
"id": "1",
"topic": "urn:xiot:device",
"type": "children-added",
"payload": {
"did": "xxx",
"children": [
{
"did": "08:00:27:87:53:C5@25",
"summary": {
"type": "urn:homekit-spec:device:bridge:00000002:yingtuo:hhh:1",
"online": false,
"protocol": "zigbee",
"parentId": "xxx"
}
},
{
"did": "08:00:27:87:53:xx@26",
"summary": {
"type": "urn:homekit-spec:device:bridge:00000002:yingtuo:hhh:1",
"online": false,
"protocol": "btmesh",
"parentId": "xxx"
}
}
],
"timestamp": 1640164172915
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 2.1.3.2 子设备已删除
通知(Device -> Cloud)
{
"message": {
"id": "1",
"topic": "urn:xiot:device",
"type": "children-removed",
"payload": {
"did": "xxx",
"children": [
"08:00:27:87:53:C5@25",
"08:00:27:87:53:xx@26"
],
"timestamp": 1640164172915
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.1.3.3 属性已改变
通知(Device -> Cloud)
{
"message": {
"id": "1",
"topic": "urn:xiot:device",
"type": "properties-changed",
"payload": {
"properties": [
{
"pid": "47a5521d-4d28-4ad1-8126-03bd2910bcdc.1.1",
"value": 17
},
{
"pid": "47a5521d-4d28-4ad1-8126-03bd2910bcdc.1.2",
"value": 12.7
},
{
"pid": "47a5521d-4d28-4ad1-8126-03bd2910bcdc.1.3",
"value": "hello"
}
],
"timestamp": 1640164172915
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 2.1.3.4 事件已发生
通知(Device -> Cloud)
{
"message": {
"id": "1",
"topic": "urn:xiot:device",
"type": "event-occurred",
"payload": {
"event": {
"eid": "eee.1.1",
"oid": "xxx",
"arguments": [
{
"piid": 1,
"values": ["hello"]
},
{
"piid": 2,
"values": [1]
},
{
"piid": 3,
"values": [100,200,300]
}
]
},
"timestamp": 1640164172915
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 2.1.3.5 设备摘要已改变
通知(Device -> Cloud)
- 主要是上下线状态变化
- 其次是 deviceType 变化、parentId 变化等,这些变化都是由于设备上线变化引起的,所以放一起。
{
"message": {
"id": "1",
"topic": "urn:xiot:device",
"type": "summary-changed",
"payload": {
"did": "xxx",
"summary": {
"type": "urn:homekit-spec:device:lightbulb:00000005:a:zzz:1",
"online": true,
"protocol": "zigbee",
"parentId": "aaa"
},
"timestamp": 1640164172915
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.1.3.6 设备绑定
通知( Cloud -> Device)
当设备被上层业务添加到 owner 时,推送给设备的消息
{
"message": {
"id": "1",
"topic": "urn:xiot:ownership",
"type": "ownership-taken",
"payload": {
"CloudpId": "xxxx",
"ownerId": "xxxx",
"did": "xxx",
"timestamp": 1640164172915
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# 2.1.3.7 设备解除绑定
通知( Cloud -> Device)
当设备被上层业务删除某个 owner 时,推送给设备的消息
{
"message": {
"id": "1",
"topic": "urn:xiot:ownership",
"type": "ownership-disclaimed",
"payload": {
"CloudpId": "xxxx",
"ownerId": "xxxx",
"did": "xxx",
"timestamp": 1640164172915
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# 2.2 IOT 平台与业务方通信协议
IOT 平台收到设备上报的数据后,会将原始的协议经过转换,并最终推送给到业务方

IOT 平台需要将设备状态数据推送给到业务方,目前主要⽀持 http,kafka,rocketmq 三种方式,这些对接方式需要在业务应用注册时候需要指定好,这些对接数据会持久化到 app_info 数据表。
事件发送⽅式 | EventReceiver | 备注 |
---|---|---|
http | { "configuration": { "url": "http://127.0.0.1:80/event/receiver" }, "type": "http" } | 授权认证 |
kafka | { "configuration": { "bootstrapServers": "10.26.21.71:9092", "topic": "smart-home-message" }, "type": "kafka" } | 授权认证 |
rocketmq | { "configuration": { "bootstrapServers": "10.26.21.71:9092", "topic": "smart-home-message", "accessKey": "LTAIbpwPiX00", "secretKey": "bCArXw1KXa0r" }, "type": "rocketmq" } | 授权认证 |
业务主要收到的数据类型有:
事件类型 | 事件类型名称 |
---|---|
OwnerDeviceAdded | 设备添加事件 |
OwnerDeviceRemoved | 设备移除事件 |
OwnerPropertiesChanged | 设备属性变更事件 |
OwnerEventOccurred | 设备事件触发事件 |
OwnerDeviceSummaryChanged | 设备摘要变更事件 |
# 2.2.1 OwnerDeviceAdded
产生原因:
- 网关绑定归属者
- 网关绑定归属者后又添加子设备
数据格式:
{
"id": "155094-10.228.141.22-62-1637810287224-899#0",
"type": "device-added",
"payload": {
"appId": "sqn-test",
"ownerId": "sqn-test",
"did": "1628@0",
"summary": {
"online": false,
"type": "urn:knowin-spec:device:gateway:00000001:know:insight:1"
},
"timestamp": 1640164172915
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.2.2 OwnerDeviceRemoved
产生原因:
- 网关解绑了归属者
- 网关删除了子设备
- 设备进行了重置,设备访问 token 发生了变化
数据格式:
{
"id": "155094-10.228.141.22-58-1637811054524-901#0",
"type": "device-removed",
"payload": {
"appId": "sqn-test",
"ownerId": "sqn-test",
"did": "1628@0",
"timestamp": 1640164172915
}
}
2
3
4
5
6
7
8
9
10
# 2.2.3 DeviceSummaryChanged
产生原因:
- 设备的在离线发生了变化
- 设备对物模型的类型发生了变化
数据格式:
{
"id":"19e2cf0d-c334-4a4a-9b54-256f6871298c#0",
"type":"device-summary-changed",
"payload":{
"appId":"sqn-test",
"ownerId":"sqn-test",
"did":"1628@0",
"summary":{
"online":true,
"type":"urn:knowin-spec:device:gateway:00000001:know:insight:1",
"parentId": "xxxxxx",
"members": ["aaa", "bbb"]
},
"timestamp": 1640164172915
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 2.2.4 DevicePropertiesChanged
产生原因:
- 设备属性状态数据发生了变化
数据格式:
{
"id": "b#1628#1#s#1",
"type": "device-properties-changed",
"payload": {
"appId": "xxxx",
"ownerId": "xxxx",
"properties": [{
"pid": "1628@0.2.1",
"value": 0
},
{
"pid": "1628@0.2.2",
"value": 0
},
{
"pid": "1628@0.2.3",
"value": 0
},
{
"pid": "1628@0.2.4",
"value": ""
},
{
"pid": "1628@0.2.5",
"value": 0
}
],
"timestamp": 1640164172915
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 2.2.5 OwnerEventOccurred
产生原因:
- 设备产生了物模型事件
数据格式:
{
"id": "b#1628#1#s#1",
"type": "device-event-occurred",
"payload": {
"appId": "xxxx",
"ownerId": "xxxx",
"event": {
"eid": "1628@0.1.1",
"arguments": [{
"piid": 1,
"values": [
1
]
}],
"oid": "12345667888"
},
"timestamp": 1640164172915
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 2.3 业务平台对接 IOT 平台 API
# 2.3.1 基本概念
# 2.3.1.1 设备
设备指的是具体的物理设备,⽐如灯、开关、插座、空调等。
# 2.3.1.2 owner
owner 就是设备拥有者,设备的拥有者可以是⼀个具体的⼈,也可以是⼀个抽象的组织。
# 2.3.1.3从属关系
⼀个 owner 可以拥有多个设备,⼀个设备可以有多个 owner。
# 2.3.2 IoT 简介
# 2.3.2.1 调⽤
IoT 调⽤关系如下:

# 2.3.2.2 应⽤
IoT 平台⽀持多个 IoT 应⽤,每个应⽤可以:
# 2.3.3 服务
# 2.3.3.1 主要功能
# 2.3.3.1.1 控制
调⽤服务接⼝,可以对设备进⾏控制操作。
# 2.3.3.1.2 事件
事件会主动发送给应⽤在开发者控制台填写的订阅地址。
# 2.3.3.2 鉴权
所有应⽤向 IoT 服务发起的请求,都需要携带⼀个 token,IoT 服务⽤此 token 鉴权。
鉴权⽅式由应⽤指定,有两种鉴权⽅式:
# 2.3.3.2.1 JWT 鉴权
⽤⼀个固定的 serectKey 对 token 加解密,token ⾥包含 ownerId,格式如下:
{
"id": "{ownerId}"
}
2
3
# 2.3.3.2.2 HTTP 鉴权
应⽤提供⼀个 url 地址,IoT 服务向次 url 发起请求鉴权,请求如下:
GET /xxxxxxx HTTP/1.1
authorization: Bearer {TOKEN}
2
鉴权成功,应答如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 28
{
"code":"SUCCESS",
"data":{
"id":"{ownerId}"
}
}
2
3
4
5
6
7
8
9
鉴权失败,应答如下:
HTTP/1.1 401 UNAUTHORIZED
# 2.3.4 事件分发
IoT 服务提供设备的事件分发功能,⽬前⽀持:
通过 HTTP POST 请求发送事件给应⽤(接收消息的服务由应⽤提供)
通过 kafka topic 发送事件给应⽤(接收消息的服务由应⽤提供)
# 2.4 如何使⽤
# 2.4.1 使⽤流程
应⽤需要在 IoT 平台注册,填写必要的信息(鉴权⽅式和接收事件的⽅式),如:

# 2.4.2 调⽤ iot 平台 Api 的 header 约定
在 IoT 开发平台注册应⽤后,会得到⼀个应⽤ ID,调⽤任何 IoT 服务都需要携带⼀个它,如:
App-Id: {appId}
所有 HTTP/HTTPS 接⼝必须携带⼀个 owner token,此 token 解开后能拿到⼀个 ownerId,如:
authorization:Bearer {token}
如果接⼝返回 401,说明 token 错误,⽐如 token 过期等。
HTTP/1.1 401 UNAUTHORIZED
如果接⼝返回 200,说明操作完成,返回的数据格式如下:
{
"code":"SUCCESS",
"data":{
}
}
2
3
4
5
6
如果 code 为"SUCCESS",说明操作成功,data ⾥包含为期望的数据。
如果 code 不为"SUCCESS",说明操作失败,不携带 data,将携带⼀个 message,详细描述失败原因,如:
{
"code":"ERROR",
"message":"did invalid!"
}
2
3
4
# 2.4.3 名词定义
请参考⽂档:《物模型》,在本⽂档⾥⽤到⼏个缩写:
# 2.4.3.1 did
deviceId,即设备 ID,简称 did
# 2.4.3.2 iid
instance id,分为 siid,piid,aiid, eiid
# 2.4.3.3 siid
service instance id
# 2.4.3.4 piid
property instance id
# 2.4.3.5 aiid
action instance id
# 2.4.3.6 eiid
event instance id
# 2.4.3.7 pid
propety id,由 did + service iid + property iid 组成,即:
pid = {did}.{siid}.{piid}
# 2.4.3.8 aid
action ID,由 did + service iid + action iid 组成,即:
aid = {did}.{siid}.{aiid}
# 2.4.3.9 token
token 分两种:
# 2.4.3.10 owner token
拥有者 token,访问所有的 API 必须使⽤的 token。
# 2.4.3.11 device token
设备 token,添加设备时使⽤。
# 2.5 服务接⼝
# 2.5.1 设备列表
# 2.5.1.1 读取设备列表
# 2.5.1.1.1 请求
GET /controller/v1/devices?did={aaa,bbb,ccc}
# 2.5.1.1.2 应答
{
"code":"SUCCESS",
"data":{
"devices":[
{
"did":"aaa",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000a001:gkct:nc:1",
"online":true,
"parentId":"1234@33",
"cloudId":"1521075"
}
},
{
"did":"bbb",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000a001:gkct:nc:1",
"online":true,
"parentId":"1234@33",
"cloudId":"1521075"
}
},
{
"did":"ccc",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000a001:gkct:nc:1",
"online":true,
"parentId":"1234@33",
"cloudId":"1521075"
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 2.5.1.2 读取所有设备
# 2.5.1.2.1 请求
GET /controller/v1/devices
# 2.5.1.2.1 应答
{
"code":"SUCCESS",
"data":{
"devices":[
{
"did":"001@99",
"status":0,
"summary":{
"type":"urn:k-spec:device:switch:0000A002:a:b:1",
"online":true,
"cloudId":"",
"parentId":"1234@33",
"protocol": "zigbee"
}
},
{
"did":"001@888",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000A001:a:b:1",
"online":true,
"cloudId":"",
"parentId":"1234@33"
}
},
{
"did":"xxx@666",
"status":0,
"summary":{
"type":"urn:k-spec:group:light:0000A001:a:b:1",
"cloudId":"xiaomi",
"online":true,
"parentId":"1234@33"
}
},
{
"did":"aaaa@666",
"status":0,
"summary":{
"type":"urn:k-spec:device:gateway:0000A003:a:b:1",
"online":true,
"cloudId":"1521075",
"protocol": "zigbee"
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 2.5.1.3 读取设备下所有子设备
# 2.5.1.3.1 请求
GET /controller/v1/devices?parentId=1234@33
# 2.5.1.3.2 应答
{
"code":"SUCCESS",
"data":{
"devices":[
{
"did":"001@99",
"status":0,
"summary":{
"type":"urn:k-spec:device:switch:0000A002:a:b:1",
"online":true,
"cloudId":"",
"parentId":"1234@33"
}
},
{
"did":"001@888",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000A001:a:b:1",
"online":true,
"cloudId":"",
"parentId":"1234@33"
}
},
{
"did":"xxx@666",
"status":0,
"summary":{
"type":"urn:k-spec:group:light:0000A001:a:b:1",
"cloudId":"xiaomi",
"online":true,
"parentId":"1234@33",
"protocol": "zigbee"
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 2.5.1.4 读取第三⽅设备
# 2.5.1.4.1 不同步
不同步的意思是仅从缓存中读取,速度快,但可能数据不准确。
# 2.5.1.4.2 请求
GET /controller/v1/devices?cloudId=xxx //第三⽅平台ID
# 2.5.1.4.3应答
{
"code":"SUCCESS",
"data":{
"status":0,
"devices":[
{
"did":"f26789188a00dbb5c42c23bc599fcd9d",
"summary":{
"type":"urn:miot-spec-v2:device:switch:0000a002:a:b:1",
"online":true,
"cloudId":"1521075"
}
}
]
}
}
{
"code":"SUCCESS",
"data":{
"status":-601,
"description":"cloud not authorized"
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2.5.1.4.4 同步
同步的意思是会去第三⽅平台读取⼀次,有⼀定耗时,但数据准确
# 2.5.1.4.5 请求
GET /controller/v1/devices?cloudId=1521075&sync=true //只能为true,不携带此参数,视为sync=false
# 2.5.1.4.6 应答
{
"code":"SUCCESS",
"data":{
"status":0,
"devices":[
{
"did":"f26789188a00dbb5c42c23bc599fcd9d",
"summary":{
"type":"urn:miot-spec-v2:device:switch:0000A002:a:b:1",
"online":true,
"cloudId":"1521075"
}
}
]
}
}
{
"code":"SUCCESS",
"data":{
"status":-601,
"description":"cloud not authorized"
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 2.5.1.5 添加设备
# 2.5.1.5.1 请求
POST /controller/v1/devices
{
"devices":[
{
"did":"001@888",
"token":"xxxxxxx"
},
{
"did":"aaa@666",
"cloudId":"xxxxxxx"
},
{
"did":"aaa@777",
"token":"xxxxxxx"
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
其中
did 是设备 id
token 是从设备上读取到的 token
如果添加⾃有设备,只需要传输 token 字段。
如果添加第三⽅设备,只需要传输 cloudId 字段。
只能添加 root 设备,即不支持子设备的添加,子设备添加通过其他方式,删除同。
# 2.5.1.5.2 应答
{
"code":"SUCCESS",
"data":{
"devices":[
{
"did":"001@888",
"status":0
},
{
"did":"aaaa@666",
"status":-28,
"description":"invaid did"
},
{
"did":"aaaa@777",
"status":-500,
"description":"device is not a root device!"
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2.5.1.6 删除设备
# 2.5.1.6.1 请求
DELETE /controller/v1/devices?did=abc,aaa,ccc
# 2.5.1.6.2 应答
{
"code":"SUCCESS",
"data":{
"devices":[
{
"did":"001@888",
"status":0
},
{
"did":"aaaa@666",
"status":-28,
"description":"did not found"
},
{
"did":"aaaa@777",
"status":-500,
"description":"device is not a root device!"
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2.5.1.7 探测设备
类似读设备列表,但是不做鉴权,业务可以探测任何设备
# 2.5.1.7.1 请求
GET /controller/v1/probe/devices?did={aaa,bbb,ccc}
# 2.5.1.7.2 应答
{
"code":"SUCCESS",
"data":{
"devices":[
{
"did":"aaa",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000a001:gkct:nc:1",
"online":true,
"parentId":"1234@33"
}
},
{
"did":"bbb",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000a001:gkct:nc:1",
"online":true,
"parentId":"1234@33"
}
},
{
"did":"ccc",
"status":0,
"summary":{
"type":"urn:k-spec:device:light:0000a001:gkct:nc:1",
"online":true,
"parentId":"1234@33"
}
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 2.5.2 设备控制
# 2.5.2.1 读设备影⼦
# 2.5.2.1.1 请求
GET /controller/v1/shadows?did=aaa,bbb,ccc
# 2.5.2.1.2 应答
{
"code":"SUCCESS",
"data":{
"devices":[
{
"did":"aaa",
"status":0,
"shadow":[
{
"siid":2,
"piid":2,
"status":0,
"value":19
},
{
"siid":2,
"piid":3,
"status":-425,
"decription":"xxxx"
}
]
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2.5.2.2 读属性
# 2.5.2.2.1 请求
GET /controller/v1/properties?pid=aaaa.1.1,bbb.2.2,ccc.3.3
# 2.5.2.2.2 应答
{
"code": "SUCCESS", // 需要和公司通用的规范保持一致~!
"data": {
"properties":[
{
"pid":"aaaa.1.1",
"status":0,
"value":19
},
{
"pid":"aaaa.1.2",
"status":0,
"value":"ABB"
},
{
"pid":"aaaa.2.1",
"status":-1,
"description":"service nout found"
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"msg": "error", // 需要和公司通用的规范保持一致~!
"description": "xxxxxx"
}
2
3
4
# 2.5.2.3 写属性
# 2.5.2.3.1 请求
PUT /controller/v1/properties
{
"offlineMode":false,//设备离线后可以走离线模式,云端缓存,设备上线执行
"properties":[
{
"pid":"aaaa.1.1",
"value":17
},
{
"pid":"aaaa.1.2",
"value":199.3
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.5.2.3.2 应答
{
"code":"SUCCESS",
"data":{
"properties":[
{
"pid":"aaaa.1.1",
"status":0
},
{
"pid":"aaaa.1.2",
"status":-2,
"description":"invalid value"
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 2.5.2.4 执⾏⽅法
# 2.5.2.4.1 请求
PUT /controller/v1/actions
{
"offlineMode":false,//设备离线后可以走离线模式,云端缓存,设备上线执行
"actions":[
{
"aid":"aaaa.2.1",
"in":[
{
"piid":1,
"values":[
17,
19,
21
]
},
{
"piid":2,
"values":[
"abc"
]
}
]
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2.5.2.4.2 应答
{
"code":"SUCCESS",
"data":{
"actions":[
{
"aid":"aaaa.2.1",
"status":0,
"out":[
{
"piid":3,
"values":[
"a",
"b",
"c",
"d",
"e"
]
}
]
}
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23