Onenet edp数据通信整理
wangxl@20200708
- 创建产品
1、选多协议接入--edp---添加产品
- 创建设备
- 设备列表--添加设备
三、EDP协议
1、EDP总体包协议定义
消息包括三个部分:必选的消息头(绿色),可选的多个选项(黄色)以及可选的消息体(蓝色)。
字节\bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Byte 1 | 消息类型 | 保留位(全零) | ||||||
Multi-bytes | 剩余消息长度(1-4字节,指示选项+消息体的长度) | |||||||
Multi-bytes | 选项(根据消息类型0个或多个) | |||||||
Multi-bytes | 消息体(根据消息类型0或多个字节) |
2、类型定义详解
(1)消息类型:占第一个字节的前4位,取值范围(0-15),定义如下:
类型值 | 含义 | 方向 |
1 | CONN_REQ:连接建立请求 | C(client)->S(server) |
2 | CONN_RESP:连接建立响应 | S->C |
3 | PUSH_DATA:转发(透传)数据 | 双向 |
4 | CONN_CLOSE:连接关闭 | S->C |
5 | UPDATE_REQ:上报当前使用的软件信息 | C->S |
6 | UPDATE_RESP:平台下发当前最新的软件信息 | S->C |
7 | SUB_DEVICE:子设备请求 | 双向 |
8 | SAVE_DATA:存储(&转发)数据 | 双向 |
9 | SAVE_ACK:存储确认 | S->C |
10 | CMD_REQ | S->C |
11 | CMD_RESP | C->S |
12 | PING_REQ: 心跳请求 | C->S |
13 | PING_RESP: 心跳响应 | S->C |
14 | ENCRYPT_REQ | C->S |
15 | ENCRYPT_RESP | S->C |
其他值 | 保留 |
|
(2)剩余消息长度:用于指示选项和消息体的字节数,该字段占用1-4个字节,长度值的低位部分放在传输的前面字节,高位放在后面。每个字节的最高位为延续指示位。延续指示位为1时,标示后面字节也是长度值,最多可延续4个字节。可表示数据范围如下:
字节数 | 最小值 | 最大值 |
1 | 0(0x00) | 127(0x7F) |
2 | 128(0x80, 0x01) | 16383 (0xFF, 0x7F) |
3 | 16 384 (0x80, 0x80, 0x01) | 2 097 151 (0xFF, 0xFF, 0x7F) |
4 | 2 097 152 (0x80, 0x80, 0x80, 0x01) | 268 435 455 (0xFF, 0xFF, 0xFF, 0x7F) |
注意:消息剩余长度 = 选项所占字节数 + 消息体所占字节数,根据该值的大小来确定消息剩余长度字段在EDP数据包中占用多少个字节,比如从上表可以看出,当0<剩余长度<=127的时候,消息剩余长度字段在EDP数据包中只占一个字节,而不是四个字节;当 127<剩余长度<=16383的时候,消息剩余长度字段在EDP数据包中占两个字节,而不是四个字节;依此类推。
- 选项
根据消息类型,选项的格式不同;详见(Enhanced Device Protocol(EDP)协议文档)
- 消息体
根据消息类型,消息体可选,详见(详见Enhanced Device Protocol(EDP)协议文档)。
- 设备端连接
1、建立edp连接(OneNET平台地址为 183.230.40.39 :876)
2、设备登陆上报信息(:ONN_REQ:连接建立请求 消息类型值为1)
连接请求包含三部分:消息头、选项和消息体。
选项包括协议名称、协议版本、连接标志、保持连接时间。
消息体中可能包含设备ID、用户ID(可选)、鉴权信息。三项内容都为长度+内容的字符串格式。设备ID必须传递,若认证方式中不使用设备ID,应将设备ID长度设置为0;用户ID和鉴权信息,根据标志位若存在必须按顺序出现。
可选的登录认证方式:
登陆认证方式 | 携带信息 | 说明 |
1 | 设备ID + 鉴权信息(api-key) | 设备ID:申请设备时平台返回的ID; 鉴权信息:在平台申请的可以操作该设备的api-key字符串; |
2 | 产品ID + 鉴权信息(auth_info) | 产品ID:在平台添加产品时平台生成的ID; 鉴权信息:在平台申请设备时填写设备的auth_info属性(json对象字符串),该属性需要产品内具备唯一性; |
本例采用登陆方式1:设备ID“43101”和api-key“abcdefg”,登录平台的连接请求消息格式如下:
字节 | 说明\bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
消息头 | |||||||||
Byte 1 | 第一字节: Bit(4-7):消息类型,值为1; Bit(0-3):保留位,值为0; | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
变长剩余消息长度(25编码后需要占用1个字节) | |||||||||
Byte 2 | 第二字节: 消息剩余字节长度,值为25 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
选项1:协议描述(字符串格式) | |||||||||
Byte 3 | 长度高位字节,值为0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Byte 4 | 长度低位字节,值为3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
Byte 5 | 字母’E’ | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
Byte 6 | 字母’D’ | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
Byte 7 | 字母’P’ | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
选项2:协议版本 | |||||||||
Byte 8 | 一个字节表示,值为1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
选项3:连接标志 | |||||||||
Byte 9 | Bit(7):产品ID标志位,值0, Bit(6):鉴权信息标志位,值1,表示后面消息体有该项 Bit(0-5):系统保留位,填0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
选项4:保持连接时间(256秒=0x0100) | |||||||||
Byte 10
| 第一字节,时间值的高位字节,值1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Byte 11 | 第二字节,时间值的低位字节,值0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
消息体-设备ID(字符串格式) | |||||||||
Byte 12 | 长度高位字节,值为0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Byte 13 | 长度低位字节,值为5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
Byte 14 | 字符’4’ | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
Byte 15 | 字符’3’ | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
Byte 16 | 字符’1’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
Byte 17 | 字符’0’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
Byte 18 | 字符’1’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
消息体-鉴权信息(字符串格式) | |||||||||
Byte 19 | 长度高位字节,值为0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Byte 20 | 长度低位字节,值为7 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
Byte 21 | 字符’a’ | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
Byte 22 | 字符’b’ | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
Byte 23 | 字符’c’ | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
Byte 24 | 字符’d’ | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
Byte 25 | 字符’e’ | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
Byte 26 | 字符’f’ | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
Byte 27 | 字符’g’ | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
发送数据包(hex):10 19 00 03 45 44 50 01 40 01 00 00 05 34 33 31 30 31 00 07 61 62 63 64 65 66 67
接收返回(hex):20 02 00 00 则表明连接成功
3、设备上报数据
(1)存储(&转发)数据协议
字节 | 说明\bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
消息头 | |||||||||
Byte 1 | 第一字节: Bit(4-7):消息类型,值为8; Bit(0-3):保留位,值为0; | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
剩余消息长度(16664编码后需要占用3个字节) | |||||||||
Byte 2 | 消息剩余字节长度(16664)-编码第一字节(低) | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
Byte 3 | 消息剩余字节长度(16664)-编码第二字节 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Byte 4 | 消息剩余字节长度(16664)-编码第三字节(高) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
固定选项:标志 | |||||||||
Byte 5 | Bit 7:转发地址指示位,置1,后面有地址信息 Bit 6:消息编号指示位,置1,后面有2字节消息编号 Bit 5-0:系统保留,全零。 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
目的或源地址(根据上面的标志位确定存在与否) | |||||||||
Byte 6 | 固定两字节长度高位字节,值为0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Byte 7 | 固定两字节长度低位字节,值为5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
Byte 8 | 字符’1’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
Byte 9 | 字母’0’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
Byte 10 | 字母’0’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
Byte 11 | 字母’1’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
Byte 12 | 字母’1’ | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
消息编号(固定2字节,高字节在前,服务器用此编号返回存储确认) 示例:消息编号为261 | |||||||||
Byte 13 | 消息编号261高位字节 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Byte 14 | 消息编号261低位字节 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
消息体(设备云规定的数据类型格式) | |||||||||
Byte 15 | 7种数据结构,具体格式见后续说明: Type = 7:带统一时间戳的浮点数数据流 Type = 6:带默认时间戳的自定义间隔字符串格式 type = 5:自定义间隔字符串格式; type = 4:JSON格式3字符串; type = 3:JSON格式2字符串; type = 2:二进制数据点; type = 1:JSON格式1字符串; |
|
|
|
|
|
|
|
|
(2)数据类型3格式说明:
Byte 15 | 数据点类型指示:type=3 // JSON格式2字符串 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
Byte 16 | //指示后面字符串长度 长度高位字节 |
|
|
|
|
|
|
|
|
Byte 17 | 长度低位字节 |
|
|
|
|
|
|
|
|
Byte 18 | 通用格式: { “datastream_id1”:”value1”, “datastream_id2”:”value2”, … }
|
|
|
|
|
|
|
|
|
(3)本例以EDP协议的Type3格式上传数据
上报数据点报文格式:消息头(1)+剩余消息长度(1)+标志(1)+消息(2)+JSON数据长度(2)+JSON数据(n)
json数据:{"led_1_status":0}
发送(hex):80 18 40 00 01 03 00 12 7B 22 6C 65 64 5F 31 5F 73 74 61 74 75 73 22 3A 30 7D //80--存储(&转发)数据 00 01--消息编号 00 12 -- json数据长度
接收(hex):90 04 40 00 01 00 // 90--SAVE_ACK响应 00 01--消息编号 00--成功
- 平台下发命令及终端接收与解析
终端接收(hex):A0 2D 00 24 33 30 64 32 63 36 64 37 2D 38 30 38 34 2D 35 31 62 37 2D 61 63 63 38 2D 62 38 38 33 31 33 66 39 33 64 63 36 00 00 00 03 31 32 33
//A0 消息类型
//2D 消息长度
// 00 24 命令cmd_uuid长度
//33 30 64 32 63 36 64 37 2D 38 30 38 34 2D 35 31 62 37 2D 61 63 63 38 2D 62 38 38 33 31 33 66 39 33 64 63 36 cmd_uuid
// 00 00 00 03 数据长度
//31 32 33 数据‘123’