速显电子:通讯协议

一、通讯协议

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、配参逻辑

  1. 主机发送参数查询指令到组播
    偏移 功能 长度(字节) 数据类型 描述
    6 指令类型 1 uint8_t 0xAA:参数配置查询
    7 目标ID 1 uint8_t 0x01—0xFF(0xFF为全部查询)
    8 本机ID 1 uint8_t 本机ID
  2. 组播组中所有设备都将收到指令,并按照规定格式将本机参数返回给主机
    偏移 功能 长度(字节) 数据类型 描述
    6 指令类型 1 uint8_t 0xAB:设备参数反馈
    7 目标ID 1 uint8_t 谁查询就发给谁
    8 本机ID 1 uint8_t 本机ID
    9 设备参数 n Josn 设备Josn参数
  3. 当主机收到大量设备的参数后,将会以列表的形式展现到人机交互界面
  4. 用户可以选择某个设备来配置该设备参数
  5. 用户选择后将会解析数据,并显示到人机交互界面
  6. 用户手动修改这些参数,修改完后,点击下载
  7. 主机将这些数据打包发送到组播组中
    偏移 功能 长度(字节) 数据类型 描述
    6 指令类型 1 uint8_t 0xAC:参数下载
    7 目标ID 1 uint8_t 用户选择的ID
    8 本机ID 6 uint8_t 本机ID
    12 设备参数 n Josn 设备Josn参数
  8. 组播组的设备都将收到该数据,设备根据目标ID地址来判断是否修改自身参数
  9. 设备成功修改后需要给组播组发送修改成功消息
    偏移 功能 长度(字节) 数据类型 描述
    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
	}
}