车辆管理系统越来越成熟,设备价格越做越低。但设备一旦出去后,运城运维变得越来越重要。
这些运维包含:升级,设备检测,标定,远程诊断,车辆在线状态分析等。
制定一个统一的协议是十分必要的。考虑到实际现状,运营平台首先要兼容性好。
我们 制定了运维管理平台的统一协议以满足各个厂家的实际运维的需要。
运维服务器通信协议
V0.1 初稿
修订记录
作者 |
版本 |
说明 |
日期 |
邓铁山 |
0.1 |
2023年6月16 |
|
1协议基础
1.1 通信方式
通信协议采用TCP,平台作为服务器端,终端作为客户端。
1.2 数据类型
协议消息中使用的数据类型见 表 1:
表 1 数据类型
数据类型 |
描述及要求 |
BYTE |
无符号单字节整型(字节,8 位) |
WORD |
无符号双字节整型(字,16 位) |
DWORD |
无符号四字节整型(双字,32 位) |
BYTE[n] |
n 字节 |
BCD[n] |
8421 码,n 字节 |
STRING |
GBK 编码,若无数据,置空 |
1.3 传输规则
协议采用大端模式(big-endian)的网络字节序来传递字和双字。
约定如下:
——字节(BYTE)的传输约定:按照字节流的方式传输;
——字(WORD)的传输约定:先传递高八位,再传递低八位;
——双字(DWORD)的传输约定:先传递高 24 位,然后传递高 16 位,再传递高八位,
最后传递低八位。
1.4 消息的组成
1.4.1 消息结构
每条消息由标识位、消息头、消息体和校验码组成,消息结构图如图 1 所示:
图 1 消息结构图
标识位 |
消息头 |
消息体 |
检验码 |
标识位 |
1.4.2 标识位
采用 0x7e 表示,若校验码、消息头以及消息体中出现 0x7e,则要进行转义处理,转义规则定义如下:
0x7e <————> 0x7d 后紧跟一个 0x02;
0x7d <————> 0x7d 后紧跟一个 0x01。
转义处理过程如下:
发送消息时:消息封装——>计算并填充校验码——>转义;
接收消息时:转义还原——>验证校验码——>解析消息。
示例:
发送一包内容为 0x30 0x7e 0x08 0x7d 0x55 的数据包,则经过封装如下:0x7e 0x30 7d 0x02 0x08 0x7d 0x01 0x55 0x7e。
1.4.3 消息头
消息头内容详见 表 2:
表 2 消息头内容
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
消息 ID |
WORD |
|
2 |
消息体属性 |
WORD |
消息体属性格式结构图见图 2 |
4 |
终端手机号 |
BCD[6] /BCD[10] |
注意:系统支持JT808-2011,2013和JT2019版本 |
10 |
消息流水号 |
WORD |
按发送顺序从 0 开始循环累加 |
12 |
消息包封装项 |
如果消息体属性中相关标识位确定消息分包处理,则该项有内容,否则无该项 |
消息体属性格式结构图如图 2 所示:
图 2 消息体属性格式结构图
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
版本标志 |
分包 |
数据加密方式 |
消息体长度 |
|||||||||||||
0:2019以前版本 1:2019版本的设备 |
数据加密方式:
——bit10~bit12 为数据加密标识位;
——当此三位都为 0,表示消息体不加密;
——当第 10 位为 1,表示消息体经过 RSA 算法加密;
——其他保留。
分包:
当消息体属性中第 13 位为 1 时表示消息体为长消息,进行分包发送处理,具体分包信息由消息包封装项决定;若第 13 位为 0,则消息头中无消息包封装项字段。
消息包封装项内容见 表 3:
表 3 消息包封装项内容
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
消息总包数 |
WORD |
该消息分包后的总包数 |
2 |
包序号 |
WORD |
从 1 开始 |
1.4.4 校验码
校验码指从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。
2通信连接
2.1 连接的建立
终端与平台的数据日常连接可采用 TCP方式,终端复位后应尽快与平台建立连接,连接建立后立即向平台发送终端鉴权消息进行鉴权。
2.2 连接的维持
连接建立和终端鉴权成功后,在没有正常数据包传输的情况下,终端应周期性向平台发送终端心跳消息,平台收到后向终端发送平台通用应答消息,发送周期由终端参数指定。
2.3 连接的断开
平台和终端均可根据 TCP 协议主动断开连接,双方都应主动判断 TCP 连接是否断开。
平台判断 TCP 连接断开的方法:
——根据 TCP 协议判断出终端主动断开;
——相同身份的终端建立新连接,表明原连接已断开;
——在一定的时间内未收到终端发出的消息,如终端心跳。
终端判断 TCP 连接断开的方法:
——根据 TCP 协议判断出平台主动断开;
——数据通信链路断开;
——数据通信链路正常,达到重传次数后仍未收到应答。
3 数据格式
3.1 终端通用应答
消息 ID:0x0001。
终端通用应答消息体数据格式见 表 4。
表 4 终端通用应答消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
应答流水号 |
WORD |
对应的平台消息的流水号 |
2 |
应答 ID |
WORD |
对应的平台消息的 ID |
4 |
结果 |
BYTE |
0:成功/确认; 1:失败; 2:消息有误; 3:不支持 |
3.2 平台通用应答
消息 ID:0x8001。
平台通用应答消息体数据格式见 表 5。
表 5 平台通用应答消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
应答流水号 |
WORD |
对应的平台消息的流水号 |
2 |
应答 ID |
WORD |
对应的平台消息的 ID |
4 |
结果 |
BYTE |
0:成功/确认; 1:失败; 2:消息有误; 3:不支持; 4:报警处理确认; |
3.3 终端心跳
消息 ID:0x0002。
终端心跳数据消息体为空。
3.4 补传分包请求
消息ID:0x8003。
补传分包请求消息体数据格式见表6。
表 6 补传分包请求消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
原始消息流水号 |
WORD |
对应要求补传的原始消息第一包的消息流水号 |
4 |
重传包总数 |
BYTE |
n |
5 |
重传包 ID 列表 |
BYTE[2*n] |
重传包序号顺序排列,如“包 ID1 包 ID2...... 包 IDn”。 |
注: 对此消息的应答应采用原始消息将重传包ID列表中的分包重发一次,与原始分包
消息完全一致。
3.5 终端鉴权
消息ID:0x0102。
终端鉴权消息体数据格式见表7。
表 7 终端鉴权消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
鉴权码 |
STRING |
终端重连后上报鉴权码 |
注: 对此消息的应答应采用通用应答,设备不存在时回复不支持。
3.6 注册
消息ID:0X0900。
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
制造商ID |
BYTE[5] |
请填写平台给制造商分配的制造商ID,默认为5个字节的ASCII码 |
4 |
客户名长度 |
Byte |
客户名称长度 |
5 |
客户名 |
String |
客户名 |
设备通过注册后,将直接被添加到该供应商对应的分组下。
通用应答
376 设置终端参数
消息ID:0x9103。 与0X8103区分,不影响原有业务。
设置终端参数消息体数据格式见表8。
表 8终端参数消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
参数类型 |
BYTE |
参数类型见 表9 |
1 |
参数体 |
xml格式参数文件 |
表9 参数类型表
类型ID |
描述及要求 |
0 |
PARAM_TYPE_TDBASIC = 0,//JTBaseSet_t |
1 |
PARAM_TYPE_OSD,//OsdSet_t 1 |
2 |
PARAM_TYPE_STORE,//StoreSet_t 2 |
3 |
PARAM_TYPE_SERVER,//ServerSet_t 3 |
4 |
PARAM_TYPE_DIALUP,//DialupSet_t 4 |
5 |
PARAM_TYPE_LOCAL,//LocalSet_t 5 |
6 |
PARAM_TYPE_CLOCK,//ClockSet_t 6 |
7 |
PARAM_TYPE_RSBASE,//RsBaseSet_t 7 |
8 |
PARAM_TYPE_POWER,//PowerSet_t 8 |
9 |
PARAM_TYPE_VIDEOOUT,//VideoOut_t 9 |
10 |
PARAM_TYPE_IO,//IOSet_t 10 |
11 |
PARAM_TYPE_UPGRADE,//UpgradeSet_t 11 |
12 |
PARAM_TYPE_SPEED,//SpeedSet_t 12 |
13 |
PARAM_TYPE_GSENSOR,//GsensorSet_t 13 |
14 |
PARAM_TYPE_VOLTAGE,//VoltageSet_t 14 |
15 |
PARAM_TYPE_TEMP,//TempSet_t 15 |
16 |
PARAM_TYPE_WIFI,//WifiSet_t 16 |
17 |
PARAM_TYPE_DISPLAY,//DisplaySet_t 17 |
18 |
PARAM_TYPE_PTZ,//PtzSet_t 18 |
19 |
PARAM_TYPE_DST,//DstSet_t 19 |
20 |
PARAM_TYPE_MOTIONDETECT,//MotionDetectionSet_t 20 |
21 |
PARAM_TYPE_RECORD,//RecordSet_t 21 |
22 |
PARAM_TYPE_LANGUAGE,//LanguageSet_t 22 |
23 |
PARAM_TYPE_VLOSS,//VideoLostAlm_t 23 |
24 |
PARAM_TYPE_DISKALARM,//DiskAbnormalAlm_t 24 |
25 |
PARAM_TYPE_VERSION,//VersionInfo_t,只获取,不设置 25 |
26 |
PARAM_TYPE_PRODUCT,//Product_t,只获取,不设置 26 |
27 |
PARAM_TYPE_TTX,//ReportIntervalSet_t 27 |
28 |
PARAM_TYPE_ACCOUNT,//AccountInfo_t 28 |
29 |
PARAM_TYPE_USRDEF,//UserDefineConfig_t 29 |
30 |
PARAM_TYPE_FATIGUE,//FatigueSet_t 30 |
31 |
PARAM_TYPE_LOG, //LogSet_t 31 |
32 |
PARAM_TYPE_GB28181,//GB28181 32 |
33 |
PARAM_TYPE_GB_JT,//GbJt_s 33 |
34 |
PARAM_TYPE_DRIVINGPOSTURE, // 34 |
35 |
PARAM_TYPE_YUVBGR, // 35 |
36 |
PARAM_TYPE_AIBSD, //36 |
37 |
PARAM_TYPE_AIADAS, //37 |
38 |
PARAM_TYPE_AIDMS, //38 |
39 |
PARAM_TYPE_AI360_RECT_REGION,//39 360 标定8个棋盘的画框位置 |
40 |
PARAM_TYPE_AI360_CAR,//40 360 标定参数相机外参数 |
41 |
PARAM_TYPE_AIBSD_BD, //41 |
42 |
PARAM_TYPE_AIADAS_BD, //42 |
43 |
PARAM_TYPE_AIDMS_BD, //43 |
44 |
PARAM_TYPE_AiDMS_YB, |
45 |
PARAM_TYPE_AiDMS_XB, |
46 |
PARAM_TYPE_AiADAS_YB, |
47 |
PARAM_TYPE_AiADAS_XB, |
48 |
PARAM_TYPE_TIMING_SANP, |
49 |
PARAM_TYPE_MS_FACE_COUNT, |
3.7 查询指定终端参数
消息ID:0x9106。
查询指定终端参数消息体数据格式见表10,终端采用0x0104指令应答。
表 10 查询指定终端参数消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
参数类型 |
BYTE |
参数类型见 表 9 |
3.8 查询终端参数应答
消息ID:0x9104。
查询终端参数应答消息体数据格式见表11。
表 11 查询终端参数应答消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
参数类型 |
BYTE |
参数类型见 表 9 |
1 |
参数体 |
xml格式参数文件 |
3.9 终端控制
消息ID:0x8105。
终端控制消息体数据格式见表12。
表 12 终端控制消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
命令字 |
BYTE |
终端控制命令字说明见 表 13 |
1 |
命令参数 |
STRING |
命令参数格式具体见后面描述,每个字段之间采用半角”;”分隔,每个 STRING 字段先按 GBK 编码处理后再组成消息 |
表 13 终端控制命令字说明式
命令字 |
命令参数 |
描述及要求 |
3 |
无 |
终端关机 |
4 |
无 |
终端复位 |
5 |
无 |
终端恢复出厂设置 |
6 |
BYTE |
格式化磁盘,类型为: typedef enum{ DISK_PORT_UNKNOWN = 0, DISK_PORT_SATA1=1, DISK_PORT_SATA2=2, DISK_PORT_SATA3=3, DISK_PORT_SATA4=4, DISK_PORT_SD1=5, DISK_PORT_SD2=6, DISK_PORT_SD3=7, DISK_PORT_SD4=8, DISK_PORT_USB1=9, DISK_PORT_USB2=10, DISK_PORT_FLASH0=11,//config DISK_PORT_FLASH1=12,//nor ext DISK_PORT_FLASH2=13,//nand DISK_PORT_FLASH3=14,//EMMC DISK_PORT_IMAX }DISK_PORT_E; |
3.10 位置信息汇报
消息ID:0x0200。
该包建议平时不上传,只在开机和特殊报警时候上传。
位置信息汇报消息体由位置基本信息和位置附加信息项列表组成,消息结构图如图3所示:
图3 位置汇报消息结构图
位置基本信息 |
位置附加信息项列表 |
位置附加信息项列表由各位置附加信息项组合,也可没有,根据消息头中的长度字段确定。
位置基本信息数据格式见表14。
表14 位置基本信息数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
报警标志 |
DWORD |
报警标志位定义见表 15 |
4 |
状态 |
DWORD |
状态位定义见 表 16 |
8 |
纬度 |
DWORD |
以度为单位的纬度值乘以 10 的 6 次方,精确到百万 分之一度 |
12 |
经度 |
DWORD |
以度为单位的经度值乘以 10 的 6 次方,精确到百万 分之一度 |
16 |
高程 |
WORD |
海拔高度,单位为米(m) |
18 |
速度 |
WORD |
1/10km/h |
20 |
方向 |
WORD |
0-359,正北为 0,顺时针 |
22 |
时间 |
BCD[6] |
YY-MM-DD-hh-mm-ss(GMT+8 时间,本标准中之后涉 及的时间均采用此时区) |
表15 报警标志位定义
位 |
定义 |
说明 |
0 |
||
1 |
表 16 状态位定义
位 |
状态 |
0 |
|
1 |
位置附加信息项格式见 表 17。
表 17 位置附加信息项格式
字段 |
数据类型 |
描述及要求 |
附加信息 ID |
BYTE |
1-255 |
附加信息长度 |
BYTE |
|
附加信息 |
附加信息定义见 表 18 |
3.11 位置信息查询
消息 ID:0x8201。
位置信息查询消息体为空。
3.12 位置信息查询应答
消息ID:0x0201。
位置信息查询应答消息体数据格式见表30。
表30 位置信息查询应答消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
应答流水号 |
WORD |
对应的位置信息查询消息的流水号 |
1 |
位置信息汇报 |
位置信息汇报见 3.10 |
3.13 文本信息下发
消息ID:0x8300。
文本信息下发消息体数据格式见表31。
表31 文本信息下发消息体数据格式
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
标志 |
BYTE |
保留 |
1 |
文本信息 |
STRING |
根据表32文本信息控制指令说明,实现升级和日志下载等功能。 |
表32 文本信息控制指令说明
关键字 |
描述及要求 |
FTPCT |
远程升级: #FTPCT:IP,端口,用户名,密码,升级文件名; 举例: #FTPCT:192.168.1.170,21,tjsx,123456,01_5656_5656_7788_HJAV300JT-V19062701-V18070301-V18112801-T19081402.3535.sw; 本协议只是参考,为了兼容性,平台将自定模板的方式实现该功能。 |
UPLOAD_LOG |
日志下载: #UPLOAD_LOG:开始时间-结束时间(YYYYMMDD-HHMMSS),ip,端口,用户名,密码 #UPLOAD_LOG:20201111-000000 20201111-235959 192.168.1.125 21 admin 123456 详细说明: 20201111-000000:日志开始时间 20201111-235959:日志结束时间 192.168.1.125:ftp服务器地址 21:ftp端口 admin:账号 123456:密码 上传后,web会自动下载到本地。 |
其他 |
供应商自己定义 |
3.14 状态通知
消息ID:0x1300。
通知一些处理事务的完成或者失败
起始字节 |
字段 |
数据类型 |
描述及要求 |
0 |
对应命令 |
BYTE |
0:升级 1:日志下载 2-255:预留 |
1 |
状态 |
Byte |
0:成功 1:密码不对 2:网络连接失败 3:数据不对 4:其他失败原因 |
3.15 终端属性查询(参考808-2013协议)