JT808协议
前提条件
掌握进制转换:二进制转十六进制;
掌握BCD编码、Hex编码;
掌握各种位移、异或;
掌握常用反射;
掌握快速ctrl+c、ctrl+v;
掌握以上装逼技能,就可以开始搬砖了。
JT808数据结构解析
数据包[JT808Package]
头标识
数据头
数据体
校验码
尾标识
Begin
JT808Header
JT808Bodies
CheckCode
End
7E
-
-
-
7E
数据头[JT808Header]
消息ID
消息体属性
终端手机号
消息流水号
MsgId
JT808HeaderMessageBodyProperty
TerminalPhoneNo
MsgNum
数据头-消息体属性[JT808HeaderMessageBodyProperty]
是否分包
加密标识
消息体长度
消息总包数
包序号
IsPackge
Encrypt
DataLength
PackgeCount
PackageIndex
消息体属性[JT808Bodies]
根据对应消息ID:MsgId
注意:数据内容(除去头和尾标识)进行转义判断
转义规则如下:
若数据内容中有出现字符 0x7e 的,需替换为字符 0x7d 紧跟字符 0x02;
若数据内容中有出现字符 0x7d 的,需替换为字符 0x7d 紧跟字符 0x01;
反转义的原因:确认JT808协议的TCP消息边界。
举个栗子1
1.组包:
MsgId 0x0200:位置信息汇报
JT808Package jT808Package = new JT808Package();
jT808Package.Header = new JT808Header
{
MsgId = Enums.JT808MsgId.位置信息汇报,
MsgNum = 126,
TerminalPhoneNo = "123456789012"
};
JT808_0x0200 jT808_0x0200 = new JT808_0x0200();
jT808_0x0200.AlarmFlag = 1;
jT808_0x0200.Altitude = 40;
jT808_0x0200.GPSTime = DateTime.Parse("2018-10-15 10:10:10");
jT808_0x0200.Lat = 12222222;
jT808_0x0200.Lng = 132444444;
jT808_0x0200.Speed = 60;
jT808_0x0200.Direction = 0;
jT808_0x0200.StatusFlag = 2;
jT808_0x0200.JT808LocationAttachData = new Dictionary();
jT808_0x0200.JT808LocationAttachData.Add(JT808_0x0200_BodyBase.AttachId0x01, new JT808_0x0200_0x01
{
Mileage = 100
});
jT808_0x0200.JT808LocationAttachData.Add(JT808_0x0200_BodyBase.AttachId0x02, new JT808_0x0200_0x02
{
Oil = 125
});
jT808Package.Bodies = jT808_0x0200;
byte[] data = JT808Serializer.Serialize(jT808Package);
var hex = data.ToHexString();
// 输出结果Hex:
// 7E 02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01 13 7E
2.手动解包:
1.原包:
7E 02 00 00 26 12 34 56 78 90 12 00 (7D 02) 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 (7D 01) 13 7E
2.进行反转义
7D 02 ->7E
7D 01 ->7D
反转义后
7E 02 00 00 26 12 34 56 78 90 12 00 7E 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 13 7E
3.拆解
7E --头标识
02 00 --数据头->消息ID
00 26 --数据头->消息体属性
12 34 56 78 90 12 --数据头->终端手机号
00 7E --数据头->消息流水号
00 00 00 01 --消息体->报警标志
00 00 00 02 --消息体->状态位标志
00 BA 7F 0E --消息体->纬度
07 E4 F1 1C --消息体->经度
00 28 --消息体->海拔高度
00 3C --消息体->速度
00 00 --消息体->方向
18 10 15 10 10 10 --消息体->GPS时间
01 --消息体->附加信息->里程