(1)基本数据类型各占多少个字节
数据类型 |
字节 |
byte |
1 |
short |
2 |
int |
4 |
long |
8 |
float |
4 |
double |
8 |
char |
2 |
boolean |
4 |
(2)十六进制
十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F表示,其中:A~F相当于十进制的10~15,这些称作十六进制数字。
参考地址: https://zh.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6
(3)大小端模式
大端模式:低位(字节/比特)放在高地址中,高位(字节/比特)放在低地址中。
小端模式:低位(字节/比特)放在低地址中,高位(字节/比特)放在高地址中。
一般操作系统都是小端模式;而通讯协议是大端模式。
java和平台无关,默认是大端模式。
参考地址:https://www.cnblogs.com/justkong/p/8807534.html
(1)对接数据帧封装协议
表2.3.1 通用数据帧
帧 头 2byte |
帧长度 4byte |
帧流水号 2byte |
协议版本 1byte |
命令 1byte |
数据载荷 LEN byte |
校验和 1byte |
0x5A55 |
0x0000 ~0xFFFFFFFF |
0x0000 ~0xFFFF |
0x00~0xFF |
0x00-0xFF |
—— |
0x00~0xFF |
表2.3.2命令子域值
命令值 |
描述 |
反馈命令值 |
0x01 |
厂商识别码验证请求 |
0x01 |
0x03 |
心跳 |
0x03 |
0xFE |
获取平台时间 |
0xFE |
0x26 |
上传车牌识别数据 |
0x26 |
注:
1、所有信息传输时,低字节在前,高字节在后。
2、信息的反馈
信息产生端发送数据包给信息处理端后,信息处理端反馈数据包格式和请求帧一致,定义如下:
表2.3.3 反馈数据帧
帧 头 2byte |
帧长度 4byte |
帧流水号 2byte |
协议版本 1byte |
命令 1byte |
数据载荷 LEN byte |
校验和 1byte |
0x5A55 |
0x0000 ~0xFFFFFFFF |
同请求帧流水号 |
同请求帧协议版本 |
请求帧命令 |
—— |
0x00~0xFF |
如表2.3.1所示,通信帧结构包括帧头子域、帧长度子域、帧流水号子域、协议版本子域、命令子域、数据载荷子域、校验和子域。其中,帧头为固定的2个字节(0x5A55);帧长度子域4个字节,其值为除帧头外实际数据帧长度,包括帧长度子域本身的长度;帧流水号子域2个字节,信息产生端上发数据是产生的帧流水号约定在1-1024数字范围内,对信息产生端主动上报的数据,信息处理端返回响应帧中的帧流水号同上报帧流水号,同样信息产生端响应平台请求帧的流水号也需相同,该帧流水号区分不同帧;协议版本子域1个字节,表示命令的协议版本;命令子域1个字节,其值定义如表所示;数据载荷子域的字节数LEN是根据不同的数据帧结构变化的,详见具体帧结构;校验和:从帧头0x5A55开始累加到校验和子域之前,包括帧头字节。
(2)文档分析
确定数据值为:帧头固定、帧流水号约到在1-1024之间、协议版本固定01、命令固定,
需要计算的值为:帧长度,数据载荷长度(数据载荷为json字符串,可详情参看河源对接文档)、校验和
需要小端排序字段:帧长度、帧流水号
(3)变量声明
帧头为2字节,Java基本数据类型应声明为short
帧长度为4字节,Java基本数据类型应声明为int
帧流水号为2字节,Java基本数据类型应声明为short
协议版本为1字节,Java基本数据类型应声明为byte
命令为1字节,Java基本数据类型byte
数据载荷为json字符串,Java基本数据类型应声明为String
校验和为1字节,Java基本数据类型应声明为byte
(4)相关计算
帧长度计算:
帧长度是除帧头以为的数据长度,现在只有数据载荷长度未知,那么帧长度4+帧流水号长度2+协议版本长度1+命令长度1+数据载荷长度?+校验和长度1即为帧长度
帧长度计算公式则变成:9+?数据载荷长度
数据载荷长度计算:
数据载荷为String,将String转为byte数组,获取byte数组的长度即为数据载荷长度
校验和计算:
校验和:从帧头0x5A55开始累加到校验和子域之前,包括帧头字节
(这个校验和计算是请教的硬件部门同事)
就是把帧头到数据载荷放到一个byte数组然后计算长度
(5)帧长度、帧流水号小端排序计算:
数据包组装:
经和对接方确认tcp调试工具发送的是十六进制的数据包
所以要将对接的数据转换为十六进制,然后拼接在一起形成一个完整的16进制数据包
(6)数据包调试
使用TCP调试助手以十六进制发送数据包,验证能否收到返回,能收到即说明数据包组装无误。