一、通讯协议
1.1、协议结构
| 类型 |
偏移量 |
长度(字节) |
数据类型 |
描述 |
| Head |
0 |
4 |
uint16_t |
帧头固定为0xEF,0xFE,0xEE,0xFF |
| Lenght |
4 |
2 |
uint16_t |
DATA的数据长度,高位在前 |
| Data |
6 |
1 |
uint8_t |
指令类型 |
| 7 |
1 |
uint8_t |
目标ID |
| 8 |
1 |
uint8_t |
本机ID |
| 9 |
n |
通用型 |
数据 |
| CRC16 |
n+9 |
2 |
uint16_t |
CRC16校验,高位在前(只校验Data) |
1.2、指令类型
| 通用 |
| 设备类型 |
指令类型 |
|
| 返回值 |
0x00 |
设备故障返回 |
| |
0x01 |
读数据返回 |
| |
0x02 |
写数据返回 |
| UDP组播 |
| 设备类型 |
指令类型 |
类型描述 |
| |
0xFA |
参数配置查询 |
| |
0xFB |
设备参数反馈 |
| |
0xFC |
设备参数下载 |
| |
0xFD |
设备参数下载成功反馈 |
| UDP单播 |
| 设备类型 |
指令类型 |
类型描述 |
| |
0xA0 |
读数据 |
| |
0xA1 |
写数据(无返回值) |
| |
0xA2 |
写数据(有返回值) |
| |
0xFD |
获取版本号 |
| |
0xFE |
固件更新 |
1.3、ID分配
| ID类型 |
ID段 |
| 路由器网桥类 |
1-19 |
| |
|
| 自研电路板 |
20-59 |
| 电脑类 |
120-159 |
| 摄像头类 |
160-199 |
| 第三方设备(如全站仪等) |
200-239 |
| 手持地面站 |
240 |
| 大型地面站 |
241 |
| 广播 |
255 |
二、参数配置
2.1、播组地址
- 组播地址:239.255.255.250
- 端口:51255
2.2、配参逻辑
- 主机发送参数查询指令到组播
| 偏移 |
功能 |
长度(字节) |
数据类型 |
描述 |
| 6 |
指令类型 |
1 |
uint8_t |
0xAA:参数配置查询 |
| 7 |
目标ID |
1 |
uint8_t |
0x01—0xFF(0xFF为全部查询) |
| 8 |
本机ID |
1 |
uint8_t |
本机ID |
- 组播组中所有设备都将收到指令,并按照规定格式将本机参数返回给主机
| 偏移 |
功能 |
长度(字节) |
数据类型 |
描述 |
| 6 |
指令类型 |
1 |
uint8_t |
0xAB:设备参数反馈 |
| 7 |
目标ID |
1 |
uint8_t |
谁查询就发给谁 |
| 8 |
本机ID |
1 |
uint8_t |
本机ID |
| 9 |
设备参数 |
n |
Josn |
设备Josn参数 |
- 当主机收到大量设备的参数后,将会以列表的形式展现到人机交互界面
- 用户可以选择某个设备来配置该设备参数
- 用户选择后将会解析数据,并显示到人机交互界面
- 用户手动修改这些参数,修改完后,点击下载
- 主机将这些数据打包发送到组播组中
| 偏移 |
功能 |
长度(字节) |
数据类型 |
描述 |
| 6 |
指令类型 |
1 |
uint8_t |
0xAC:参数下载 |
| 7 |
目标ID |
1 |
uint8_t |
用户选择的ID |
| 8 |
本机ID |
6 |
uint8_t |
本机ID |
| 12 |
设备参数 |
n |
Josn |
设备Josn参数 |
- 组播组的设备都将收到该数据,设备根据目标ID地址来判断是否修改自身参数
- 设备成功修改后需要给组播组发送修改成功消息
| 偏移 |
功能 |
长度(字节) |
数据类型 |
描述 |
| 6 |
指令类型 |
1 |
uint8_t |
0xAD:设备参数下载成功反馈 |
| 7 |
目标ID |
1 |
uint8_t |
谁要求下载就发给谁 |
| 8 |
本机ID |
1 |
uint8_t |
本机ID |
2.3、Josn格式
要求
- 格式必须遵循至少双层嵌套,最外层只允许有一个固定键值为"name"的文本数据,非必须,如果没有也没关系,只是在搜索到设备后会显示未知设备,注意最外层只会解析"name"这一个键值,其他的都会被忽略
- 其他参数都写到下一个层级的JSON 对象中,对键值和类型不做限制,都会解析
{
"name": "第一代机器人",
"xxxx": {
"xxx1": "192.168.1.1",
"xxx2": "xxxxxxxxxxx",
"xxx3": true,
"xxx4": false,
"xxx5": 8888,
"xxx6": 888.888
},
"xxxx": {
......
},
......
"xxxx": {
......
}
}
示例:
{
"name": "第一代机器人",
"设备网络参数": {
"ip地址": "192.168.1.1",
"子网掩码": "192.168.1.1",
"默认网关": "192.168.1.1",
"通讯端口": 8888
},
"远程网络参数": {
"ip地址": "192.168.1.1",
"通讯端口": 8888
},
"服务器网络参数": {
"ip地址": "192.168.1.1",
"通讯端口": 8888
},
"other": {
"xxx0": "xxxxx",
"xxx1": "xxxx",
"xxx2": "xxxx",
"xxx3": 8888,
"xxx4": "xxxx",
"xxx5": true,
"xxx6": false
}
}