- 掌握进制转换:二进制转十六进制;
- 掌握 BCD 编码、Hex 编码;
- 掌握各种位移、异或;
- 掌握常用反射;
- 掌握 JObject 的用法;
- 掌握快速 ctrl+c、ctrl+v;
- 掌握 Span<T>的基本用法
- 掌握以上装逼技能,就可以开始搬砖了。
头标识 | 数据头 | 数据体 | 校验码 | 尾标识 |
---|---|---|---|---|
Begin | JT905Header | JT905Bodies | CheckCode | End |
7E | - | - | - | 7E |
消息 ID | 消息体长度 | ISU 标识 | 消息流水号 |
---|---|---|---|
MsgId | DataLength | ISU | MsgNum |
根据对应消息 ID:MsgId
注意:数据内容(除去头和尾标识)进行转义判断
转义规则如下:
- 若数据内容中有出现字符 0x7e 的,需替换为字符 0x7d 紧跟字符 0x02;
- 若数据内容中有出现字符 0x7d 的,需替换为字符 0x7d 紧跟字符 0x01;
反转义的原因:确认 JT905 协议的 TCP 消息边界。
MsgId 0x0200:位置信息汇报
JT905Package JT905Package = new JT905Package();
JT905Package.Header = new JT905Header
{
MsgId = Enums.JT905MsgId.位置信息汇报.ToUInt16Value(),
ManualMsgNum = 126,
ISU = "103456789012"
};
JT905_0x0200 JT905_0x0200 = new JT905_0x0200
{
AlarmFlag = 1,
GPSTime = DateTime.Parse("2021-10-15 21:10:10"),
Lat = 12222222,
Lng = 132444444,
Speed = 60,
Direction = 0,
StatusFlag = 2,
BasicLocationAttachData = new Dictionary<byte, JT905_0x0200_BodyBase>()
};
JT905_0x0200.BasicLocationAttachData.Add(JT905Constants.JT905_0x0200_0x01, new JT905_0x0200_0x01
{
Mileage = 100
});
JT905_0x0200.BasicLocationAttachData.Add(JT905Constants.JT905_0x0200_0x02, new JT905_0x0200_0x02
{
Oil = 125
});
JT905Package.Bodies = JT905_0x0200;
byte[] data = JT905Serializer.Serialize(JT905Package);
var hex = data.ToHexString();
// 输出结果Hex:
// 7E02000023103456789012007D02000000010000000200BA7F0E07E4F11C003C002110152110100104000000640202007D01347E
1.原包:
7E 02 00 00 23 10 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 3C 00 21 10 15 21 10 10 01 04 00 00 00 64 02 02 00 (7D 01) 34 7E
2.进行反转义
7D 02 ->7E
7D 01 ->7D
反转义后
7E 02 00 00 23 10 34 56 78 90 12 00 7E 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 3C 00 21 10 15 21 10 10 01 04 00 00 00 64 02 02 00 7D 34 7E
3.拆解
7E --头标识
02 00 --数据头->消息ID
00 23 --数据头->消息体属性
10 34 56 78 90 12 --数据头->终端手机号
00 7E --数据头->消息流水号
00 00 00 01 --消息体->报警标志
00 00 00 02 --消息体->状态位标志
00 BA 7F 0E --消息体->纬度
07 E4 F1 1C --消息体->经度
00 3C --消息体->速度
00 --消息体->方向
21 10 15 21 10 10 --消息体->GPS时间
01 --消息体->附加信息->里程
04 --消息体->附加信息->长度
00 00 00 64 --消息体->附加信息->数据
02 --消息体->附加信息->油量
02 --消息体->附加信息->长度
00 7D --消息体->附加信息->数据
34 --检验码
7E --尾标识
//1.转成byte数组
byte[] bytes = "7E02000023103456789012007D02000000010000000200BA7F0E07E4F11C003C002110152110100104000000640202007D01347E".ToHexBytes();
//2.将数组反序列化
var jT905Package = JT905Serializer.Deserialize<JT905Package>(bytes);
//3.数据包头
Assert.Equal(Enums.JT905MsgId.位置信息汇报.ToValue(), jT905Package.Header.MsgId);
Assert.Equal(0x23, jT905Package.Header.DataLength);
Assert.Equal(126, jT905Package.Header.MsgNum);
Assert.Equal("103456789012", jT905Package.Header.ISU);
//4.数据包体
JT905_0x0200 jT905_0x0200 = (JT905_0x0200)jT905Package.Bodies;
Assert.Equal((uint)1, jT905_0x0200.AlarmFlag);
Assert.Equal(DateTime.Parse("2021-10-15 21:10:10"), jT905_0x0200.GPSTime);
Assert.Equal(12222222, jT905_0x0200.Lat);
Assert.Equal(132444444, jT905_0x0200.Lng);
Assert.Equal(60, jT905_0x0200.Speed);
Assert.Equal(0, jT905_0x0200.Direction);
Assert.Equal((uint)2, jT905_0x0200.StatusFlag);
//4.1.附加信息1
Assert.Equal(100, ((JT905_0x0200_0x01)jT905_0x0200.BasicLocationAttachData[JT905Constants.JT905_0x0200_0x01]).Mileage);
//4.2.附加信息2
Assert.Equal(125, ((JT905_0x0200_0x02)jT905_0x0200.BasicLocationAttachData[JT905Constants.JT905_0x0200_0x02]).Oil);
Package Name | Version | Preview Version | Downloads | Remark |
---|---|---|---|---|
Install-Package JT905 | JT905 |
todo:
序号 | 消息 ID | 完成情况 | 测试情况 | 消息体名称 |
---|---|---|---|---|
1 | 0x0001 | √ | √ | ISU 通用应答 |
2 | 0x8001 | √ | √ | 中心通用应答 |
3 | 0x0002 | √ | √ | ISU 心跳 |
4 | 0x8103 | √ | √ | 设置参数 |
5 | 0x8104 | √ | √ | 查询 ISU 参数 |
6 | 0x0104 | √ | √ | 查询 ISU 参数应答 |
7 | 0x8105 | √ | √ | ISU 控制 |
8 | 0x0105 | √ | √ | ISU 升级结果报告消息 |
9 | 0x0200 | √ | √ | 位置信息汇报 |
10 | 0x8201 | √ | √ | 位置信息查询 |
11 | 0x0201 | √ | √ | 位置信息查询应答 |
12 | 0x8202 | √ | √ | 位置跟踪控制 |
13 | 0x0202 | √ | √ | 位置跟踪信息汇报 |
14 | 0x0203 | √ | √ | 位置汇汇报数据补传 |
15 | 0x8300 | √ | √ | 文本信息下发 |
16 | 0x8301 | √ | √ | 事件设置 |
17 | 0x0301 | √ | √ | 事件报告 |
18 | 0x8302 | √ | √ | 提问下发 |
19 | 0x0302 | √ | √ | 提问应答 |
20 | 0x8400 | √ | √ | 电话回拨 |
21 | 0x8401 | √ | √ | 设置电话本 |
22 | 0x8500 | √ | √ | 车辆控制 |
23 | 0x0500 | √ | √ | 车辆控制应答 |
24 | 0x0800 | √ | √ | 摄像头图像上传 |
25 | 0x8801 | √ | √ | 摄像头立即拍摄命令 |
26 | 0x8802 | √ | √ | 存储图像检索 |
27 | 0x0802 | √ | √ | 存储图像检索应答 |
28 | 0x8803 | √ | √ | 存储图像/音视频上传命令 |
29 | 0x8B00 | √ | √ | 订单任务下发 |
30 | 0x8B01 | √ | √ | 下发抢答结果信息 |
31 | 0x0B01 | √ | √ | 驾驶员抢答 |
32 | 0x0B07 | √ | √ | 驾驶员电召任务完成确认 |
33 | 0x0B08 | √ | √ | 驾驶员取消订单 |
34 | 0x8B09 | √ | √ | 中心取消订单 |
35 | 0x0B03 | √ | √ | 上班签到信息上传 |
36 | 0x0B04 | √ | √ | 下班签退信息上传 |
37 | 0x0B05 | √ | √ | 运营数据上传 |
38 | 0x8B10 | √ | √ | 外围设备指令下行透传 |
39 | 0x0B10 | √ | √ | 外围设备指令上行透传 |
40 | 0x8850 | 音频检索 | ||
41 | 0x0805 | 存储音频检索应答 | ||
42 | 0x0806 | 音频上传 | ||
43 | 0x8B0A | √ | √ | 中心报警确认 |
44 | 0x8B0B | √ | √ | 中心报警解除 |
45 | 0x8B11 | √ | √ | 中心巡检设备 |
46 | 0x0B11 | 设备巡检应答 |
todo:
以营运数据为例,具体使用方法详见: