diff --git a/README.md b/README.md index 3fa766c..cdd8735 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # JT808协议 + [![MIT Licence](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SmallChi/JT808/blob/master/LICENSE)![.NET Core](https://github.com/SmallChi/JT808/workflows/.NET%20Core/badge.svg?branch=master) ## 前提条件 @@ -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 公钥 | diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs index b90b14d..f4cecec 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs @@ -168,5 +168,37 @@ namespace JT808.Protocol.Test.MessageBody byte[] bytes = "0121052818111100056B6F696B65000000000000000071776531323334353661616106717765727478202105280000003132333435363738393031323334353637630000003132333435363738393031323334353637".ToHexBytes(); string json = JT808Serializer.Analyze(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(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(bytes, JT808Version.JTT2011); + } } } diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0801Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0801Test.cs index b1e2667..d1de8ff 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0801Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0801Test.cs @@ -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(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(bytes); + } } } diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0802Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0802Test.cs index 0813048..b4012ef 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0802Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0802Test.cs @@ -106,5 +106,97 @@ namespace JT808.Protocol.Test.MessageBody byte[] bytes = "3051000200000102007B01000000010000000200BA7F0E07E4F11C0028003C000018111620202000000103027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222".ToHexBytes(); string json = JT808Serializer.Analyze(bytes); } + + [Fact] + public void Test2011_1() + { + JT808_0x0802 jT808_0X0802 = new JT808_0x0802 + { + MsgNum = 12369, + MultimediaSearchItems = new List() + }; + + 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(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(bytes); + } } } diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x8800Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x8800Test.cs index 0ddc96a..eb2861c 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x8800Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x8800Test.cs @@ -46,5 +46,82 @@ namespace JT808.Protocol.Test.MessageBody byte[] bytes = "7E8800000900012345678900010000008102010203048E7E".ToHexBytes(); string json = JT808Serializer.Analyze(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(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(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(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(bytes); + } } } diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index 754eb13..5e5e1aa 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -10361,8 +10361,9 @@ - 从业资格证编码 - 长度 20 位,不足补 0x00。 + 从业资格证编码 + 2011 长度40 位 ,不足补 '\0'; + 2013 长度 20 位,不足补 '\0'。 @@ -10382,7 +10383,8 @@ - 驾驶员身份证号 长度20 不足补0 + 驾驶员身份证号 长度20 不足补 '\0' + 2011版本 2019版本 diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0702.cs b/src/JT808.Protocol/MessageBody/JT808_0x0702.cs index a610bc0..b42be1f 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0702.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0702.cs @@ -52,8 +52,9 @@ namespace JT808.Protocol.MessageBody /// public string DriverUserName { get; set; } /// - /// 从业资格证编码 - /// 长度 20 位,不足补 0x00。 + /// 从业资格证编码 + /// 2011 长度40 位 ,不足补 '\0'; + /// 2013 长度 20 位,不足补 '\0'。 /// public string QualificationCode { get; set; } /// @@ -69,7 +70,8 @@ namespace JT808.Protocol.MessageBody /// public DateTime CertificateExpiresDate { get; set; } /// - /// 驾驶员身份证号 长度20 不足补0 + /// 驾驶员身份证号 长度20 不足补 '\0' + /// 2011版本 /// 2019版本 /// 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; } /// @@ -181,30 +240,41 @@ namespace JT808.Protocol.MessageBody /// 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)); + } } } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0801.cs b/src/JT808.Protocol/MessageBody/JT808_0x0801.cs index c5efef0..2965269 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0801.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0801.cs @@ -45,6 +45,8 @@ namespace JT808.Protocol.MessageBody /// 通道 ID /// public byte ChannelId { get; set; } + + public bool PositionError { get; set; } /// /// 位置信息汇报(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().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().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()); + } } /// /// @@ -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().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().Deserialize(ref positionReader, config); + reader.Skip(28); + } + catch + { + PositionError = true; + } + value.MultimediaDataPackage = reader.ReadContent().ToArray(); + } + else { + value.MultimediaDataPackage = reader.ReadContent().ToArray(); + } return value; } /// @@ -112,7 +145,9 @@ namespace JT808.Protocol.MessageBody writer.WriteByte(value.MultimediaCodingFormat); writer.WriteByte(value.EventItemCoding); writer.WriteByte(value.ChannelId); - config.GetMessagePackFormatter().Serialize(ref writer, value.Position, config); + if (writer.Version != JT808Version.JTT2011) { + config.GetMessagePackFormatter().Serialize(ref writer, value.Position, config); + } writer.WriteArray(value.MultimediaDataPackage); } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0802.cs b/src/JT808.Protocol/MessageBody/JT808_0x0802.cs index 24e82ea..7dbc935 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0802.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0802.cs @@ -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); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8800.cs b/src/JT808.Protocol/MessageBody/JT808_0x8800.cs index 8471652..6cc4fc0 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8800.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8800.cs @@ -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; } /// @@ -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); + } + } } /// /// @@ -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 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 tmp = value.RetransmitPackageIds; + for (int i = 0; i < value.RetransmitPackageCount; i++) + { + writer.WriteStringValue($"{tmp.Slice(i * 2, 2).ToArray().ToHexString()}"); + } + writer.WriteEndArray(); + } } - writer.WriteEndArray(); } } }