@@ -1,5 +1,6 @@ | |||
# JT808协议 | |||
[](https://github.com/SmallChi/JT808/blob/master/LICENSE) | |||
## 前提条件 | |||
@@ -379,33 +380,34 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 5.0 | |||
| **0x0100Serialize** | **0x0100Serializer** | **100000** | **80,403.44 μs** | **1,522.446 μs** | **1,563.440 μs** | **10714.2857** | **-** | **-** | **66406.25 KB** | | |||
| 0x0100Deserialize | 0x0100Serializer | 100000 | 69,196.07 μs | 1,289.555 μs | 1,206.251 μs | 15666.6667 | - | - | 96875.13 KB | | |||
## JT808终端通讯协议消息对照表 | |||
| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 |2019版本| | |||
| :---: | :-----------: | :------: | :------: | :---------------------------- |:----------------------------:| | |||
| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 |2019版本 | 2011版本 | |||
| :---: | :-----------: | :------: | :------: | :---------------------------- |:----------------------------:|:----------------------------:| | |||
| 1 | 0x0001 | √ | √ | 终端通用应答 | | |||
| 2 | 0x8001 | √ | √ | 平台通用应答 | | |||
| 3 | 0x0002 | √ | √ | 终端心跳 | | |||
| 4 | 0x8003 | √ | √ | 补传分包请求 | | |||
| 5 | 0x0100 | √ | √ | 终端注册 |修改| | |||
| 4 | 0x8003 | √ | √ | 补传分包请求 | |被新增 | |||
| 5 | 0x0100 | √ | √ | 终端注册 |修改 |被修改 | |||
| 6 | 0x8100 | √ | √ | 终端注册应答 | | |||
| 7 | 0x0003 | √ | √ | 终端注销 | | |||
| 8 | 0x0102 | √ | √ | 终端鉴权 |修改| | |||
| 9 | 0x8103 | √ | √ | 设置终端参数 |修改且增加| | |||
| 9 | 0x8103 | √ | √ | 设置终端参数 |修改且增加 |被修改 | |||
| 10 | 0x8104 | √ | √ | 查询终端参数 | | |||
| 11 | 0x0104 | √ | √ | 查询终端参数应答 | | |||
| 12 | 0x8105 | √ | √ | 终端控制 | | |||
| 13 | 0x8106 | √ | √ | 查询指定终端参数 | | |||
| 14 | 0x8107 | √ | 消息体为空| 查询终端属性 | | |||
| 15 | 0x0107 | √ | √ | 查询终端属性应答 | | |||
| 16 | 0x8108 | √ | √ | 下发终端升级包 | | |||
| 17 | 0x0108 | √ | √ | 终端升级结果通知 | | |||
| 18 | 0x0200 | √ | √ | 位置信息汇报 |增加附加信息| | |||
| 13 | 0x8106 | √ | √ | 查询指定终端参数 | |被新增 | |||
| 14 | 0x8107 | √ | 消息体为空| 查询终端属性 | |被新增 | |||
| 15 | 0x0107 | √ | √ | 查询终端属性应答 | |被新增 | |||
| 16 | 0x8108 | √ | √ | 下发终端升级包 | |被新增 | |||
| 17 | 0x0108 | √ | √ | 终端升级结果通知 | |被新增 | |||
| 18 | 0x0200 | √ | √ | 位置信息汇报 |增加附加信息 |被修改 | |||
| 19 | 0x8201 | √ | √ | 位置信息查询 | | |||
| 20 | 0x0201 | √ | √ | 位置信息查询应答 | | |||
| 21 | 0x8202 | √ | √ | 临时位置跟踪控制 | | |||
| 22 | 0x8203 | √ | √ | 人工确认报警消息 | | |||
| 23 | 0x8300 | √ | √ | 文本信息下发 |修改| | |||
| 22 | 0x8203 | √ | √ | 人工确认报警消息 | |被新增 | |||
| 23 | 0x8300 | √ | √ | 文本信息下发 |修改 |被修改 | |||
| 24 | 0x8301 | √ | √ | 事件设置 |删除| | |||
| 25 | 0x0301 | √ | √ | 事件报告 |删除| | |||
| 26 | 0x8302 | √ | √ | 提问下发 |删除| | |||
@@ -417,7 +419,7 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 5.0 | |||
| 32 | 0x8401 | √ | √ | 设置电话本 | | |||
| 33 | 0x8500 | √ | √ | 车辆控制 |修改| | |||
| 34 | 0x0500 | √ | √ | 车辆控制应答 | | |||
| 35 | 0x8600 | √ | √ | 设置圆形区域 |修改| | |||
| 35 | 0x8600 | √ | √ | 设置圆形区域 |修改 |被修改 | |||
| 36 | 0x8601 | √ | √ | 删除圆形区域 | | |||
| 37 | 0x8602 | √ | √ | 设置矩形区域 |修改| | |||
| 38 | 0x8603 | √ | √ | 删除矩形区域 | | |||
@@ -425,26 +427,26 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 5.0 | |||
| 40 | 0x8605 | √ | √ | 删除多边形区域 | | |||
| 41 | 0x8606 | √ | √ | 设置路线 |修改| | |||
| 42 | 0x8607 | √ | √ | 删除路线 | | |||
| 43 | 0x8700 | √ | √ | 行驶记录仪数据采集命令 | | |||
| 43 | 0x8700 | √ | √ | 行驶记录仪数据采集命令 | |被修改 | |||
| 44 | 0x0700 | √ | √ | 行驶记录仪数据上传 | | |||
| 45 | 0x8701 | √ | √ | 行驶记录仪参数下传命令 | | |||
| 45 | 0x8701 | √ | √ | 行驶记录仪参数下传命令 | |被修改 | |||
| 46 | 0x0701 | √ | √ | 电子运单上报 | | |||
| 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 |修改| | |||
| 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 | | |||
| 49 | 0x0704 | √ | √ | 定位数据批量上传 |修改| | |||
| 50 | 0x0705 | √ | √ | CAN 总线数据上传 |修改| | |||
| 51 | 0x0800 | √ | √ | 多媒体事件信息上传 | | |||
| 52 | 0x0801 | √ | √ | 多媒体数据上传 |修改| | |||
| 53 | 0x8800 | √ | √ | 多媒体数据上传应答 | | |||
| 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 |修改 |被修改 | |||
| 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 | |被新增 | |||
| 49 | 0x0704 | √ | √ | 定位数据批量上传 |修改| |被新增 | |||
| 50 | 0x0705 | √ | √ | CAN 总线数据上传 |修改| |被新增 | |||
| 51 | 0x0800 | √ | √ | 多媒体事件信息上传 | |被修改 | |||
| 52 | 0x0801 | √ | √ | 多媒体数据上传 |修改 |被修改 | |||
| 53 | 0x8800 | √ | √ | 多媒体数据上传应答 | |被修改 | |||
| 54 | 0x8801 | √ | √ | 摄像头立即拍摄命令 |修改| | |||
| 55 | 0x0805 | √ | √ | 摄像头立即拍摄命令应答 |修改| | |||
| 55 | 0x0805 | √ | √ | 摄像头立即拍摄命令应答 |修改| |被新增 | |||
| 56 | 0x8802 | √ | √ | 存储多媒体数据检索 | | |||
| 57 | 0x0802 | √ | √ | 存储多媒体数据检索应答 | | |||
| 57 | 0x0802 | √ | √ | 存储多媒体数据检索应答 | |被修改 | |||
| 58 | 0x8803 | √ | √ | 存储多媒体数据上传 | | |||
| 59 | 0x8804 | √ | √ | 录音开始命令 | | |||
| 60 | 0x8805 | √ | √ | 单条存储多媒体数据检索上传命令 |修改| | |||
| 61 | 0x8900 | √ | √ | 数据下行透传 |修改| | |||
| 62 | 0x0900 | √ | √ | 数据上行透传 |修改| | |||
| 60 | 0x8805 | √ | √ | 单条存储多媒体数据检索上传命令 |修改| |被新增 | |||
| 61 | 0x8900 | √ | √ | 数据下行透传 |修改 |被修改 | |||
| 62 | 0x0900 | √ | √ | 数据上行透传 |修改 |被修改 | |||
| 63 | 0x0901 | √ | √ | 数据压缩上报 | | |||
| 64 | 0x8A00 | √ | √ | 平台 RSA 公钥 | | |||
| 65 | 0x0A00 | √ | √ | 终端 RSA 公钥 | | |||
@@ -168,5 +168,37 @@ namespace JT808.Protocol.Test.MessageBody | |||
byte[] bytes = "0121052818111100056B6F696B65000000000000000071776531323334353661616106717765727478202105280000003132333435363738393031323334353637630000003132333435363738393031323334353637".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808_0x0702>(bytes, JT808Version.JTT2019); | |||
} | |||
[Fact] | |||
public void Test2011_1() | |||
{ | |||
JT808_0x0702 jT808_0X0702 = new JT808_0x0702 | |||
{ | |||
DriverUserName = "tk", | |||
DriverIdentityCard="123456789123456789", | |||
QualificationCode = "qwe123456aaa", | |||
LicenseIssuing = "qwertx" | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808_0X0702, JT808Version.JTT2011).ToHexString(); | |||
Assert.Equal("02746B00003132333435363738393132333435363738390000000000000000000000000000000000000000000000000000000071776531323334353661616106717765727478".Replace(" ", ""), hex); | |||
} | |||
[Fact] | |||
public void Test2011_2() | |||
{ | |||
byte[] bytes = "02746B00003132333435363738393132333435363738390000000000000000000000000000000000000000000000000000000071776531323334353661616106717765727478".ToHexBytes(); | |||
JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes); | |||
Assert.Equal("tk", jT808_0X0702.DriverUserName); | |||
Assert.Equal("qwe123456aaa", jT808_0X0702.QualificationCode); | |||
Assert.Equal("qwertx", jT808_0X0702.LicenseIssuing); | |||
Assert.Equal("123456789123456789", jT808_0X0702.DriverIdentityCard); | |||
} | |||
[Fact] | |||
public void Test2011_3() | |||
{ | |||
byte[] bytes = "02746B00003132333435363738393132333435363738390000000000000000000000000000000000000000000000000000000071776531323334353661616106717765727478".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808_0x0702>(bytes, JT808Version.JTT2011); | |||
} | |||
} | |||
} |
@@ -97,5 +97,41 @@ namespace JT808.Protocol.Test.MessageBody | |||
byte[] bytes = "7e080123000138123456782032000a000205060708090a0bffc400b5100002010303020403050504040000017d0101020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffdd00040000ffda000c03010002110311003f006c6a2a755ce299a5c942e0f35281c5004aa72314a54e38a07b8841ef4840a0673de21b4ff498ee402038dade991fe7f4acc110f4a0cd8ef2f1405cd01d45f2e9360a062edc5745616a6dad511861cfccff0053499512e056cf1460e3348a0ed4b8e338fc2819cb5edbfd9ee648b18556f97fdd3d3f4aafb4d332ea433a6573e9550d3131d18c9c558031c0a4083a503039a60c42c2984e4f4a06260d370690098ef4751400c615132d021868a621431a33480ef235e05595403eb54cbb0b8e7069dc0e3a9a41b12a024f4a9d40f4a18c5651e951c88179268194ee614b989a2719461ffea35cfdcda4b6b2ed71c1e55874345c96ba91819a704c50217613db349b39031c9e945c66a69ba794713cebf30fb8be9ee6b540c1e948a48760e3a526d2dc77a0a144471d297cb623a71484646bb685234b81d01d8e7d018f43f9ff003ac16386c552225b8300c2a84c8c8c4ed247b502616cc0517e".ToHexBytes(); | |||
JT808HeaderPackage jT808_0X0801 = JT808Serializer.HeaderDeserialize(bytes); | |||
} | |||
[Fact] | |||
public void Test2011_1() | |||
{ | |||
JT808_0x0801 jT808_0X0801 = new JT808_0x0801 | |||
{ | |||
ChannelId = 123, | |||
EventItemCoding = JT808EventItemCoding.定时动作.ToByteValue(), | |||
MultimediaCodingFormat = JT808MultimediaCodingFormat.JPEG.ToByteValue(), | |||
MultimediaId = 2567, | |||
MultimediaType = JT808MultimediaType.图像.ToByteValue(), | |||
MultimediaDataPackage = new byte[] { 0x01, 0x02, 0x03, 0x04 } | |||
}; | |||
string hex = JT808Serializer.Serialize(jT808_0X0801,JT808Version.JTT2011).ToHexString(); | |||
Assert.Equal("00000A070000017B01020304", hex); | |||
} | |||
[Fact] | |||
public void Test2011_2() | |||
{ | |||
byte[] bytes = "00000A070000017B01020304".ToHexBytes(); | |||
JT808_0x0801 jT808_0X0801 = JT808Serializer.Deserialize<JT808_0x0801>(bytes); | |||
Assert.Equal(123, jT808_0X0801.ChannelId); | |||
Assert.Equal(JT808EventItemCoding.定时动作.ToByteValue(), jT808_0X0801.EventItemCoding); | |||
Assert.Equal(JT808MultimediaCodingFormat.JPEG.ToByteValue(), jT808_0X0801.MultimediaCodingFormat); | |||
Assert.Equal((uint)2567, jT808_0X0801.MultimediaId); | |||
Assert.Equal(JT808MultimediaType.图像.ToByteValue(), jT808_0X0801.MultimediaType); | |||
Assert.Equal(new byte[] { 0x01, 0x02, 0x03, 0x04 }, jT808_0X0801.MultimediaDataPackage); | |||
} | |||
[Fact] | |||
public void Test2011_3() | |||
{ | |||
byte[] bytes = "00000A070000017B01020304".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808_0x0801>(bytes); | |||
} | |||
} | |||
} |
@@ -106,5 +106,97 @@ namespace JT808.Protocol.Test.MessageBody | |||
byte[] bytes = "3051000200000102007B01000000010000000200BA7F0E07E4F11C0028003C000018111620202000000103027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808_0x0802>(bytes); | |||
} | |||
[Fact] | |||
public void Test2011_1() | |||
{ | |||
JT808_0x0802 jT808_0X0802 = new JT808_0x0802 | |||
{ | |||
MsgNum = 12369, | |||
MultimediaSearchItems = new List<JT808MultimediaSearchProperty>() | |||
}; | |||
jT808_0X0802.MultimediaSearchItems.Add(new JT808MultimediaSearchProperty() | |||
{ | |||
ChannelId = 123, | |||
EventItemCoding = JT808EventItemCoding.定时动作.ToByteValue(), | |||
MultimediaType = JT808MultimediaType.图像.ToByteValue(), | |||
Position = new JT808_0x0200() | |||
{ | |||
AlarmFlag = 1, | |||
Altitude = 40, | |||
GPSTime = DateTime.Parse("2018-11-16 20:20:20"), | |||
Lat = 12222222, | |||
Lng = 132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
} | |||
}); | |||
jT808_0X0802.MultimediaSearchItems.Add(new JT808MultimediaSearchProperty() | |||
{ | |||
ChannelId = 124, | |||
EventItemCoding = JT808EventItemCoding.平台下发指令.ToByteValue(), | |||
MultimediaType = JT808MultimediaType.视频.ToByteValue(), | |||
Position = new JT808_0x0200() | |||
{ | |||
AlarmFlag = 1, | |||
Altitude = 40, | |||
GPSTime = DateTime.Parse("2018-11-16 22:22:22"), | |||
Lat = 12222222, | |||
Lng = 132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
} | |||
}); | |||
string hex = JT808Serializer.Serialize(jT808_0X0802,JT808Version.JTT2011).ToHexString(); | |||
Assert.Equal("30510002007B01000000010000000200BA7F0E07E4F11C0028003C0000181116202020027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222", hex); | |||
} | |||
[Fact] | |||
public void Test2011_2() | |||
{ | |||
byte[] bytes = "30510002007B01000000010000000200BA7F0E07E4F11C0028003C0000181116202020027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222".ToHexBytes(); | |||
JT808_0x0802 jT808_0X0802 = JT808Serializer.Deserialize<JT808_0x0802>(bytes); | |||
Assert.Equal(12369, jT808_0X0802.MsgNum); | |||
Assert.Equal(2, jT808_0X0802.MultimediaItemCount); | |||
Assert.Equal(123, jT808_0X0802.MultimediaSearchItems[0].ChannelId); | |||
Assert.Equal(JT808EventItemCoding.定时动作.ToByteValue(), jT808_0X0802.MultimediaSearchItems[0].EventItemCoding); | |||
Assert.Equal(JT808MultimediaType.图像.ToByteValue(), jT808_0X0802.MultimediaSearchItems[0].MultimediaType); | |||
Assert.Equal((uint)1, jT808_0X0802.MultimediaSearchItems[0].Position.AlarmFlag); | |||
Assert.Equal((ushort)40, jT808_0X0802.MultimediaSearchItems[0].Position.Altitude); | |||
Assert.Equal(DateTime.Parse("2018-11-16 20:20:20"), jT808_0X0802.MultimediaSearchItems[0].Position.GPSTime); | |||
Assert.Equal(12222222, jT808_0X0802.MultimediaSearchItems[0].Position.Lat); | |||
Assert.Equal(132444444, jT808_0X0802.MultimediaSearchItems[0].Position.Lng); | |||
Assert.Equal((ushort)60, jT808_0X0802.MultimediaSearchItems[0].Position.Speed); | |||
Assert.Equal((ushort)0, jT808_0X0802.MultimediaSearchItems[0].Position.Direction); | |||
Assert.Equal((uint)2, jT808_0X0802.MultimediaSearchItems[0].Position.StatusFlag); | |||
Assert.Equal(124, jT808_0X0802.MultimediaSearchItems[1].ChannelId); | |||
Assert.Equal(JT808EventItemCoding.平台下发指令.ToByteValue(), jT808_0X0802.MultimediaSearchItems[1].EventItemCoding); | |||
Assert.Equal(JT808MultimediaType.视频.ToByteValue(), jT808_0X0802.MultimediaSearchItems[1].MultimediaType); | |||
Assert.Equal((uint)1, jT808_0X0802.MultimediaSearchItems[1].Position.AlarmFlag); | |||
Assert.Equal((ushort)40, jT808_0X0802.MultimediaSearchItems[1].Position.Altitude); | |||
Assert.Equal(DateTime.Parse("2018-11-16 22:22:22"), jT808_0X0802.MultimediaSearchItems[1].Position.GPSTime); | |||
Assert.Equal(12222222, jT808_0X0802.MultimediaSearchItems[1].Position.Lat); | |||
Assert.Equal(132444444, jT808_0X0802.MultimediaSearchItems[1].Position.Lng); | |||
Assert.Equal((ushort)60, jT808_0X0802.MultimediaSearchItems[1].Position.Speed); | |||
Assert.Equal((ushort)0, jT808_0X0802.MultimediaSearchItems[1].Position.Direction); | |||
Assert.Equal((uint)2, jT808_0X0802.MultimediaSearchItems[1].Position.StatusFlag); | |||
} | |||
[Fact] | |||
public void Test2011_3() | |||
{ | |||
byte[] bytes = "30510002007B01000000010000000200BA7F0E07E4F11C0028003C0000181116202020027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808_0x0802>(bytes); | |||
} | |||
} | |||
} |
@@ -46,5 +46,82 @@ namespace JT808.Protocol.Test.MessageBody | |||
byte[] bytes = "7E8800000900012345678900010000008102010203048E7E".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808Package>(bytes); | |||
} | |||
[Fact] | |||
public void Test2013_1() | |||
{ | |||
JT808Package jT808Package = new JT808Package | |||
{ | |||
Header = new JT808Header | |||
{ | |||
MsgId = (ushort)JT808MsgId.多媒体数据上传应答, | |||
TerminalPhoneNo = "123456789", | |||
}, | |||
Bodies = new JT808_0x8800 | |||
{ | |||
MultimediaId = 129, | |||
RetransmitPackageIds = new byte[] { } | |||
} | |||
}; | |||
string hex = JT808Serializer.Serialize(jT808Package, JT808Version.JTT2013).ToHexString(); | |||
Assert.Equal("7E88000004000123456789000100000081857E", hex); | |||
} | |||
[Fact] | |||
public void Test2013_2() | |||
{ | |||
byte[] bytes = "7E88000004000123456789000100000081857E".ToHexBytes(); | |||
var jt808Package = JT808Serializer.Deserialize<JT808Package>(bytes); | |||
JT808_0x8800 jT808_0X8800 = jt808Package.Bodies as JT808_0x8800; | |||
Assert.Equal((uint)129, jT808_0X8800.MultimediaId); | |||
Assert.Equal(0, jT808_0X8800.RetransmitPackageCount); | |||
Assert.Null(jT808_0X8800.RetransmitPackageIds); | |||
} | |||
[Fact] | |||
public void Test2013_3() | |||
{ | |||
byte[] bytes = "7E88000004000123456789000100000081857E".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808Package>(bytes); | |||
} | |||
[Fact] | |||
public void Test2011_1() | |||
{ | |||
JT808Package jT808Package = new JT808Package | |||
{ | |||
Header = new JT808Header | |||
{ | |||
MsgId = (ushort)JT808MsgId.多媒体数据上传应答, | |||
TerminalPhoneNo = "123456789", | |||
}, | |||
Bodies = new JT808_0x8800 | |||
{ | |||
MultimediaId = 129, | |||
RetransmitPackageIds = new byte[] { } | |||
} | |||
}; | |||
string hex = JT808Serializer.Serialize(jT808Package,JT808Version.JTT2011).ToHexString(); | |||
Assert.Equal("7E8800000500012345678900010000008100847E", hex); | |||
} | |||
[Fact] | |||
public void Test2011_2() | |||
{ | |||
byte[] bytes = "7E8800000500012345678900010000008100847E".ToHexBytes(); | |||
var jt808Package = JT808Serializer.Deserialize<JT808Package>(bytes); | |||
JT808_0x8800 jT808_0X8800 = jt808Package.Bodies as JT808_0x8800; | |||
Assert.Equal((uint)129, jT808_0X8800.MultimediaId); | |||
Assert.Equal(0, jT808_0X8800.RetransmitPackageCount); | |||
Assert.Null(jT808_0X8800.RetransmitPackageIds); | |||
} | |||
[Fact] | |||
public void Test2011_3() | |||
{ | |||
byte[] bytes = "7E8800000500012345678900010000008100847E".ToHexBytes(); | |||
string json = JT808Serializer.Analyze<JT808Package>(bytes); | |||
} | |||
} | |||
} |
@@ -10361,8 +10361,9 @@ | |||
</member> | |||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0702.QualificationCode"> | |||
<summary> | |||
从业资格证编码 | |||
长度 20 位,不足补 0x00。 | |||
从业资格证编码 | |||
2011 长度40 位 ,不足补 '\0'; | |||
2013 长度 20 位,不足补 '\0'。 | |||
</summary> | |||
</member> | |||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0702.LicenseIssuingLength"> | |||
@@ -10382,7 +10383,8 @@ | |||
</member> | |||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0702.DriverIdentityCard"> | |||
<summary> | |||
驾驶员身份证号 长度20 不足补0 | |||
驾驶员身份证号 长度20 不足补 '\0' | |||
2011版本 | |||
2019版本 | |||
</summary> | |||
</member> | |||
@@ -52,8 +52,9 @@ namespace JT808.Protocol.MessageBody | |||
/// </summary> | |||
public string DriverUserName { get; set; } | |||
/// <summary> | |||
/// 从业资格证编码 | |||
/// 长度 20 位,不足补 0x00。 | |||
/// 从业资格证编码 | |||
/// 2011 长度40 位 ,不足补 '\0'; | |||
/// 2013 长度 20 位,不足补 '\0'。 | |||
/// </summary> | |||
public string QualificationCode { get; set; } | |||
/// <summary> | |||
@@ -69,7 +70,8 @@ namespace JT808.Protocol.MessageBody | |||
/// </summary> | |||
public DateTime CertificateExpiresDate { get; set; } | |||
/// <summary> | |||
/// 驾驶员身份证号 长度20 不足补0 | |||
/// 驾驶员身份证号 长度20 不足补 '\0' | |||
/// 2011版本 | |||
/// 2019版本 | |||
/// </summary> | |||
public string DriverIdentityCard { get; set; } | |||
@@ -94,46 +96,81 @@ namespace JT808.Protocol.MessageBody | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x0702 value = new JT808_0x0702(); | |||
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte(); | |||
writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status); | |||
value.IC_Card_PlugDateTime = reader.ReadDateTime6(); | |||
writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss")); | |||
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班) | |||
var firstByte = reader.ReadVirtualByte(); | |||
//因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n | |||
if (firstByte == 0x01) | |||
{ | |||
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte(); | |||
writer.WriteNumber($"[{((byte)value.IC_Card_ReadResult).ReadNumber()}]IC卡读取结果-{value.IC_Card_ReadResult.ToString()}", (byte)value.IC_Card_ReadResult); | |||
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功) | |||
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte(); | |||
writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status); | |||
value.IC_Card_PlugDateTime = reader.ReadDateTime6(); | |||
writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss")); | |||
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班) | |||
{ | |||
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte(); | |||
writer.WriteNumber($"[{((byte)value.IC_Card_ReadResult).ReadNumber()}]IC卡读取结果-{value.IC_Card_ReadResult.ToString()}", (byte)value.IC_Card_ReadResult); | |||
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功) | |||
{ | |||
value.DriverUserNameLength = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength); | |||
var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength); | |||
value.DriverUserName = reader.ReadString(value.DriverUserNameLength); | |||
writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName); | |||
var qualificationCodeBuffer = reader.ReadVirtualArray(20); | |||
value.QualificationCode = reader.ReadString(20); | |||
writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode); | |||
value.LicenseIssuingLength = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength); | |||
var licenseIssuingLengtheBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength); | |||
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength); | |||
writer.WriteString($"[{licenseIssuingLengtheBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing); | |||
value.CertificateExpiresDate = reader.ReadDateTime4(); | |||
writer.WriteString($"[{value.CertificateExpiresDate.ToString("yyMMdd")}]插拔卡时间", value.CertificateExpiresDate.ToString("yyyy-MM-dd")); | |||
if (reader.Version == JT808Version.JTT2019) | |||
{ | |||
var driverIdentityCardBuffer = reader.ReadVirtualArray(20); | |||
value.DriverIdentityCard = reader.ReadString(20); | |||
writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard); | |||
//兼容808-2019 补充 | |||
if (reader.ReadCurrentRemainContentLength() > 0) | |||
{ | |||
value.FaceMatchValue = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.FaceMatchValue.Value.ReadNumber()}]人脸匹配度", value.FaceMatchValue.Value); | |||
var uidBuffer = reader.ReadVirtualArray(20); | |||
value.UID = reader.ReadString(20); | |||
writer.WriteString($"[{uidBuffer.ToArray().ToHexString()}]身份证UID", value.UID); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
if (firstByte == 0x02 && reader.ReadCurrentRemainContentLength() == 7) | |||
{ | |||
//如果字节是0x02且长度只有7,那么该协议就是2013或者2019 | |||
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte(); | |||
writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status); | |||
value.IC_Card_PlugDateTime = reader.ReadDateTime6(); | |||
writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss")); | |||
} | |||
else | |||
{ | |||
value.DriverUserNameLength = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength); | |||
var driverUserNameBuffer= reader.ReadVirtualArray(value.DriverUserNameLength); | |||
var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength); | |||
value.DriverUserName = reader.ReadString(value.DriverUserNameLength); | |||
writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName); | |||
var qualificationCodeBuffer = reader.ReadVirtualArray(20); | |||
value.QualificationCode = reader.ReadString(20); | |||
var driverIdentityCardBuffer = reader.ReadVirtualArray(20); | |||
value.DriverIdentityCard = reader.ReadString(20); | |||
writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard); | |||
var qualificationCodeBuffer = reader.ReadVirtualArray(40); | |||
value.QualificationCode = reader.ReadString(40); | |||
writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode); | |||
value.LicenseIssuingLength = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength); | |||
var licenseIssuingLengtheBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength); | |||
var licenseIssuingBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength); | |||
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength); | |||
writer.WriteString($"[{licenseIssuingLengtheBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing); | |||
value.CertificateExpiresDate = reader.ReadDateTime4(); | |||
writer.WriteString($"[{value.CertificateExpiresDate.ToString("yyMMdd")}]插拔卡时间", value.CertificateExpiresDate.ToString("yyyy-MM-dd")); | |||
if (reader.Version == JT808Version.JTT2019) | |||
{ | |||
var driverIdentityCardBuffer = reader.ReadVirtualArray(20); | |||
value.DriverIdentityCard = reader.ReadString(20); | |||
writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard); | |||
//兼容808-2019 补充 | |||
if (reader.ReadCurrentRemainContentLength() > 0) | |||
{ | |||
value.FaceMatchValue = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.FaceMatchValue.Value.ReadNumber()}]人脸匹配度", value.FaceMatchValue.Value); | |||
var uidBuffer = reader.ReadVirtualArray(20); | |||
value.UID = reader.ReadString(20); | |||
writer.WriteString($"[{uidBuffer.ToArray().ToHexString()}]身份证UID", value.UID); | |||
} | |||
} | |||
writer.WriteString($"[{licenseIssuingBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing); | |||
} | |||
} | |||
} | |||
@@ -146,31 +183,53 @@ namespace JT808.Protocol.MessageBody | |||
public JT808_0x0702 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x0702 value = new JT808_0x0702(); | |||
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte(); | |||
value.IC_Card_PlugDateTime = reader.ReadDateTime6(); | |||
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班) | |||
var firstByte = reader.ReadVirtualByte(); | |||
//因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n | |||
if (firstByte == 0x01) | |||
{ | |||
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte(); | |||
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功) | |||
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte(); | |||
value.IC_Card_PlugDateTime = reader.ReadDateTime6(); | |||
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班) | |||
{ | |||
value.DriverUserNameLength = reader.ReadByte(); | |||
value.DriverUserName = reader.ReadString(value.DriverUserNameLength); | |||
value.QualificationCode = reader.ReadString(20); | |||
value.LicenseIssuingLength = reader.ReadByte(); | |||
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength); | |||
value.CertificateExpiresDate = reader.ReadDateTime4(); | |||
if(reader.Version== JT808Version.JTT2019) | |||
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte(); | |||
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功) | |||
{ | |||
value.DriverIdentityCard = reader.ReadString(20); | |||
//兼容808-2019 补充 | |||
if (reader.ReadCurrentRemainContentLength() > 0) | |||
value.DriverUserNameLength = reader.ReadByte(); | |||
value.DriverUserName = reader.ReadString(value.DriverUserNameLength); | |||
value.QualificationCode = reader.ReadString(20); | |||
value.LicenseIssuingLength = reader.ReadByte(); | |||
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength); | |||
value.CertificateExpiresDate = reader.ReadDateTime4(); | |||
if (reader.Version == JT808Version.JTT2019) | |||
{ | |||
value.FaceMatchValue = reader.ReadByte(); | |||
value.UID = reader.ReadString(20); | |||
value.DriverIdentityCard = reader.ReadString(20); | |||
//兼容808-2019 补充 | |||
if (reader.ReadCurrentRemainContentLength() > 0) | |||
{ | |||
value.FaceMatchValue = reader.ReadByte(); | |||
value.UID = reader.ReadString(20); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
if (firstByte == 0x02 && reader.ReadCurrentRemainContentLength() == 7) | |||
{ | |||
//如果字节是0x02且长度只有7,那么该协议就是2013或者2019 | |||
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte(); | |||
value.IC_Card_PlugDateTime = reader.ReadDateTime6(); | |||
} | |||
else { | |||
value.DriverUserNameLength = reader.ReadByte(); | |||
value.DriverUserName = reader.ReadString(value.DriverUserNameLength); | |||
value.DriverIdentityCard = reader.ReadString(20); | |||
value.QualificationCode = reader.ReadString(40); | |||
value.LicenseIssuingLength = reader.ReadByte(); | |||
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength); | |||
} | |||
} | |||
return value; | |||
} | |||
/// <summary> | |||
@@ -181,30 +240,41 @@ namespace JT808.Protocol.MessageBody | |||
/// <param name="config"></param> | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0702 value, IJT808Config config) | |||
{ | |||
writer.WriteByte((byte)value.IC_Card_Status); | |||
writer.WriteDateTime6(value.IC_Card_PlugDateTime); | |||
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班) | |||
if (writer.Version == JT808Version.JTT2011) | |||
{ | |||
writer.WriteByte((byte)value.IC_Card_ReadResult); | |||
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功) | |||
writer.WriteByte((byte)value.DriverUserName.Length); | |||
writer.WriteString(value.DriverUserName); | |||
writer.WriteString(value.DriverIdentityCard.PadLeft(20,'\0').ValiString(nameof(value.DriverIdentityCard), 20)); | |||
writer.WriteString(value.QualificationCode.PadLeft(40, '\0').ValiString(nameof(value.QualificationCode), 40)); | |||
writer.WriteByte((byte)value.LicenseIssuing.Length); | |||
writer.WriteString(value.LicenseIssuing); | |||
} | |||
else { | |||
writer.WriteByte((byte)value.IC_Card_Status); | |||
writer.WriteDateTime6(value.IC_Card_PlugDateTime); | |||
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班) | |||
{ | |||
writer.WriteByte((byte)value.DriverUserName.Length); | |||
writer.WriteString(value.DriverUserName); | |||
writer.WriteString(value.QualificationCode.PadLeft(20, '\0').ValiString(nameof(value.QualificationCode),20)); | |||
writer.WriteByte((byte)value.LicenseIssuing.Length); | |||
writer.WriteString(value.LicenseIssuing); | |||
writer.WriteDateTime4(value.CertificateExpiresDate); | |||
if (writer.Version == JT808Version.JTT2019) | |||
writer.WriteByte((byte)value.IC_Card_ReadResult); | |||
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功) | |||
{ | |||
writer.WriteString(value.DriverIdentityCard.PadLeft(20,'\0').ValiString(nameof(value.DriverIdentityCard), 20)); | |||
//兼容808-2019 补充 | |||
if (value.FaceMatchValue.HasValue) | |||
{ | |||
writer.WriteByte(value.FaceMatchValue.Value); | |||
} | |||
if (!string.IsNullOrEmpty(value.UID)) | |||
writer.WriteByte((byte)value.DriverUserName.Length); | |||
writer.WriteString(value.DriverUserName); | |||
writer.WriteString(value.QualificationCode.PadLeft(20, '\0').ValiString(nameof(value.QualificationCode), 20)); | |||
writer.WriteByte((byte)value.LicenseIssuing.Length); | |||
writer.WriteString(value.LicenseIssuing); | |||
writer.WriteDateTime4(value.CertificateExpiresDate); | |||
if (writer.Version == JT808Version.JTT2019) | |||
{ | |||
writer.WriteString(value.UID.PadLeft(20, '\0').ValiString(nameof(value.UID), 20)); | |||
writer.WriteString(value.DriverIdentityCard.PadLeft(20, '\0').ValiString(nameof(value.DriverIdentityCard), 20)); | |||
//兼容808-2019 补充 | |||
if (value.FaceMatchValue.HasValue) | |||
{ | |||
writer.WriteByte(value.FaceMatchValue.Value); | |||
} | |||
if (!string.IsNullOrEmpty(value.UID)) | |||
{ | |||
writer.WriteString(value.UID.PadLeft(20, '\0').ValiString(nameof(value.UID), 20)); | |||
} | |||
} | |||
} | |||
} | |||
@@ -45,6 +45,8 @@ namespace JT808.Protocol.MessageBody | |||
/// 通道 ID | |||
/// </summary> | |||
public byte ChannelId { get; set; } | |||
public bool PositionError { get; set; } | |||
/// <summary> | |||
/// 位置信息汇报(0x0200)消息体 | |||
/// 表示拍摄或录制的起始时刻的位置基本信息数据 | |||
@@ -73,12 +75,28 @@ namespace JT808.Protocol.MessageBody | |||
writer.WriteNumber($"[{value.EventItemCoding.ReadNumber()}]事件项编码-{((JT808EventItemCoding)value.EventItemCoding).ToString()}", value.MultimediaCodingFormat); | |||
value.ChannelId = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.ChannelId.ReadNumber()}]通道ID", value.ChannelId); | |||
JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28), reader.Version); | |||
writer.WriteStartObject("位置基本信息"); | |||
config.GetAnalyze<JT808_0x0200>().Analyze(ref positionReader, writer, config); | |||
writer.WriteEndObject(); | |||
value.MultimediaDataPackage = reader.ReadContent().ToArray(); | |||
writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString()); | |||
if (reader.ReadCurrentRemainContentLength() >= 28) | |||
{ | |||
var tempData = reader.ReadVirtualArray(28); | |||
try | |||
{ | |||
JT808MessagePackReader positionReader = new JT808MessagePackReader(tempData, reader.Version); | |||
writer.WriteStartObject("位置基本信息"); | |||
config.GetAnalyze<JT808_0x0200>().Analyze(ref positionReader, writer, config); | |||
writer.WriteEndObject(); | |||
reader.Skip(28); | |||
} | |||
catch | |||
{ | |||
PositionError = true; | |||
} | |||
value.MultimediaDataPackage = reader.ReadContent().ToArray(); | |||
writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString()); | |||
} | |||
else { | |||
value.MultimediaDataPackage = reader.ReadContent().ToArray(); | |||
writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString()); | |||
} | |||
} | |||
/// <summary> | |||
/// | |||
@@ -94,9 +112,24 @@ namespace JT808.Protocol.MessageBody | |||
value.MultimediaCodingFormat = reader.ReadByte(); | |||
value.EventItemCoding = reader.ReadByte(); | |||
value.ChannelId = reader.ReadByte(); | |||
JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28), reader.Version); | |||
value.Position = config.GetMessagePackFormatter<JT808_0x0200>().Deserialize(ref positionReader, config); | |||
value.MultimediaDataPackage = reader.ReadContent().ToArray(); | |||
if (reader.ReadCurrentRemainContentLength() >= 28) | |||
{ | |||
var tempData = reader.ReadVirtualArray(28); | |||
try | |||
{ | |||
JT808MessagePackReader positionReader = new JT808MessagePackReader(tempData, reader.Version); | |||
value.Position = config.GetMessagePackFormatter<JT808_0x0200>().Deserialize(ref positionReader, config); | |||
reader.Skip(28); | |||
} | |||
catch | |||
{ | |||
PositionError = true; | |||
} | |||
value.MultimediaDataPackage = reader.ReadContent().ToArray(); | |||
} | |||
else { | |||
value.MultimediaDataPackage = reader.ReadContent().ToArray(); | |||
} | |||
return value; | |||
} | |||
/// <summary> | |||
@@ -112,7 +145,9 @@ namespace JT808.Protocol.MessageBody | |||
writer.WriteByte(value.MultimediaCodingFormat); | |||
writer.WriteByte(value.EventItemCoding); | |||
writer.WriteByte(value.ChannelId); | |||
config.GetMessagePackFormatter<JT808_0x0200>().Serialize(ref writer, value.Position, config); | |||
if (writer.Version != JT808Version.JTT2011) { | |||
config.GetMessagePackFormatter<JT808_0x0200>().Serialize(ref writer, value.Position, config); | |||
} | |||
writer.WriteArray(value.MultimediaDataPackage); | |||
} | |||
} | |||
@@ -55,8 +55,12 @@ namespace JT808.Protocol.MessageBody | |||
{ | |||
writer.WriteStartObject(); | |||
JT808MultimediaSearchProperty jT808MultimediaSearchProperty = new JT808MultimediaSearchProperty(); | |||
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32(); | |||
writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaId.ReadNumber()}]多媒体ID", jT808MultimediaSearchProperty.MultimediaId); | |||
if (reader.ReadCurrentRemainContentLength() == (value.MultimediaItemCount - i) * (4 + 1 + 1 + 1 + 28)) | |||
{ | |||
//2013 ,2019协议 | |||
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32(); | |||
writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaId.ReadNumber()}]多媒体ID", jT808MultimediaSearchProperty.MultimediaId); | |||
} | |||
jT808MultimediaSearchProperty.MultimediaType = reader.ReadByte(); | |||
writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaType.ReadNumber()}]多媒体类型-{((JT808MultimediaType)jT808MultimediaSearchProperty.MultimediaType).ToString()}", jT808MultimediaSearchProperty.MultimediaType); | |||
jT808MultimediaSearchProperty.ChannelId = reader.ReadByte(); | |||
@@ -86,7 +90,12 @@ namespace JT808.Protocol.MessageBody | |||
for (var i = 0; i < value.MultimediaItemCount; i++) | |||
{ | |||
JT808MultimediaSearchProperty jT808MultimediaSearchProperty = new JT808MultimediaSearchProperty(); | |||
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32(); | |||
if (reader.ReadCurrentRemainContentLength() ==(value.MultimediaItemCount-i)*(4 + 1 + 1 + 1 + 28)) | |||
{ | |||
//2013 ,2019协议 | |||
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32(); | |||
} | |||
jT808MultimediaSearchProperty.MultimediaType = reader.ReadByte(); | |||
jT808MultimediaSearchProperty.ChannelId = reader.ReadByte(); | |||
jT808MultimediaSearchProperty.EventItemCoding = reader.ReadByte(); | |||
@@ -108,7 +117,11 @@ namespace JT808.Protocol.MessageBody | |||
writer.WriteUInt16((ushort)value.MultimediaSearchItems.Count); | |||
foreach (var item in value.MultimediaSearchItems) | |||
{ | |||
writer.WriteUInt32(item.MultimediaId); | |||
if (writer.Version != JT808Version.JTT2011) | |||
{ | |||
writer.WriteUInt32(item.MultimediaId); | |||
} | |||
writer.WriteByte(item.MultimediaType); | |||
writer.WriteByte(item.ChannelId); | |||
writer.WriteByte(item.EventItemCoding); | |||
@@ -44,8 +44,13 @@ namespace JT808.Protocol.MessageBody | |||
{ | |||
JT808_0x8800 jT808_0X8800 = new JT808_0x8800(); | |||
jT808_0X8800.MultimediaId = reader.ReadUInt32(); | |||
jT808_0X8800.RetransmitPackageCount = reader.ReadByte(); | |||
jT808_0X8800.RetransmitPackageIds = reader.ReadArray(jT808_0X8800.RetransmitPackageCount * 2).ToArray(); | |||
if (reader.ReadCurrentRemainContentLength() > 0) | |||
{ | |||
jT808_0X8800.RetransmitPackageCount = reader.ReadByte();//2011协议此处 为0 | |||
if (jT808_0X8800.RetransmitPackageCount > 0) { | |||
jT808_0X8800.RetransmitPackageIds = reader.ReadArray(jT808_0X8800.RetransmitPackageCount * 2).ToArray(); | |||
} | |||
} | |||
return jT808_0X8800; | |||
} | |||
/// <summary> | |||
@@ -57,8 +62,19 @@ namespace JT808.Protocol.MessageBody | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8800 value, IJT808Config config) | |||
{ | |||
writer.WriteUInt32(value.MultimediaId); | |||
writer.WriteByte((byte)(value.RetransmitPackageIds.Length / 2)); | |||
writer.WriteArray(value.RetransmitPackageIds); | |||
if (writer.Version == Enums.JT808Version.JTT2011) | |||
{ | |||
writer.WriteByte((byte)(value.RetransmitPackageIds.Length / 2)); | |||
if (value.RetransmitPackageIds.Length > 0) { | |||
writer.WriteArray(value.RetransmitPackageIds); | |||
} | |||
} | |||
else { | |||
if (value.RetransmitPackageIds.Length > 0) { | |||
writer.WriteByte((byte)(value.RetransmitPackageIds.Length / 2)); | |||
writer.WriteArray(value.RetransmitPackageIds); | |||
} | |||
} | |||
} | |||
/// <summary> | |||
/// | |||
@@ -70,19 +86,22 @@ namespace JT808.Protocol.MessageBody | |||
{ | |||
JT808_0x8800 value = new JT808_0x8800(); | |||
value.MultimediaId = reader.ReadUInt32(); | |||
value.RetransmitPackageCount = reader.ReadByte(); | |||
value.RetransmitPackageIds = reader.ReadArray(value.RetransmitPackageCount * 2).ToArray(); | |||
writer.WriteNumber($"[{ value.MultimediaId.ReadNumber()}]多媒体ID", value.MultimediaId); | |||
writer.WriteNumber($"[{ value.RetransmitPackageCount.ReadNumber()}]重传包总数", value.RetransmitPackageCount); | |||
writer.WriteString($"重传包", value.RetransmitPackageIds.ToHexString()); | |||
writer.WriteStartArray($"重传包ID列表"); | |||
ReadOnlySpan<byte> tmp = value.RetransmitPackageIds; | |||
for(int i=0; i< value.RetransmitPackageCount; i++) | |||
{ | |||
writer.WriteStringValue($"{tmp.Slice(i*2 , 2).ToArray().ToHexString()}"); | |||
if (reader.ReadCurrentRemainContentLength() > 0) { | |||
value.RetransmitPackageCount = reader.ReadByte(); | |||
writer.WriteNumber($"[{ value.RetransmitPackageCount.ReadNumber()}]重传包总数", value.RetransmitPackageCount); | |||
if (value.RetransmitPackageCount > 0) { | |||
writer.WriteString($"重传包", value.RetransmitPackageIds.ToHexString()); | |||
writer.WriteStartArray($"重传包ID列表"); | |||
value.RetransmitPackageIds = reader.ReadArray(value.RetransmitPackageCount * 2).ToArray(); | |||
ReadOnlySpan<byte> tmp = value.RetransmitPackageIds; | |||
for (int i = 0; i < value.RetransmitPackageCount; i++) | |||
{ | |||
writer.WriteStringValue($"{tmp.Slice(i * 2, 2).ToArray().ToHexString()}"); | |||
} | |||
writer.WriteEndArray(); | |||
} | |||
} | |||
writer.WriteEndArray(); | |||
} | |||
} | |||
} |