完整的数据包
一个完整的数据包应由起始符、命令单元、识别码、数据加密方式、数据单元长度、数据单元和校验
码组成,数据包结构和定义见表:

起始符
起始符:固定为ASCII字符‘##’,用“0x23,0x23”表示
长度:距离下一个命令单元起始字节2,所以长度是2个字节
读取方式:buf.readShort()
转换16进制对比“0x23,0x23”:HexUtil.toHex(buf.readShort())
命令单元
命令单元-命令标识
命令标识应是发起方的唯一标识,代表是协议类型(业务类型)

长度:1个字节
读取方式:buf.readByte()
byte转int:int aid = aidByte & 0xFF; 或 int aid = (int)aidByte;
命令标识定义示例:public static final short AID_LOGIN = 0x01;
命令单元-应答标志
- 命令的主动发起方应答标志为0xFE,表示此包为命令包;
- 当应答标志不是0xFE时,被动接收方应不应答。
- 当命令的被动接收方应答标志不是0xFE,此包表示为应答包。
- 当服务端发送应答时,应变更应答标志,保留报文时间,删除其余报文内容,并重新计算校验位。

长度:1个字节
读取方式:buf.readByte()
byte转int:int mid = midByte & 0xFF; 或 int mid = (int)midByte;
应答标志作用:用于判断是否需要应答协议
唯一识别码
当传输车辆数据时,应使用车辆VIN,其字码应符合GB16735 的规定。
如传输其他数据,则使用唯一自定义编码。
长度:距离下一个命令单元起始字节21,所以长度是21-4=17个字节(初学者根据协议计算长度),但其实车架号固定长度就是17
读取方式:
byte[] vinBytes = new byte[17];
buf.readBytes(vinBytes);
String vin = new String(vinBytes, Charset.forName("utf-8"));
数据单元加密方式
- 0x01:数据不加密;
- 0x02:数据经过RSA 算法加密;
- 0x03:数据经过AES128 位算法加密;
- 0xFE:表示异常,
- 0xFF:表示无效,其他预留。
长度:1个字节
读取方式:
读取方式:buf.readByte()
byte转int:int securityType = securityTypeByte & 0xFF;
或 int securityType = (int)securityTypeByte;
/**
0x01:数据不加密
*/
public static final int SECURE_NONE = 0x01;
/**
0x02:数据经过RSA算法加密
*/
public static final int SECURE_RSA = 0x02;
/**
0x03数据经过AES128位算法加密
*/
public static final int SECURE_AES = 0x03;
if (securityType == SECURE_RSA) {
} else if (securityType == SECURE_RSA) {
}
数据单元长度
数据单元长度是数据单元的总字节数,有效值范围:0~65531。
长度:2个字节
读取方式:buf.readShort()
short占两个字节,且数据单元长度正好是int,可以直接用readShort()读取
数据单元
每条命令标识数据集不同,详看数据单元格式及定义
2211

被折叠的 条评论
为什么被折叠?



