diff --git a/README.md b/README.md index 039539c..341f3c2 100644 --- a/README.md +++ b/README.md @@ -74,14 +74,14 @@ jT808_0x0200.Lng = 132444444; jT808_0x0200.Speed = 60; jT808_0x0200.Direction = 0; jT808_0x0200.StatusFlag = 2; -jT808_0x0200.JT808LocationAttachData = new Dictionary(); +jT808_0x0200.BasicLocationAttachData = new Dictionary(); -jT808_0x0200.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 +jT808_0x0200.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); -jT808_0x0200.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 +jT808_0x0200.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 125 }); @@ -162,9 +162,9 @@ Assert.Equal(60, jT808_0x0200.Speed); Assert.Equal(0, jT808_0x0200.Direction); Assert.Equal((uint)2, jT808_0x0200.StatusFlag); //4.1.附加信息1 -Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); +Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); //4.2.附加信息2 -Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); +Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); ``` ### 举个栗子2 @@ -181,7 +181,7 @@ JT808Package jT808Package = Enums.JT808MsgId.位置信息汇报.Create("12345678 Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary + BasicLocationAttachData = new Dictionary { { JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}}, { JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}} @@ -293,11 +293,26 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); ### 举个栗子10 -场景: +场景1: 有些设备,不会按照国标的附加信息Id来搞,把附加信息Id搞为两个字节,这样在上报上来的数据就会存在重复的附加Id,导致平台解析出错。 +场景2: +由于粤标的设备厂家自定义的附加信息长度可以为四4个字节的,所以需要兼容。 + +场景3: +有些设备上报会出现两个相同的附加信息Id,那么只能解析一个,另一个只能丢在异常附加信息里面去处理。 + +|附加信息类说明| 附加ID字节数 | 附加长度字节数 | 备注 | +| :--- | :---: | :---: | :---:| +| JT808_0x0200_CustomBodyBase | 1 BYTE | 1 BYTE | 标准| +| JT808_0x0200_CustomBodyBase2 | 2 BYTE | 1 BYTE | 自定义| +| JT808_0x0200_CustomBodyBase3 | 2 BYTE | 2 BYTE | 自定义| +| JT808_0x0200_CustomBodyBase4 | 1 BYTE | 4 BYTE | 自定义| + [可以参考Simples的Demo10](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo10.cs) +>注意:默认都是以**标准**的去解析,要是出现未知的附加,不一定解析就是正确,最好还是需要依照协议文档去开发然后自行注册解析器去解析。 + ### 举个栗子11 场景: @@ -308,39 +323,30 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); ### 举个栗子12 场景: -由于粤标的设备厂家自定义的附加信息长度可以为四4个字节的,所以需要兼容。 +由于粤标的设备把2019版本的0x8105终端控制消息命令参数做了扩展,所以需要兼容。 [可以参考Simples的Demo12](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo12.cs) ->注意:只适用于已知的设备厂家协议才行 - ### 举个栗子13 场景: -由于粤标的设备把2019版本的0x8105终端控制消息命令参数做了扩展,所以需要兼容。 +由于协议库本身可能存在消息解析出错的情况,要么就提PR上来,但是不一定会及时发布,这时候就需要自己把原有的消息解析复制出来,改造好,然后重新注册。 -[可以参考Simples的Demo13](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo13.cs) +[可以参考Simples的Demo14](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo13.cs) ### 举个栗子14 场景: -由于协议库本身可能存在消息解析出错的情况,要么就提PR上来,但是不一定会及时发布,这时候就需要自己把原有的消息解析复制出来,改造好,然后重新注册。 +由于某些厂商不按要求去做,明明使用的2013的协议但是在消息头部的版本标识位置为1,导致程序认为是2019协议。从而解析报错。此时可以强制解析成2013后,然后修正版本标识,重新序列化消息,以供下游服务使用 [可以参考Simples的Demo14](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo14.cs) ### 举个栗子15 -场景: -由于某些厂商不按要求去做,明明使用的2013的协议但是在消息头部的版本标识位置为1,导致程序认为是2019协议。从而解析报错。此时可以强制解析成2013后,然后修正版本标识,重新序列化消息,以供下游服务使用 - -[可以参考Simples的Demo15](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo15.cs) - -### 举个栗子16 - 场景: 兼容2011协议的注册消息 -[可以参考Simples的Demo16](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo16.cs) +[可以参考Simples的Demo15](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo15.cs) ## NuGet安装 diff --git a/src/JT808.Protocol.Benchmark/JT808SerializerContext.cs b/src/JT808.Protocol.Benchmark/JT808SerializerContext.cs index 821fc9b..12c3d85 100644 --- a/src/JT808.Protocol.Benchmark/JT808SerializerContext.cs +++ b/src/JT808.Protocol.Benchmark/JT808SerializerContext.cs @@ -57,57 +57,57 @@ namespace JT808.Protocol.Benchmark jT808UploadLocationRequest.Speed = 60; jT808UploadLocationRequest.Direction = 0; jT808UploadLocationRequest.StatusFlag = 2; - jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary(); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData = new Dictionary(); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 { Speed=56 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 { EventId=1 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 { AreaId=1, JT808PositionType= Enums.JT808PositionType.圆形区域 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 { AreaId = 1, JT808PositionType = Enums.JT808PositionType.圆形区域, Direction= Enums.JT808DirectionType.出 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 { DrivenRoute= Enums.JT808DrivenRouteType.过长, DrivenRouteId=2, Time=34 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 { CarSignalStatus=23 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A { IOStatus=244 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B { Analog = 242 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 { WiFiSignalStrength=0x02 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 { GNSSCount=0x05 }); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808LocationAttach.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808LocationAttach.cs index 9f94c3b..634bf8a 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808LocationAttach.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808LocationAttach.cs @@ -35,25 +35,25 @@ namespace JT808.Protocol.Extensions.JT1078.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(0x14, new JT808_0x0200_0x14 + jT808UploadLocationRequest.BasicLocationAttachData.Add(0x14, new JT808_0x0200_0x14 { VideoRelateAlarm = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(0x15, new JT808_0x0200_0x15 + jT808UploadLocationRequest.BasicLocationAttachData.Add(0x15, new JT808_0x0200_0x15 { VideoSignalLoseAlarmStatus = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(0x16, new JT808_0x0200_0x16 + jT808UploadLocationRequest.BasicLocationAttachData.Add(0x16, new JT808_0x0200_0x16 { VideoSignalOcclusionAlarmStatus = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(0x17, new JT808_0x0200_0x17 + jT808UploadLocationRequest.BasicLocationAttachData.Add(0x17, new JT808_0x0200_0x17 { StorageFaultAlarmStatus = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(0x18, new JT808_0x0200_0x18 + jT808UploadLocationRequest.BasicLocationAttachData.Add(0x18, new JT808_0x0200_0x18 { AbnormalDrivingBehaviorAlarmType = 100, FatigueLevel = 88 @@ -73,12 +73,12 @@ namespace JT808.Protocol.Extensions.JT1078.Test Assert.Equal(132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); - Assert.Equal(100u, ((JT808_0x0200_0x14)jT808UploadLocationRequest.JT808LocationAttachData[0x14]).VideoRelateAlarm); - Assert.Equal(100u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.JT808LocationAttachData[0x15]).VideoSignalLoseAlarmStatus); - Assert.Equal(100u, ((JT808_0x0200_0x16)jT808UploadLocationRequest.JT808LocationAttachData[0x16]).VideoSignalOcclusionAlarmStatus); - Assert.Equal(100u, ((JT808_0x0200_0x17)jT808UploadLocationRequest.JT808LocationAttachData[0x17]).StorageFaultAlarmStatus); - Assert.Equal(100u, ((JT808_0x0200_0x18)jT808UploadLocationRequest.JT808LocationAttachData[0x18]).AbnormalDrivingBehaviorAlarmType); - Assert.Equal(88, ((JT808_0x0200_0x18)jT808UploadLocationRequest.JT808LocationAttachData[0x18]).FatigueLevel); + Assert.Equal(100u, ((JT808_0x0200_0x14)jT808UploadLocationRequest.BasicLocationAttachData[0x14]).VideoRelateAlarm); + Assert.Equal(100u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.BasicLocationAttachData[0x15]).VideoSignalLoseAlarmStatus); + Assert.Equal(100u, ((JT808_0x0200_0x16)jT808UploadLocationRequest.BasicLocationAttachData[0x16]).VideoSignalOcclusionAlarmStatus); + Assert.Equal(100u, ((JT808_0x0200_0x17)jT808UploadLocationRequest.BasicLocationAttachData[0x17]).StorageFaultAlarmStatus); + Assert.Equal(100u, ((JT808_0x0200_0x18)jT808UploadLocationRequest.BasicLocationAttachData[0x18]).AbnormalDrivingBehaviorAlarmType); + Assert.Equal(88, ((JT808_0x0200_0x18)jT808UploadLocationRequest.BasicLocationAttachData[0x18]).FatigueLevel); } [Fact] diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808_0x0200Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808_0x0200Test.cs index 0158215..85513ea 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808_0x0200Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808_0x0200Test.cs @@ -36,9 +36,9 @@ namespace JT808.Protocol.Extensions.JT1078.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_JT1078_Constants.JT808_0X0200_0x14, new JT808_0x0200_0x14 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_JT1078_Constants.JT808_0X0200_0x14, new JT808_0x0200_0x14 { VideoRelateAlarm = (uint)(VideoRelateAlarmType.视频信号遮挡报警 | VideoRelateAlarmType.其他视频设备故障报警) }); @@ -57,7 +57,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test Assert.Equal(132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); - Assert.Equal((uint)(VideoRelateAlarmType.视频信号遮挡报警 | VideoRelateAlarmType.其他视频设备故障报警), ((JT808_0x0200_0x14)jT808UploadLocationRequest.JT808LocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x14]).VideoRelateAlarm); + Assert.Equal((uint)(VideoRelateAlarmType.视频信号遮挡报警 | VideoRelateAlarmType.其他视频设备故障报警), ((JT808_0x0200_0x14)jT808UploadLocationRequest.BasicLocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x14]).VideoRelateAlarm); } [Fact] @@ -80,9 +80,9 @@ namespace JT808.Protocol.Extensions.JT1078.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_JT1078_Constants.JT808_0X0200_0x15, new JT808_0x0200_0x15 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_JT1078_Constants.JT808_0X0200_0x15, new JT808_0x0200_0x15 { VideoSignalLoseAlarmStatus=3 }); @@ -101,7 +101,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test Assert.Equal(132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); - Assert.Equal(3u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.JT808LocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x15]).VideoSignalLoseAlarmStatus); + Assert.Equal(3u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.BasicLocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x15]).VideoSignalLoseAlarmStatus); } [Fact] diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x64_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x64_Test.cs index f32a712..d0d81c1 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x64_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x64_Test.cs @@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x64, new JT808_0x0200_0x64 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x64, new JT808_0x0200_0x64 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -66,7 +66,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C00001807151010106420000000010C0605120A0B100F1100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x64, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x64, out var value); JT808_0x0200_0x64 jT808_0X0200_0X64 = value as JT808_0x0200_0x64; Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x65_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x65_Test.cs index d395ab0..21ff0b3 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x65_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x65_Test.cs @@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x65, new JT808_0x0200_0x65 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x65, new JT808_0x0200_0x65 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -63,7 +63,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C00001807151010106520000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x65, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x65, out var value); JT808_0x0200_0x65 jT808_0X0200_0X65 = value as JT808_0x0200_0x65; Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x66_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x66_Test.cs index 3168be4..56fbb5a 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x66_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x66_Test.cs @@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x66, new JT808_0x0200_0x66 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x66, new JT808_0x0200_0x66 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -77,7 +77,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C0000180715101010663B000000010C1100070000000D0000000E191211183100001334343434343434191210183100030200020400010003000500020900060008000A0007".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x66, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x66, out var value); JT808_0x0200_0x66 jT808_0X0200_0X66 = value as JT808_0x0200_0x66; Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x67_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x67_Test.cs index 081b1f0..2ba1912 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x67_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x67_Test.cs @@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x67, new JT808_0x0200_0x67 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_SuBiao_Constants.JT808_0X0200_0x67, new JT808_0x0200_0x67 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -61,7 +61,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C0000180715101010672A000000010C09081100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x67, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_SuBiao_Constants.JT808_0X0200_0x67, out var value); JT808_0x0200_0x67 jT808_0X0200_0X67 = value as JT808_0x0200_0x67; Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x64_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x64_Test.cs index c1105f3..f79de26 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x64_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x64_Test.cs @@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x64, new JT808_0x0200_0x64 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x64, new JT808_0x0200_0x64 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -67,7 +67,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C00001807151010106447000000010C0605120A0B100F1100070000000D0000000E191211183100001334343434343434000000000000000000000000000000000000000000000019121018310003020506".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x64, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x64, out var value); JT808_0x0200_0x64 jT808_0X0200_0X64 = value as JT808_0x0200_0x64; Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x65_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x65_Test.cs index f3a6e13..ae98bb6 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x65_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x65_Test.cs @@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x65, new JT808_0x0200_0x65 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x65, new JT808_0x0200_0x65 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -64,7 +64,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C00001807151010106547000000010C060512010203041100070000000D0000000E191211183100001334343434343434000000000000000000000000000000000000000000000019121018310003020506".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x65, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x65, out var value); JT808_0x0200_0x65 jT808_0X0200_0X65 = value as JT808_0x0200_0x65; Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x66_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x66_Test.cs index c452f25..3460b25 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x66_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x66_Test.cs @@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x66, new JT808_0x0200_0x66 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x66, new JT808_0x0200_0x66 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -78,7 +78,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C00001807151010106655000000010C1100070000000D0000000E1912111831000013343434343434340000000000000000000000000000000000000000000000191210183100030205060200040001000300050002000900060008000A0007".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x66, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x66, out var value); JT808_0x0200_0x66 jT808_0X0200_0X66 = value as JT808_0x0200_0x66; Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x67_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x67_Test.cs index e63c47d..b9b7049 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x67_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x67_Test.cs @@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x67, new JT808_0x0200_0x67 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808_YueBiao_Constants.JT808_0X0200_0x67, new JT808_0x0200_0x67 { AlarmId = 1, AlarmIdentification = new Metadata.AlarmIdentificationProperty @@ -61,7 +61,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test public void Deserialize() { var jT808UploadLocationRequest = JT808Serializer.Deserialize("000000010000000200BA7F0E07E4F11C0028003C00001807151010106741000000010C091100070000000D0000000E191211183100001334343434343434000000000000000000000000000000000000000000000019121018310003020506".ToHexBytes()); - jT808UploadLocationRequest.JT808LocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x67, out var value); + jT808UploadLocationRequest.BasicLocationAttachData.TryGetValue(JT808_YueBiao_Constants.JT808_0X0200_0x67, out var value); JT808_0x0200_0x67 jT808_0X0200_0X67 = value as JT808_0x0200_0x67; Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); diff --git a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj index d75f2c9..a16b623 100644 --- a/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj +++ b/src/JT808.Protocol.Test/JT808.Protocol.Test.csproj @@ -33,7 +33,6 @@ - diff --git a/src/JT808.Protocol.Test/MessageBody/JT808LocationAttachExtensions/JT808LocationAttachImpl0x62.cs b/src/JT808.Protocol.Test/MessageBody/JT808LocationAttachExtensions/JT808LocationAttachImpl0x62.cs deleted file mode 100644 index 93367ea..0000000 --- a/src/JT808.Protocol.Test/MessageBody/JT808LocationAttachExtensions/JT808LocationAttachImpl0x62.cs +++ /dev/null @@ -1,34 +0,0 @@ -using JT808.Protocol.Formatters; -using JT808.Protocol.MessageBody; -using JT808.Protocol.MessagePack; - -namespace JT808.Protocol.Test.JT808LocationAttach -{ - /// - /// 自定义附加信息 - /// data-byte[]-256 - /// - public class JT808LocationAttachImpl0x62 : JT808_0x0200_CustomBodyBase, IJT808MessagePackFormatter - { - public override byte AttachInfoId { get; set; } = 0x62; - public override uint AttachInfoLengthExtend { get; set; } = 256; - public override byte AttachInfoLength { get; set; } - public byte[] Data { get; set; } - - public JT808LocationAttachImpl0x62 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) - { - JT808LocationAttachImpl0x62 jT808LocationAttachImpl0x62 = new JT808LocationAttachImpl0x62(); - jT808LocationAttachImpl0x62.AttachInfoId = reader.ReadByte(); - jT808LocationAttachImpl0x62.AttachInfoLengthExtend = reader.ReadUInt32(); - jT808LocationAttachImpl0x62.Data = reader.ReadArray((int)jT808LocationAttachImpl0x62.AttachInfoLengthExtend).ToArray(); - return jT808LocationAttachImpl0x62; - } - - public void Serialize(ref JT808MessagePackWriter writer, JT808LocationAttachImpl0x62 value, IJT808Config config) - { - writer.WriteByte(value.AttachInfoId); - writer.WriteUInt32((uint)value.Data.Length); - writer.WriteArray(value.Data); - } - } -} diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs index 056c049..5700aa2 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs @@ -43,13 +43,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); @@ -83,13 +83,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); @@ -139,8 +139,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } [Fact] @@ -181,18 +181,18 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary(), - JT808CustomLocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary(), + CustomLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); - jT808UploadLocationRequest.JT808CustomLocationAttachData.Add(0x61, new JT808LocationAttachImpl0x61 + jT808UploadLocationRequest.CustomLocationAttachData.Add(0x61, new JT808LocationAttachImpl0x61 { Age = 18, Gender = 1, @@ -214,9 +214,9 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); - var jT808LocationAttachImpl0x61 = (JT808LocationAttachImpl0x61)jT808UploadLocationRequest.JT808CustomLocationAttachData[0x61]; + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + var jT808LocationAttachImpl0x61 = (JT808LocationAttachImpl0x61)jT808UploadLocationRequest.CustomLocationAttachData[0x61]; Assert.Equal(18, jT808LocationAttachImpl0x61.Age); Assert.Equal(1, jT808LocationAttachImpl0x61.Gender); Assert.Equal("smallchi", jT808LocationAttachImpl0x61.UserName); @@ -243,13 +243,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); @@ -306,8 +306,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } [Fact] public void Test5_3() @@ -337,13 +337,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 1002222, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); @@ -372,7 +372,7 @@ namespace JT808.Protocol.Test.MessageBody // "[0B290B29]模拟量": 187239209 // }, // { - // "[30]附加信息Id": 48, + // "[30]附加信息Id": 48, // "[01]附加信息长度": 1, // "[17]无线通信网络信号强度": 23 // }, @@ -389,15 +389,15 @@ namespace JT808.Protocol.Test.MessageBody // { // "[00]未知附加信息Id": 0, 坑爹,相同的 // "[0C]未知附加信息长度": 12, - // "未知附加信息": "000C00B289860620150013559848" + // "未知附加信息": "000C00B222222222222222222222" // }, // { // "[EB]未知附加信息Id": 235, // "[0E]未知附加信息长度": 14, - // "未知附加信息": "EB0E000C00B289860620150013559848" + // "未知附加信息": "EB0E000C00B222222222222222222222" // } //] - byte[] bodys = "7E020000520111111111100002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B289860620150013559848EB0E000C00B2898606201500135598486C7E".ToHexBytes(); + byte[] bodys = "7E020000520111111111100002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B222222222222222222222EB0E000C00B2222222222222222222226C7E".ToHexBytes(); var package = JT808Serializer1.Deserialize(bodys); JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)package.Bodies; Assert.Single(jT808UploadLocationRequest.ExceptionLocationAttachOriginalData); @@ -422,57 +422,57 @@ namespace JT808.Protocol.Test.MessageBody jT808UploadLocationRequest.Speed = 60; jT808UploadLocationRequest.Direction = 0; jT808UploadLocationRequest.StatusFlag = 2; - jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary(); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData = new Dictionary(); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 { Speed = 56 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 { EventId = 1 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 { AreaId = 1, JT808PositionType = Enums.JT808PositionType.圆形区域 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 { AreaId = 1, JT808PositionType = Enums.JT808PositionType.圆形区域, Direction = Enums.JT808DirectionType.出 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 { DrivenRoute = Enums.JT808DrivenRouteType.过长, DrivenRouteId = 2, Time = 34 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 { CarSignalStatus = 23 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A { IOStatus = 244 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B { Analog = 242 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 { WiFiSignalStrength = 0x02 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 { GNSSCount = 0x05 }); @@ -553,8 +553,8 @@ namespace JT808.Protocol.Test.MessageBody jT808UploadLocationRequest.Speed = 60; jT808UploadLocationRequest.Direction = 0; jT808UploadLocationRequest.StatusFlag = 2; - jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary(); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x07, new JT808_0x0200_0x07 + jT808UploadLocationRequest.BasicLocationAttachData = new Dictionary(); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x07, new JT808_0x0200_0x07 { BeiDou=new List() { @@ -638,7 +638,7 @@ namespace JT808.Protocol.Test.MessageBody { byte[] bytes = "000000010000000200BA7F0E07E4F11C0028003C0000210528181010072C0401030002020400050305000604050006030204000503050006040500060203050006040500060104050006".ToHexBytes(); var jT808_0X0200 = JT808Serializer.Deserialize(bytes); - var jT808_0x0200_0x07=(JT808_0x0200_0x07)jT808_0X0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x07]; + var jT808_0x0200_0x07=(JT808_0x0200_0x07)jT808_0X0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x07]; Assert.Equal((byte)(4 + (4 * 4 + 4 * 3 + 4 * 2 + 4)), jT808_0x0200_0x07.AttachInfoLength); Assert.Equal(4, jT808_0x0200_0x07.BeiDou.Count); Assert.Equal(3, jT808_0x0200_0x07.GPS.Count); @@ -646,6 +646,112 @@ namespace JT808.Protocol.Test.MessageBody Assert.Single(jT808_0x0200_0x07.Galileo); } + [Fact] + public void Test_Device_AttachInfo1_1() + { + var bytes = "7E0200003F011111111111047D0100000000000C00C30161A2AA06BE84A000070000008C21082422494401040056AF7302020000030200002504000000002B040000000030011B310110FB0200657E".ToHexBytes(); + JT808Package package = JT808Serializer1.Deserialize(bytes); + } + [Fact] + public void Test_Device_AttachInfo1_2() + { + var bytes = "7E0200003F011111111111047D0100000000000C00C30161A2AA06BE84A000070000008C21082422494401040056AF7302020000030200002504000000002B040000000030011B310110FB0200657E".ToHexBytes(); + string json = JT808Serializer1.Analyze(bytes); + } + [Fact] + public void Test_Device_AttachInfo2_1() + { + var bytes = "7E020000850222222222220BAF00000000008C0003016892D6067D0154E0004801B2006321082422494701040007FD62030201AC050100060300000007030000002504000000022B04000000F0300118310111E0013DE10800000000000AA9D8E20400000000E30401B218F8E40400000000E50C001C5158001C5158001C5158EA0400001888EB0402000000EE0101F6041298A37E".ToHexBytes(); + JT808Package package = JT808Serializer1.Deserialize(bytes); + } + [Fact] + public void Test_Device_AttachInfo2_2() + { + var bytes = "7E020000850222222222220BAF00000000008C0003016892D6067D0154E0004801B2006321082422494701040007FD62030201AC050100060300000007030000002504000000022B04000000F0300118310111E0013DE10800000000000AA9D8E20400000000E30401B218F8E40400000000E50C001C5158001C5158001C5158EA0400001888EB0402000000EE0101F6041298A37E".ToHexBytes(); + string json = JT808Serializer1.Analyze(bytes); + } + [Fact] + public void Test_Device_AttachInfo3_1() + { + var bytes = "7E02000046033333333333061300000000000C0003020FC9E4069B20FC016402F7010421082422495401040005E44203020302060300000007030000002504000000022A0200002B040000000030011C310121D27E".ToHexBytes(); + JT808Package package = JT808Serializer1.Deserialize(bytes); + } + [Fact] + public void Test_Device_AttachInfo3_2() + { + //7E02000046033333333333061300000000000C0003020FC9E4069B20FC016402F70104210824224954 + //01 + // 04 + // 00 05 E4 42 + //03 + // 02 + // 03 02 + //06 + // 03 + // 00 00 00 + //07 + // 03 + // 00 00 00 + //25 + // 04 + // 00 00 00 02 + //2A + // 02 + // 00 00 + //2B + // 04 + // 00 00 00 00 + //30 + // 01 + // 1C + //31 + // 01 + // 21 + //D2 + //7E + var bytes = "7E02000046033333333333061300000000000C0003020FC9E4069B20FC016402F7010421082422495401040005E44203020302060300000007030000002504000000022A0200002B040000000030011C310121D27E".ToHexBytes(); + string json = JT808Serializer1.Analyze(bytes); + } + [Fact] + public void Test_Device_AttachInfo4_1() + { + var bytes = "7E020000810111111111110EB900000800000C0003027D011F0C07591E4F0033032100A521081016572114040000000001040033DA8B030203212504000000002A02000030011F310117710402170C0BEA04020CD303EF04000080007131000000080002020000010000304B475130534C210810165721000500050309000002057100000071000000710100007102AF7E".ToHexBytes(); + JT808Package package = JT808Serializer1.Deserialize(bytes); + } + [Fact] + public void Test_Device_AttachInfo4_2() + { + var bytes = "7E020000810111111111110EB900000800000C0003027D011F0C07591E4F0033032100A521081016572114040000000001040033DA8B030203212504000000002A02000030011F310117710402170C0BEA04020CD303EF04000080007131000000080002020000010000304B475130534C210810165721000500050309000002057100000071000000710100007102AF7E".ToHexBytes(); + string json = JT808Serializer1.Analyze(bytes); + } + [Fact] + public void Test_Device_AttachInfo5_1() + { + var bytes = "7E020000520111111111110002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B222222222222222222222EB0E000C00B2222222222222222222226C7E".ToHexBytes(); + var package= JT808Serializer1.Deserialize(bytes); + } + [Fact] + public void Test_Device_AttachInfo5_2() + { + //7E + //020000520111111111110002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B + //00 + // 04 + // 00 CE 0B 29 + //00 + // 0C + // 00 B2 + // 22222222222222222222 + //EB + // 0E + // 00 0C + // 00 B2 + // 22222222222222222222 + //6C + //7E + var bytes = "7E020000520111111111110002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B222222222222222222222EB0E000C00B2222222222222222222226C7E".ToHexBytes(); + string json = JT808Serializer1.Analyze(bytes); + } [Fact] public void LatLngTest1_1() { @@ -658,7 +764,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = -132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 0x18000000; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -688,7 +794,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = -132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 0x18000000 | 0x302; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -718,7 +824,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = 132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 0x10000000; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -749,7 +855,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = 132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 1111; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -768,7 +874,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = 132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 0x10000000 | 0x000300; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -798,7 +904,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = -132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 0x8000000; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -829,7 +935,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = -132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 1111; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -848,7 +954,7 @@ namespace JT808.Protocol.Test.MessageBody Lng = -132444444, Speed = 60, Direction = 0, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; jT808UploadLocationRequest.StatusFlag = 0x8000000|0x6601; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0201Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0201Test.cs index d1d5f4a..911c5ab 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0201Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0201Test.cs @@ -35,13 +35,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); @@ -65,8 +65,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(132444444, jT808_0X0201.Position.Lng); Assert.Equal(60, jT808_0X0201.Position.Speed); Assert.Equal((uint)2, jT808_0X0201.Position.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0X0201.Position.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)jT808_0X0201.Position.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0X0201.Position.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808_0X0201.Position.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } [Fact] diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0500Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0500Test.cs index f7c8e62..6cae7d1 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0500Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0500Test.cs @@ -32,13 +32,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - JT808_0x0200_1.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + JT808_0x0200_1.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - JT808_0x0200_1.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + JT808_0x0200_1.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); @@ -67,8 +67,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(0, JT808Bodies.JT808_0x0200.Direction); Assert.Equal(60, JT808Bodies.JT808_0x0200.Speed); Assert.Equal((uint)2, JT808Bodies.JT808_0x0200.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.JT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.JT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.JT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.JT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } [Fact] diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0704Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0704Test.cs index 4fb1fec..02ca559 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0704Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0704Test.cs @@ -43,13 +43,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - JT808_0x0200_1.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + JT808_0x0200_1.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - JT808_0x0200_1.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + JT808_0x0200_1.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); @@ -67,13 +67,13 @@ namespace JT808.Protocol.Test.MessageBody Speed = 54, Direction = 120, StatusFlag = 1, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - JT808_0x0200_2.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + JT808_0x0200_2.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 96 }); - JT808_0x0200_2.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + JT808_0x0200_2.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 66 }); @@ -143,8 +143,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(0, JT808Bodies.Positions[0].Direction); Assert.Equal(60, JT808Bodies.Positions[0].Speed); Assert.Equal((uint)2, JT808Bodies.Positions[0].StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.Positions[0].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.Positions[0].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.Positions[0].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.Positions[0].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); Assert.Equal((uint)2, JT808Bodies.Positions[1].AlarmFlag); Assert.Equal(DateTime.Parse("2018-07-15 10:10:30"), JT808Bodies.Positions[1].GPSTime); @@ -153,8 +153,8 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(54, JT808Bodies.Positions[1].Speed); Assert.Equal(120, JT808Bodies.Positions[1].Direction); Assert.Equal((uint)1, JT808Bodies.Positions[1].StatusFlag); - Assert.Equal(96, ((JT808_0x0200_0x01)JT808Bodies.Positions[1].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(66, ((JT808_0x0200_0x02)JT808Bodies.Positions[1].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(96, ((JT808_0x0200_0x01)JT808Bodies.Positions[1].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(66, ((JT808_0x0200_0x02)JT808Bodies.Positions[1].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } [Fact] diff --git a/src/JT808.Protocol.Test/Simples/Demo1.cs b/src/JT808.Protocol.Test/Simples/Demo1.cs index e7bbaae..58add8d 100644 --- a/src/JT808.Protocol.Test/Simples/Demo1.cs +++ b/src/JT808.Protocol.Test/Simples/Demo1.cs @@ -41,15 +41,15 @@ namespace JT808.Protocol.Test.Simples Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808_0x0200.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808_0x0200.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808_0x0200.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808_0x0200.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 125 }); diff --git a/src/JT808.Protocol.Test/Simples/Demo10.cs b/src/JT808.Protocol.Test/Simples/Demo10.cs index 79c6ca8..eeb8ffb 100644 --- a/src/JT808.Protocol.Test/Simples/Demo10.cs +++ b/src/JT808.Protocol.Test/Simples/Demo10.cs @@ -12,113 +12,622 @@ using JT808.Protocol.Formatters; using JT808.Protocol.MessagePack; using System.Text.Json; using JT808.Protocol.MessageBody.CarDVR; +using JT808.Protocol.Test.JT808LocationAttach; namespace JT808.Protocol.Test.Simples { + /// + /// 主要测试 + /// 1:1 正常自定义附加 + /// 2:1 非正常自定义附加 + /// 2:2 非正常自定义附加 + /// 1:4 粤标自定义附加 + /// 感谢大兄弟提供的真实设备数据 + /// public class Demo10 { JT808Serializer JT808Serializer; + public class Demo10ConfigBase : GlobalConfigBase + { + public override string ConfigId { get; protected set; } = "demo10Config"; + } + public Demo10() { - IJT808Config jT808Config = new DefaultGlobalConfig(); - jT808Config.JT808_0X0200_Custom_Factory.SetMap(); + IJT808Config jT808Config = new Demo10ConfigBase(); + jT808Config.JT808_0X0200_Custom_Factory.SetMap(); + jT808Config.JT808_0X0200_Custom_Factory.SetMap2(); + jT808Config.JT808_0X0200_Custom_Factory.SetMap3(); + jT808Config.JT808_0X0200_Custom_Factory.SetMap4(); JT808Serializer = new JT808Serializer(jT808Config); } [Fact] - public void Test1() + public void Test1_1_1() + { + JT808Package jT808Package = new JT808Package(); + jT808Package.Header = new JT808Header + { + MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), + ManualMsgNum = 1, + TerminalPhoneNo = "1122334455", + }; + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2021-08-30 18:17:10"), + Lat = 12222222, + Lng = 132444444, + Speed = 60, + Direction = 0, + StatusFlag = 2, + BasicLocationAttachData = new Dictionary(), + CustomLocationAttachData = new Dictionary() + }; + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + { + Mileage = 100 + }); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + { + Oil = 55 + }); + jT808UploadLocationRequest.CustomLocationAttachData.Add(0xDF, new JT808LocationAttachImpl0xDF + { + TestValue = new byte[66] + }); + jT808Package.Bodies = jT808UploadLocationRequest; + var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); + Assert.Equal("7E0200006A0011223344550001000000010000000200BA7F0E07E4F11C0028003C000021083018171001040000006402020037DF42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000677E", hex); + } + + [Fact] + public void Test2_1_1() + { + byte[] bytes = "7E0200006A0011223344550001000000010000000200BA7F0E07E4F11C0028003C000021083018171001040000006402020037DF42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000677E".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); + Assert.Equal(1u, jT808Package.Header.MsgNum); + Assert.Equal("1122334455", jT808Package.Header.TerminalPhoneNo); + JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)jT808Package.Bodies; + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal(40u, jT808UploadLocationRequest.Altitude); + Assert.Equal(DateTime.Parse("2021-08-30 18:17:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); + Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + var jT808LocationAttachImpl0XDF = (JT808LocationAttachImpl0xDF)jT808UploadLocationRequest.CustomLocationAttachData[0xDF]; + Assert.Equal(0xDF, jT808LocationAttachImpl0XDF.AttachInfoId); + Assert.Equal(new byte[66], jT808LocationAttachImpl0XDF.TestValue); + Assert.Equal(66u, jT808LocationAttachImpl0XDF.AttachInfoLength); + } + + [Fact] + public void Test1_2_2() + { + JT808Package jT808Package = new JT808Package(); + jT808Package.Header = new JT808Header + { + MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), + ManualMsgNum = 1, + TerminalPhoneNo = "1122334455", + }; + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2021-08-30 18:17:10"), + Lat = 12222222, + Lng = 132444444, + Speed = 60, + Direction = 0, + StatusFlag = 2, + BasicLocationAttachData = new Dictionary(), + CustomLocationAttachData3 = new Dictionary() + }; + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + { + Mileage = 100 + }); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + { + Oil = 55 + }); + jT808UploadLocationRequest.CustomLocationAttachData3.Add(0xDD, new JT808LocationAttachImpl0xDD + { + TestValue=new byte[66] + }); + jT808Package.Bodies = jT808UploadLocationRequest; + var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); + Assert.Equal("7E0200006C0011223344550001000000010000000200BA7F0E07E4F11C0028003C00002108301817100104000000640202003700DD0042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637E", hex); + } + + [Fact] + public void Test2_2_2() + { + byte[] bytes = "7E0200006C0011223344550001000000010000000200BA7F0E07E4F11C0028003C00002108301817100104000000640202003700DD0042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637E".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); + Assert.Equal(1u, jT808Package.Header.MsgNum); + Assert.Equal("1122334455", jT808Package.Header.TerminalPhoneNo); + JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)jT808Package.Bodies; + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal(40u, jT808UploadLocationRequest.Altitude); + Assert.Equal(DateTime.Parse("2021-08-30 18:17:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); + Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + var jT808LocationAttachImpl0XDD = (JT808LocationAttachImpl0xDD)jT808UploadLocationRequest.CustomLocationAttachData3[0xDD]; + Assert.Equal(0xDD, jT808LocationAttachImpl0XDD.AttachInfoId); + Assert.Equal(new byte[66], jT808LocationAttachImpl0XDD.TestValue); + Assert.Equal(66u, jT808LocationAttachImpl0XDD.AttachInfoLength); + } + + [Fact] + public void Test1_2_1() + { + JT808Package jT808Package = new JT808Package(); + jT808Package.Header = new JT808Header + { + MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), + ManualMsgNum = 1, + TerminalPhoneNo = "1122334455", + }; + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2021-08-30 18:17:10"), + Lat = 12222222, + Lng = 132444444, + Speed = 60, + Direction = 0, + StatusFlag = 2, + BasicLocationAttachData = new Dictionary(), + CustomLocationAttachData2 = new Dictionary() + }; + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + { + Mileage = 100 + }); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + { + Oil = 55 + }); + jT808UploadLocationRequest.CustomLocationAttachData2.Add(0xDE, new JT808LocationAttachImpl0xDE + { + TestValue = new byte[66] + }); + jT808Package.Bodies = jT808UploadLocationRequest; + var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); + Assert.Equal("7E0200006B0011223344550001000000010000000200BA7F0E07E4F11C0028003C00002108301817100104000000640202003700DE42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000677E", hex); + } + + [Fact] + public void Test2_2_1() + { + byte[] bytes = "7E0200006B0011223344550001000000010000000200BA7F0E07E4F11C0028003C00002108301817100104000000640202003700DE42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000677E".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); + Assert.Equal(1u, jT808Package.Header.MsgNum); + Assert.Equal("1122334455", jT808Package.Header.TerminalPhoneNo); + JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)jT808Package.Bodies; + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal(40u, jT808UploadLocationRequest.Altitude); + Assert.Equal(DateTime.Parse("2021-08-30 18:17:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); + Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + var jT808LocationAttachImpl0XDE = (JT808LocationAttachImpl0xDE)jT808UploadLocationRequest.CustomLocationAttachData2[0xDE]; + Assert.Equal(0xDE, jT808LocationAttachImpl0XDE.AttachInfoId); + Assert.Equal(new byte[66], jT808LocationAttachImpl0XDE.TestValue); + Assert.Equal(66u, jT808LocationAttachImpl0XDE.AttachInfoLength); + } + + [Fact] + public void Test1_1_4() + { + JT808Package jT808Package = new JT808Package(); + jT808Package.Header = new JT808Header + { + MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), + ManualMsgNum = 1, + TerminalPhoneNo = "1122334455", + }; + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2021-05-31 18:17:10"), + Lat = 12222222, + Lng = 132444444, + Speed = 60, + Direction = 0, + StatusFlag = 2, + BasicLocationAttachData = new Dictionary(), + CustomLocationAttachData4 = new Dictionary() + }; + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + { + Mileage = 100 + }); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + { + Oil = 55 + }); + jT808UploadLocationRequest.CustomLocationAttachData4.Add(0x62, new JT808LocationAttachImpl0x62 + { + Data = new byte[256] + }); + jT808Package.Bodies = jT808UploadLocationRequest; + var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); + Assert.Equal("7E0200012B0011223344550001000000010000000200BA7F0E07E4F11C0028003C000021053118171001040000006402020037620000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D57E", hex); + } + + [Fact] + public void Test2_1_4() + { + byte[] bytes = "7E0200012B0011223344550001000000010000000200BA7F0E07E4F11C0028003C000021053118171001040000006402020037620000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D57E".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); + Assert.Equal(1u, jT808Package.Header.MsgNum); + Assert.Equal("1122334455", jT808Package.Header.TerminalPhoneNo); + JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)jT808Package.Bodies; + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal(40u, jT808UploadLocationRequest.Altitude); + Assert.Equal(DateTime.Parse("2021-05-31 18:17:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); + Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + var jT808LocationAttachImpl0X62 = (JT808LocationAttachImpl0x62)jT808UploadLocationRequest.CustomLocationAttachData4[0x62]; + Assert.Equal(0x62, jT808LocationAttachImpl0X62.AttachInfoId); + Assert.Equal(new byte[256], jT808LocationAttachImpl0X62.Data); + Assert.Equal(256u, jT808LocationAttachImpl0X62.AttachInfoLength); + } + + [Fact] + public void Test_Mix_1() { + JT808Package jT808Package = new JT808Package(); + jT808Package.Header = new JT808Header + { + MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), + ManualMsgNum = 1, + TerminalPhoneNo = "1122334455", + }; JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 { AlarmFlag = 1, Altitude = 40, - GPSTime = DateTime.Parse("2021-04-03 11:10:10"), + GPSTime = DateTime.Parse("2021-08-30 18:17:10"), Lat = 12222222, Lng = 132444444, Speed = 60, Direction = 0, StatusFlag = 2, - JT808CustomLocationAttachData = new Dictionary(), - ExceptionLocationAttachData = new List() + BasicLocationAttachData = new Dictionary(), + CustomLocationAttachData = new Dictionary(), + CustomLocationAttachData2 = new Dictionary(), + CustomLocationAttachData3 = new Dictionary(), + CustomLocationAttachData4 = new Dictionary(), + UnknownLocationAttachData = new Dictionary(), + ExceptionLocationAttachOriginalData = new List() }; - jT808UploadLocationRequest.JT808CustomLocationAttachData.Add(0x00, new JT808LocationAttachImpl0x00 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + { + Mileage = 100 + }); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { - TestValue=new byte[] {0,1,2,3} + Oil = 55 }); - jT808UploadLocationRequest.ExceptionLocationAttachData.Add(new JT808LocationAttachImpl0x00 + jT808UploadLocationRequest.CustomLocationAttachData.Add(0xDF, new JT808LocationAttachImpl0xDF { - TestId= "012345678912" + TestValue = new byte[66] }); - var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); - Assert.Equal("000000010000000200BA7F0E07E4F11C0028003C0000210403111010000400010203000C303132333435363738393132", hex); + jT808UploadLocationRequest.CustomLocationAttachData3.Add(0xDD, new JT808LocationAttachImpl0xDD + { + TestValue = new byte[66] + }); + jT808UploadLocationRequest.CustomLocationAttachData2.Add(0xDE, new JT808LocationAttachImpl0xDE + { + TestValue = new byte[66] + }); + jT808UploadLocationRequest.CustomLocationAttachData4.Add(0x62, new JT808LocationAttachImpl0x62 + { + Data = new byte[256] + }); + jT808UploadLocationRequest.UnknownLocationAttachData.Add(0xCA, new byte[3] { 0xCA, 0x1, 0xFF }); + jT808UploadLocationRequest.UnknownLocationAttachData.Add(0xCB, new byte[4] { 0xCB, 0x2, 0xFF, 0xFE }); + //理论上组包的时候不会添加异常的原始数据下去 + jT808UploadLocationRequest.ExceptionLocationAttachOriginalData.Add(new byte[4] { 0xCD, 0x2, 0xFF, 0xFE }); + jT808Package.Bodies = jT808UploadLocationRequest; + var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); + Assert.Equal("7E020002050011223344550001000000010000000200BA7F0E07E4F11C0028003C000021083018171001040000006402020037DF4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DE4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD0042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000620000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA01FFCB02FFFECD02FFFE587E", hex); } [Fact] - public void Test1_1() + public void Test_Mix_2() { - byte[] bodys = "000000010000000200BA7F0E07E4F11C0028003C0000210403111010000400010203000C303132333435363738393132".ToHexBytes(); - JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize(bodys); - Assert.Equal((uint)1, jT808UploadLocationRequest.AlarmFlag); - Assert.Equal(DateTime.Parse("2021-04-03 11:10:10"), jT808UploadLocationRequest.GPSTime); + byte[] bytes = "7E020002050011223344550001000000010000000200BA7F0E07E4F11C0028003C000021083018171001040000006402020037DF4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DE4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD0042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000620000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA01FFCB02FFFECD02FFFE587E".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); + Assert.Equal(1u, jT808Package.Header.MsgNum); + Assert.Equal("1122334455", jT808Package.Header.TerminalPhoneNo); + JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)jT808Package.Bodies; + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal(40u, jT808UploadLocationRequest.Altitude); + Assert.Equal(DateTime.Parse("2021-08-30 18:17:10"), jT808UploadLocationRequest.GPSTime); Assert.Equal(12222222, jT808UploadLocationRequest.Lat); Assert.Equal(132444444, jT808UploadLocationRequest.Lng); Assert.Equal(60, jT808UploadLocationRequest.Speed); - Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); - Assert.Equal(new byte[] { 0, 1, 2, 3 }, ((JT808LocationAttachImpl0x00)jT808UploadLocationRequest.JT808CustomLocationAttachData[0x00]).TestValue); - Assert.Equal("012345678912", ((JT808LocationAttachImpl0x00)jT808UploadLocationRequest.ExceptionLocationAttachData[0]).TestId); + Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + + var jT808LocationAttachImpl0X62 = (JT808LocationAttachImpl0x62)jT808UploadLocationRequest.CustomLocationAttachData4[0x62]; + Assert.Equal(0x62, jT808LocationAttachImpl0X62.AttachInfoId); + Assert.Equal(new byte[256], jT808LocationAttachImpl0X62.Data); + Assert.Equal(256u, jT808LocationAttachImpl0X62.AttachInfoLength); + + var jT808LocationAttachImpl0XDE = (JT808LocationAttachImpl0xDE)jT808UploadLocationRequest.CustomLocationAttachData2[0xDE]; + Assert.Equal(0xDE, jT808LocationAttachImpl0XDE.AttachInfoId); + Assert.Equal(new byte[66], jT808LocationAttachImpl0XDE.TestValue); + Assert.Equal(66u, jT808LocationAttachImpl0XDE.AttachInfoLength); + + var jT808LocationAttachImpl0XDD = (JT808LocationAttachImpl0xDD)jT808UploadLocationRequest.CustomLocationAttachData3[0xDD]; + Assert.Equal(0xDD, jT808LocationAttachImpl0XDD.AttachInfoId); + Assert.Equal(new byte[66], jT808LocationAttachImpl0XDD.TestValue); + Assert.Equal(66u, jT808LocationAttachImpl0XDD.AttachInfoLength); + + var jT808LocationAttachImpl0XDF = (JT808LocationAttachImpl0xDF)jT808UploadLocationRequest.CustomLocationAttachData[0xDF]; + Assert.Equal(0xDF, jT808LocationAttachImpl0XDF.AttachInfoId); + Assert.Equal(new byte[66], jT808LocationAttachImpl0XDF.TestValue); + Assert.Equal(66u, jT808LocationAttachImpl0XDF.AttachInfoLength); + + Assert.True(jT808UploadLocationRequest.UnknownLocationAttachData.ContainsKey(0xCA)); + Assert.True(jT808UploadLocationRequest.UnknownLocationAttachData.ContainsKey(0xCB)); + Assert.Equal(new byte[3] { 0xCA, 0x1, 0xFF },jT808UploadLocationRequest.UnknownLocationAttachData[0xCA]); + Assert.Equal(new byte[4] { 0xCB, 0x2, 0xFF, 0xFE },jT808UploadLocationRequest.UnknownLocationAttachData[0xCB]); + //理论上组包的时候不会添加异常的原始数据下去 + Assert.Equal(new byte[4] { 0xCD, 0x2, 0xFF, 0xFE },jT808UploadLocationRequest.UnknownLocationAttachData[0xCD]); + Assert.Empty(jT808UploadLocationRequest.ExceptionLocationAttachOriginalData); + } + + [Fact] + public void Test_Repeat_1() + { + JT808Package jT808Package = new JT808Package(); + jT808Package.Header = new JT808Header + { + MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), + ManualMsgNum = 1, + TerminalPhoneNo = "1122334455", + }; + JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + { + AlarmFlag = 1, + Altitude = 40, + GPSTime = DateTime.Parse("2021-08-30 18:17:10"), + Lat = 12222222, + Lng = 132444444, + Speed = 60, + Direction = 0, + StatusFlag = 2, + BasicLocationAttachData = new Dictionary(), + CustomLocationAttachData = new Dictionary(), + CustomLocationAttachData2 = new Dictionary(), + CustomLocationAttachData3 = new Dictionary(), + CustomLocationAttachData4 = new Dictionary(), + UnknownLocationAttachData = new Dictionary(), + ExceptionLocationAttachOriginalData = new List() + }; + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + { + Mileage = 100 + }); + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + { + Oil = 55 + }); + jT808UploadLocationRequest.CustomLocationAttachData.Add(0xDF, new JT808LocationAttachImpl0xDF + { + TestValue = new byte[66] + }); + jT808UploadLocationRequest.UnknownLocationAttachData.Add(0xDF, new byte[3] { 0xDF, 0x1, 0xFF }); + jT808UploadLocationRequest.UnknownLocationAttachData.Add(0xCB, new byte[4] { 0xCB, 0x2, 0xFF, 0xFE }); + jT808Package.Bodies = jT808UploadLocationRequest; + var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); + Assert.Equal("7E020000710011223344550001000000010000000200BA7F0E07E4F11C0028003C000021083018171001040000006402020037DF42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DF01FFCB02FFFE957E", hex); + } + + [Fact] + public void Test_Repeat_2() + { + byte[] bytes = "7E020000710011223344550001000000010000000200BA7F0E07E4F11C0028003C000021083018171001040000006402020037DF42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DF01FFCB02FFFE957E".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); + Assert.Equal(1u, jT808Package.Header.MsgNum); + Assert.Equal("1122334455", jT808Package.Header.TerminalPhoneNo); + JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)jT808Package.Bodies; + Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); + Assert.Equal(40u, jT808UploadLocationRequest.Altitude); + Assert.Equal(DateTime.Parse("2021-08-30 18:17:10"), jT808UploadLocationRequest.GPSTime); + Assert.Equal(12222222, jT808UploadLocationRequest.Lat); + Assert.Equal(132444444, jT808UploadLocationRequest.Lng); + Assert.Equal(60, jT808UploadLocationRequest.Speed); + Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + + var jT808LocationAttachImpl0XDF = (JT808LocationAttachImpl0xDF)jT808UploadLocationRequest.CustomLocationAttachData[0xDF]; + Assert.Equal(0xDF, jT808LocationAttachImpl0XDF.AttachInfoId); + Assert.Equal(new byte[66], jT808LocationAttachImpl0XDF.TestValue); + Assert.Equal(66u, jT808LocationAttachImpl0XDF.AttachInfoLength); + + Assert.Single(jT808UploadLocationRequest.ExceptionLocationAttachOriginalData); + Assert.Equal(new byte[3] { 0xDF, 0x1, 0xFF }, jT808UploadLocationRequest.ExceptionLocationAttachOriginalData[0]); } } - public class JT808LocationAttachImpl0x00 : JT808_0x0200_CustomBodyBase, IJT808MessagePackFormatter + /// + /// 1:1 + /// + public class JT808LocationAttachImpl0xDF : JT808_0x0200_CustomBodyBase, IJT808MessagePackFormatter { /// - /// 附加Id 0x00 + /// 附加Id 0xDF /// - public override byte AttachInfoId { get; set; } = 0x00; + public override byte AttachInfoId { get; set; } = 0xDF; /// - /// 不固定 + /// /// public override byte AttachInfoLength { get; set; } /// - /// 只能存在一个 AttachInfoLength == 12 + /// /// - public string TestId { get; set; } - + public byte[] TestValue { get; set; } + public JT808LocationAttachImpl0xDF Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808LocationAttachImpl0xDF jT808LocationAttachImpl0XDF = new JT808LocationAttachImpl0xDF(); + jT808LocationAttachImpl0XDF.AttachInfoId = reader.ReadByte(); + jT808LocationAttachImpl0XDF.AttachInfoLength = reader.ReadByte(); + jT808LocationAttachImpl0XDF.TestValue = reader.ReadArray(jT808LocationAttachImpl0XDF.AttachInfoLength).ToArray(); + return jT808LocationAttachImpl0XDF; + } + public void Serialize(ref JT808MessagePackWriter writer, JT808LocationAttachImpl0xDF value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + if (value.TestValue != null) + { + writer.WriteByte((byte)value.TestValue.Length); + writer.WriteArray(value.TestValue); + } + else + { + writer.WriteByte(0); + } + } + } + /// + /// 2:1 + /// + public class JT808LocationAttachImpl0xDE : JT808_0x0200_CustomBodyBase2, IJT808MessagePackFormatter + { + /// + /// 附加Id 0xDE + /// + public override ushort AttachInfoId { get; set; } = 0xDE; + /// + /// 不固定 + /// + public override byte AttachInfoLength { get; set; } /// - /// 只能存在一个 AttachInfoLength == 4 + /// /// public byte[] TestValue { get; set; } - public JT808LocationAttachImpl0x00 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + public JT808LocationAttachImpl0xDE Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808LocationAttachImpl0xDE jT808LocationAttachImpl0XDE = new JT808LocationAttachImpl0xDE(); + jT808LocationAttachImpl0XDE.AttachInfoId = reader.ReadUInt16(); + jT808LocationAttachImpl0XDE.AttachInfoLength = reader.ReadByte(); + jT808LocationAttachImpl0XDE.TestValue = reader.ReadArray(jT808LocationAttachImpl0XDE.AttachInfoLength).ToArray(); + return jT808LocationAttachImpl0XDE; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808LocationAttachImpl0xDE value, IJT808Config config) { - JT808LocationAttachImpl0x00 jT808LocationAttachImpl0X00 = new JT808LocationAttachImpl0x00(); - jT808LocationAttachImpl0X00.AttachInfoId = reader.ReadByte(); - jT808LocationAttachImpl0X00.AttachInfoLength = reader.ReadByte(); - if (jT808LocationAttachImpl0X00.AttachInfoLength == 12) + writer.WriteUInt16(value.AttachInfoId); + if (value.TestValue != null) { - jT808LocationAttachImpl0X00.TestId = reader.ReadString(12); + writer.WriteByte((byte)value.TestValue.Length); + writer.WriteArray(value.TestValue); } - else if(jT808LocationAttachImpl0X00.AttachInfoLength == 4) + else { - jT808LocationAttachImpl0X00.TestValue = reader.ReadArray(4).ToArray(); + writer.WriteByte(0); } - return jT808LocationAttachImpl0X00; + } + } + /// + /// 2:2 + /// + public class JT808LocationAttachImpl0xDD : JT808_0x0200_CustomBodyBase3, IJT808MessagePackFormatter + { + /// + /// 附加Id 0xDD + /// + public override ushort AttachInfoId { get; set; } = 0xDD; + /// + /// + /// + public override ushort AttachInfoLength { get; set; } + /// + /// + /// + public byte[] TestValue { get; set; } + + public JT808LocationAttachImpl0xDD Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808LocationAttachImpl0xDD jT808LocationAttachImpl0XDD = new JT808LocationAttachImpl0xDD(); + jT808LocationAttachImpl0XDD.AttachInfoId = reader.ReadUInt16(); + jT808LocationAttachImpl0XDD.AttachInfoLength = reader.ReadUInt16(); + jT808LocationAttachImpl0XDD.TestValue = reader.ReadArray(jT808LocationAttachImpl0XDD.AttachInfoLength).ToArray(); + return jT808LocationAttachImpl0XDD; } - public void Serialize(ref JT808MessagePackWriter writer, JT808LocationAttachImpl0x00 value, IJT808Config config) + public void Serialize(ref JT808MessagePackWriter writer, JT808LocationAttachImpl0xDD value, IJT808Config config) { - writer.WriteByte(value.AttachInfoId); - if (!string.IsNullOrEmpty(value.TestId)) + writer.WriteUInt16(value.AttachInfoId); + if (value.TestValue != null) { - writer.WriteByte(12); - writer.WriteString(value.TestId.ValiString(nameof(TestId), 12)); + writer.WriteUInt16((ushort)value.TestValue.Length); + writer.WriteArray(value.TestValue); } - else if (value.TestValue != null) + else { - writer.WriteByte(4); - writer.WriteArray(value.TestValue.ValiBytes(nameof(TestValue), 4)); + writer.WriteUInt16(0); } } } + /// + /// 1:4 + /// + public class JT808LocationAttachImpl0x62 : JT808_0x0200_CustomBodyBase4, IJT808MessagePackFormatter + { + public override byte AttachInfoId { get; set; } = 0x62; + public override uint AttachInfoLength { get; set; } = 256; + public byte[] Data { get; set; } + + public JT808LocationAttachImpl0x62 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808LocationAttachImpl0x62 jT808LocationAttachImpl0x62 = new JT808LocationAttachImpl0x62(); + jT808LocationAttachImpl0x62.AttachInfoId = reader.ReadByte(); + jT808LocationAttachImpl0x62.AttachInfoLength = reader.ReadUInt32(); + jT808LocationAttachImpl0x62.Data = reader.ReadArray((int)jT808LocationAttachImpl0x62.AttachInfoLength).ToArray(); + return jT808LocationAttachImpl0x62; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808LocationAttachImpl0x62 value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + writer.WriteUInt32((uint)value.Data.Length); + writer.WriteArray(value.Data); + } + } } diff --git a/src/JT808.Protocol.Test/Simples/Demo12.cs b/src/JT808.Protocol.Test/Simples/Demo12.cs index 19c173e..0c94760 100644 --- a/src/JT808.Protocol.Test/Simples/Demo12.cs +++ b/src/JT808.Protocol.Test/Simples/Demo12.cs @@ -14,6 +14,9 @@ using System.Text.Json; using JT808.Protocol.MessageBody.CarDVR; using System.Linq; using JT808.Protocol.Test.JT808LocationAttach; +using static JT808.Protocol.MessageBody.JT808_0x8105; +using System.Buffers.Binary; +using Newtonsoft.Json; namespace JT808.Protocol.Test.Simples { @@ -24,73 +27,249 @@ namespace JT808.Protocol.Test.Simples public Demo12() { IJT808Config jT808Config = new DefaultGlobalConfig(); - jT808Config.JT808_0X0200_Custom_Factory.SetMap(); + jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); + jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); + jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); JT808Serializer = new JT808Serializer(jT808Config); } [Fact] public void Test1() { - JT808Package jT808Package = new JT808Package(); - jT808Package.Header = new JT808Header + JT808Package jT808Package = new JT808Package { - MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), - ManualMsgNum = 1, - TerminalPhoneNo = "1122334455", + Header = new JT808Header + { + MsgId = Enums.JT808MsgId.终端控制.ToUInt16Value(), + ManualMsgNum = 1, + TerminalPhoneNo = "12345678900", + }, + Bodies = new JT808_0x8105 + { + CommandWord = 1, + CustomCommandParameters=new List + { + new Koike1CommandParameter + { + Value=23 + }, + new Koike2CommandParameter + { + Value="SmallChi" + }, + new Koike3CommandParameter + { + Value=new Koike3Object + { + Value1=0xff, + Value2="Happy" + } + } + } + } }; - JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 + var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); + Assert.Equal("7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E", hex); + } + + [Fact] + public void Test2() + { + byte[] bytes = "7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E".ToHexBytes(); + var jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.终端控制.ToUInt16Value(), jT808Package.Header.MsgId); + Assert.Equal(1, jT808Package.Header.MsgNum); + Assert.Equal("12345678900", jT808Package.Header.TerminalPhoneNo); + var JT808_0x8105 = (JT808_0x8105)jT808Package.Bodies; + Assert.Equal(1, JT808_0x8105.CommandWord); + Assert.Equal(23u, JT808_0x8105.CustomCommandParameters.GetCommandParameter().Value.Value); + Assert.Equal("SmallChi", JT808_0x8105.CustomCommandParameters.GetCommandParameter().Value); + Assert.Equal(new Koike3Object() { - AlarmFlag = 1, - Altitude = 40, - GPSTime = DateTime.Parse("2021-05-31 18:17:10"), - Lat = 12222222, - Lng = 132444444, - Speed = 60, - Direction = 0, - StatusFlag = 2, - JT808LocationAttachData = new Dictionary(), - JT808CustomLocationAttachData = new Dictionary() - }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + Value1 = 0xff, + Value2 = "Happy" + }, JT808_0x8105.CustomCommandParameters.GetCommandParameter().Value); + } + + [Fact] + public void Test3() + { + byte[] bytes = "7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E".ToHexBytes(); + var json = JT808Serializer.Analyze(bytes); + } + + [Fact] + public void Test4() + { + var ex= Assert.Throws(() => { - Mileage = 100 + IJT808Config jT808Config = new DefaultGlobalConfig(); + jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + Assert.Equal(ex.Message, $"{typeof(ErrorCommandParameter).FullName} Order is {3}. We're starting at 13 and we're incremying by 1."); + } + + /// + /// ICusotmCommandParameter 自定义命令参数接口 + /// ICommandParameterValue<> 对应的数据类型值 + /// 注意:Order必须从13开始逐一递增 + /// + public class Koike1CommandParameter : ICusotmCommandParameter, ICommandParameterValue + { + public int Order => 13; + + public string CommandName => "Koike1"; + + public uint? Value { get; set; } + + /// + /// + /// + /// + public byte[] ToBytes() { - Oil = 55 - }); - jT808UploadLocationRequest.JT808CustomLocationAttachData.Add(0x62, new JT808LocationAttachImpl0x62 + if (!Value.HasValue) return default; + var value = new byte[4]; + BinaryPrimitives.WriteUInt32BigEndian(value, Value.Value); + return value; + } + /// + /// + /// + /// + public void ToValue(byte[] bytes) { - Data=new byte[256] - }); - jT808Package.Bodies = jT808UploadLocationRequest; - var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); - Assert.Equal("7E0200012B0011223344550001000000010000000200BA7F0E07E4F11C0028003C000021053118171001040000006402020037620000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D57E", hex); + if (bytes != null && bytes.Length > 0) + { + Value = BinaryPrimitives.ReadUInt32BigEndian(bytes); + } + } + } + /// + /// ICusotmCommandParameter 自定义命令参数接口 + /// ICommandParameterValue<> 对应的数据类型值 + /// 注意:Order必须从13开始逐一递增 + /// + public class Koike2CommandParameter : ICusotmCommandParameter, ICommandParameterValue + { + public int Order => 14; + public string CommandName => "Koike2"; + public string Value { get; set; } + /// + /// + /// + /// + public byte[] ToBytes() + { + if (string.IsNullOrEmpty(Value)) return default; + return JT808Constants.Encoding.GetBytes(Value.PadRight(10, '\0')); + } + /// + /// + /// + /// + public void ToValue(byte[] bytes) + { + if (bytes != null && bytes.Length > 0) + { + Value = JT808Constants.Encoding.GetString(bytes).Trim('\0'); + } + } + } + /// + /// ICusotmCommandParameter 自定义命令参数接口 + /// ICommandParameterValue<> 对应的数据类型值 + /// 注意:Order必须从13开始逐一递增 + /// + public class Koike3CommandParameter : ICusotmCommandParameter, ICommandParameterValue + { + public int Order => 15; + public string CommandName => "Koike3"; + public Koike3Object Value { get; set; } + /// + /// + /// + /// + public byte[] ToBytes() + { + if (Value==null) return default; + return Value.ToBytes(); + } + /// + /// + /// + /// + public void ToValue(byte[] bytes) + { + if (bytes != null && bytes.Length > 0) + { + Value = new Koike3Object(); + Value.ToValue(bytes); + } + } + } + /// + /// Koike3为对象 + /// ICommandParameterConvert:命令参数转换 + /// ToString:为对象类型用于分析器自定义显示 + /// + public record Koike3Object : ICommandParameterConvert + { + public byte Value1 { get; set; } + public string Value2 { get; set; } + public byte[] ToBytes() + { + byte[] value = new byte[11]; + value[0] = Value1; + var val2 = JT808Constants.Encoding.GetBytes(Value2.PadRight(10, '\0')); + Array.Copy(val2, 0, value, 1, val2.Length); + return value; + } + public void ToValue(byte[] bytes) + { + if (bytes != null && bytes.Length > 0) + { + var val = bytes.AsSpan(); + Value1 = val[0]; + Value2 = JT808Constants.Encoding.GetString(val.Slice(1)).Trim('\0'); + } + } + /// + /// 用于分析器描述 + /// + /// + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } } - [Fact] - public void Test2() + /// + /// ICusotmCommandParameter 自定义命令参数接口 + /// ICommandParameterValue<> 对应的数据类型值 + /// 注意:Order必须从13开始逐一递增 + /// + public class ErrorCommandParameter : ICusotmCommandParameter, ICommandParameterValue { - byte[] bytes = "7E0200012B0011223344550001000000010000000200BA7F0E07E4F11C0028003C000021053118171001040000006402020037620000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D57E".ToHexBytes(); - var jT808Package = JT808Serializer.Deserialize(bytes); - Assert.Equal(Enums.JT808MsgId.位置信息汇报.ToValue(), jT808Package.Header.MsgId); - Assert.Equal(1u, jT808Package.Header.MsgNum); - Assert.Equal("1122334455", jT808Package.Header.TerminalPhoneNo); - JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)jT808Package.Bodies; - Assert.Equal(1u, jT808UploadLocationRequest.AlarmFlag); - Assert.Equal(40u, jT808UploadLocationRequest.Altitude); - Assert.Equal(DateTime.Parse("2021-05-31 18:17:10"), jT808UploadLocationRequest.GPSTime); - Assert.Equal(12222222, jT808UploadLocationRequest.Lat); - Assert.Equal(132444444, jT808UploadLocationRequest.Lng); - Assert.Equal(60, jT808UploadLocationRequest.Speed); - Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); - var jT808LocationAttachImpl0X62 = (JT808LocationAttachImpl0x62)jT808UploadLocationRequest.JT808CustomLocationAttachData[0x62]; - Assert.Equal(0x62, jT808LocationAttachImpl0X62.AttachInfoId); - Assert.Equal(new byte[256], jT808LocationAttachImpl0X62.Data); - Assert.Equal(256u, jT808LocationAttachImpl0X62.AttachInfoLengthExtend); - Assert.Equal(0, jT808LocationAttachImpl0X62.AttachInfoLength); + public int Order => 3; + public string CommandName => "Error"; + public bool Value { get; set; } + /// + /// + /// + /// + public byte[] ToBytes() + { + return default; + } + /// + /// + /// + /// + public void ToValue(byte[] bytes) + { + + } } } } diff --git a/src/JT808.Protocol.Test/Simples/Demo13.cs b/src/JT808.Protocol.Test/Simples/Demo13.cs index 38b5e95..a70900a 100644 --- a/src/JT808.Protocol.Test/Simples/Demo13.cs +++ b/src/JT808.Protocol.Test/Simples/Demo13.cs @@ -26,11 +26,19 @@ namespace JT808.Protocol.Test.Simples public Demo13() { - IJT808Config jT808Config = new DefaultGlobalConfig(); - jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); - jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); - jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); - JT808Serializer = new JT808Serializer(jT808Config); + IServiceCollection serviceDescriptors = new ServiceCollection(); + serviceDescriptors.AddJT808Configure(new DefaultGlobalConfig("replace")); + //通常在startup中使用app的Use进行扩展 + IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); + Use(serviceProvider); + } + + void Use(IServiceProvider serviceProvider) + { + IJT808Config jT808Config = serviceProvider.GetRequiredService(); + //替换原有消息存在的BUG + jT808Config.ReplaceMsgId(); + JT808Serializer = jT808Config.GetSerializer(); } [Fact] @@ -40,236 +48,115 @@ namespace JT808.Protocol.Test.Simples { Header = new JT808Header { - MsgId = Enums.JT808MsgId.终端控制.ToUInt16Value(), - ManualMsgNum = 1, - TerminalPhoneNo = "12345678900", + MsgId = Enums.JT808MsgId.终端通用应答.ToUInt16Value(), + ManualMsgNum = 1203, + TerminalPhoneNo = "012345678900", }, - Bodies = new JT808_0x8105 + Bodies = new JT808_0x0001_Replace { - CommandWord = 1, - CustomCommandParameters=new List - { - new Koike1CommandParameter - { - Value=23 - }, - new Koike2CommandParameter - { - Value="SmallChi" - }, - new Koike3CommandParameter - { - Value=new Koike3Object - { - Value1=0xff, - Value2="Happy" - } - } - } + ReplyMsgId = Enums.JT808MsgId.终端心跳.ToUInt16Value(), + ReplyMsgNum = 1000, + TerminalResult = Enums.JT808TerminalResult.Success, + Test=168 } }; var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); - Assert.Equal("7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E", hex); + Assert.Equal("7E0001000701234567890004B303E800020000A8797E", hex); } [Fact] public void Test2() { - byte[] bytes = "7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E".ToHexBytes(); - var jT808Package = JT808Serializer.Deserialize(bytes); - Assert.Equal(Enums.JT808MsgId.终端控制.ToUInt16Value(), jT808Package.Header.MsgId); - Assert.Equal(1, jT808Package.Header.MsgNum); - Assert.Equal("12345678900", jT808Package.Header.TerminalPhoneNo); - var JT808_0x8105 = (JT808_0x8105)jT808Package.Bodies; - Assert.Equal(1, JT808_0x8105.CommandWord); - Assert.Equal(23u, JT808_0x8105.CustomCommandParameters.GetCommandParameter().Value.Value); - Assert.Equal("SmallChi", JT808_0x8105.CustomCommandParameters.GetCommandParameter().Value); - Assert.Equal(new Koike3Object() - { - Value1 = 0xff, - Value2 = "Happy" - }, JT808_0x8105.CustomCommandParameters.GetCommandParameter().Value); - } - - [Fact] - public void Test3() - { - byte[] bytes = "7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E".ToHexBytes(); - var json = JT808Serializer.Analyze(bytes); - } - - [Fact] - public void Test4() - { - var ex= Assert.Throws(() => - { - IJT808Config jT808Config = new DefaultGlobalConfig(); - jT808Config.JT808_0x8105_Cusotm_Factory.SetMap(); - }); - Assert.Equal(ex.Message, $"{typeof(ErrorCommandParameter).FullName} Order is {3}. We're starting at 13 and we're incremying by 1."); + var bytes = "7E0001000701234567890004B303E800020000A8797E".ToHexBytes(); + JT808Package jT808Package = JT808Serializer.Deserialize(bytes); + Assert.Equal(Enums.JT808MsgId.终端通用应答.ToValue(), jT808Package.Header.MsgId); + Assert.Equal(1203, jT808Package.Header.MsgNum); + JT808_0x0001_Replace JT808Bodies = (JT808_0x0001_Replace)jT808Package.Bodies; + Assert.Equal(Enums.JT808MsgId.终端心跳.ToUInt16Value(), JT808Bodies.ReplyMsgId); + Assert.Equal(1000, JT808Bodies.ReplyMsgNum); + Assert.Equal(Enums.JT808TerminalResult.Success, JT808Bodies.TerminalResult); + Assert.Equal(168u, JT808Bodies.Test); } + } + /// + /// 终端通用应答_替换原有的消息,来解决库现有的bug + /// + public class JT808_0x0001_Replace : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze + { /// - /// ICusotmCommandParameter 自定义命令参数接口 - /// ICommandParameterValue<> 对应的数据类型值 - /// 注意:Order必须从13开始逐一递增 + /// 0x0001 /// - public class Koike1CommandParameter : ICusotmCommandParameter, ICommandParameterValue - { - public int Order => 13; - - public string CommandName => "Koike1"; - - public uint? Value { get; set; } + public override ushort MsgId => 0x0001; + /// + /// 终端通用应答 + /// + public override string Description => "终端通用应答"; + /// + /// 应答流水号 + /// 对应的平台消息的流水号 + /// + public ushort ReplyMsgNum { get; set; } + /// + /// 应答 ID + /// 对应的平台消息的 ID + /// + /// + public ushort ReplyMsgId { get; set; } - /// - /// - /// - /// - public byte[] ToBytes() - { - if (!Value.HasValue) return default; - var value = new byte[4]; - BinaryPrimitives.WriteUInt32BigEndian(value, Value.Value); - return value; - } - /// - /// - /// - /// - public void ToValue(byte[] bytes) - { - if (bytes != null && bytes.Length > 0) - { - Value = BinaryPrimitives.ReadUInt32BigEndian(bytes); - } - } - } /// - /// ICusotmCommandParameter 自定义命令参数接口 - /// ICommandParameterValue<> 对应的数据类型值 - /// 注意:Order必须从13开始逐一递增 + /// 结果 + /// 0:成功/确认;1:失败;2:消息有误;3:不支持 /// - public class Koike2CommandParameter : ICusotmCommandParameter, ICommandParameterValue - { - public int Order => 14; - public string CommandName => "Koike2"; - public string Value { get; set; } - /// - /// - /// - /// - public byte[] ToBytes() - { - if (string.IsNullOrEmpty(Value)) return default; - return JT808Constants.Encoding.GetBytes(Value.PadRight(10, '\0')); - } - /// - /// - /// - /// - public void ToValue(byte[] bytes) - { - if (bytes != null && bytes.Length > 0) - { - Value = JT808Constants.Encoding.GetString(bytes).Trim('\0'); - } - } - } + public JT808TerminalResult TerminalResult { get; set; } /// - /// ICusotmCommandParameter 自定义命令参数接口 - /// ICommandParameterValue<> 对应的数据类型值 - /// 注意:Order必须从13开始逐一递增 + /// 测试 /// - public class Koike3CommandParameter : ICusotmCommandParameter, ICommandParameterValue + public ushort Test { get; set; } + /// + /// + /// + /// + /// + /// + public JT808_0x0001_Replace Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { - public int Order => 15; - public string CommandName => "Koike3"; - public Koike3Object Value { get; set; } - /// - /// - /// - /// - public byte[] ToBytes() - { - if (Value==null) return default; - return Value.ToBytes(); - } - /// - /// - /// - /// - public void ToValue(byte[] bytes) - { - if (bytes != null && bytes.Length > 0) - { - Value = new Koike3Object(); - Value.ToValue(bytes); - } - } + JT808_0x0001_Replace jT808_0X0001 = new JT808_0x0001_Replace(); + jT808_0X0001.ReplyMsgNum = reader.ReadUInt16(); + jT808_0X0001.ReplyMsgId = reader.ReadUInt16(); + jT808_0X0001.TerminalResult = (JT808TerminalResult)reader.ReadByte(); + jT808_0X0001.Test = reader.ReadUInt16(); + return jT808_0X0001; } /// - /// Koike3为对象 - /// ICommandParameterConvert:命令参数转换 - /// ToString:为对象类型用于分析器自定义显示 + /// /// - public record Koike3Object : ICommandParameterConvert + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0001_Replace value, IJT808Config config) { - public byte Value1 { get; set; } - public string Value2 { get; set; } - public byte[] ToBytes() - { - byte[] value = new byte[11]; - value[0] = Value1; - var val2 = JT808Constants.Encoding.GetBytes(Value2.PadRight(10, '\0')); - Array.Copy(val2, 0, value, 1, val2.Length); - return value; - } - public void ToValue(byte[] bytes) - { - if (bytes != null && bytes.Length > 0) - { - var val = bytes.AsSpan(); - Value1 = val[0]; - Value2 = JT808Constants.Encoding.GetString(val.Slice(1)).Trim('\0'); - } - } - /// - /// 用于分析器描述 - /// - /// - public override string ToString() - { - return JsonConvert.SerializeObject(this); - } + writer.WriteUInt16(value.ReplyMsgNum); + writer.WriteUInt16(value.ReplyMsgId); + writer.WriteByte((byte)value.TerminalResult); + writer.WriteUInt16(value.Test); } - /// - /// ICusotmCommandParameter 自定义命令参数接口 - /// ICommandParameterValue<> 对应的数据类型值 - /// 注意:Order必须从13开始逐一递增 + /// /// - public class ErrorCommandParameter : ICusotmCommandParameter, ICommandParameterValue + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { - public int Order => 3; - public string CommandName => "Error"; - public bool Value { get; set; } - /// - /// - /// - /// - public byte[] ToBytes() - { - return default; - } - /// - /// - /// - /// - public void ToValue(byte[] bytes) - { - - } + var replyMsgNum = reader.ReadUInt16(); + var replyMsgId = reader.ReadUInt16(); + var terminalResult = reader.ReadByte(); + var test = reader.ReadUInt16(); + writer.WriteNumber($"[{replyMsgNum.ReadNumber()}]应答流水号", replyMsgNum); + writer.WriteNumber($"[{replyMsgId.ReadNumber()}]应答消息Id", replyMsgId); + writer.WriteString($"[{terminalResult.ReadNumber()}]结果", ((JT808TerminalResult)terminalResult).ToString()); + writer.WriteNumber($"[{test.ReadNumber()}]测试", test); } } } diff --git a/src/JT808.Protocol.Test/Simples/Demo14.cs b/src/JT808.Protocol.Test/Simples/Demo14.cs index 1a9786e..7343372 100644 --- a/src/JT808.Protocol.Test/Simples/Demo14.cs +++ b/src/JT808.Protocol.Test/Simples/Demo14.cs @@ -27,136 +27,22 @@ namespace JT808.Protocol.Test.Simples public Demo14() { IServiceCollection serviceDescriptors = new ServiceCollection(); - serviceDescriptors.AddJT808Configure(new DefaultGlobalConfig("replace")); + serviceDescriptors.AddJT808Configure(); //通常在startup中使用app的Use进行扩展 IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); - Use(serviceProvider); - } - - void Use(IServiceProvider serviceProvider) - { - IJT808Config jT808Config = serviceProvider.GetRequiredService(); - //替换原有消息存在的BUG - jT808Config.ReplaceMsgId(); - JT808Serializer = jT808Config.GetSerializer(); + JT808Serializer = serviceProvider.GetRequiredService().GetSerializer(); } [Fact] public void Test1() { - JT808Package jT808Package = new JT808Package - { - Header = new JT808Header - { - MsgId = Enums.JT808MsgId.终端通用应答.ToUInt16Value(), - ManualMsgNum = 1203, - TerminalPhoneNo = "012345678900", - }, - Bodies = new JT808_0x0001_Replace - { - ReplyMsgId = Enums.JT808MsgId.终端心跳.ToUInt16Value(), - ReplyMsgNum = 1000, - TerminalResult = Enums.JT808TerminalResult.Success, - Test=168 - } - }; - var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); - Assert.Equal("7E0001000701234567890004B303E800020000A8797E", hex); - } - - [Fact] - public void Test2() - { - var bytes = "7E0001000701234567890004B303E800020000A8797E".ToHexBytes(); - JT808Package jT808Package = JT808Serializer.Deserialize(bytes); - Assert.Equal(Enums.JT808MsgId.终端通用应答.ToValue(), jT808Package.Header.MsgId); - Assert.Equal(1203, jT808Package.Header.MsgNum); - JT808_0x0001_Replace JT808Bodies = (JT808_0x0001_Replace)jT808Package.Bodies; - Assert.Equal(Enums.JT808MsgId.终端心跳.ToUInt16Value(), JT808Bodies.ReplyMsgId); - Assert.Equal(1000, JT808Bodies.ReplyMsgNum); - Assert.Equal(Enums.JT808TerminalResult.Success, JT808Bodies.TerminalResult); - Assert.Equal(168u, JT808Bodies.Test); - } - } - - /// - /// 终端通用应答_替换原有的消息,来解决库现有的bug - /// - public class JT808_0x0001_Replace : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze - { - /// - /// 0x0001 - /// - public override ushort MsgId => 0x0001; - /// - /// 终端通用应答 - /// - public override string Description => "终端通用应答"; - /// - /// 应答流水号 - /// 对应的平台消息的流水号 - /// - public ushort ReplyMsgNum { get; set; } - /// - /// 应答 ID - /// 对应的平台消息的 ID - /// - /// - public ushort ReplyMsgId { get; set; } - - /// - /// 结果 - /// 0:成功/确认;1:失败;2:消息有误;3:不支持 - /// - public JT808TerminalResult TerminalResult { get; set; } - /// - /// 测试 - /// - public ushort Test { get; set; } - /// - /// - /// - /// - /// - /// - public JT808_0x0001_Replace Deserialize(ref JT808MessagePackReader reader, IJT808Config config) - { - JT808_0x0001_Replace jT808_0X0001 = new JT808_0x0001_Replace(); - jT808_0X0001.ReplyMsgNum = reader.ReadUInt16(); - jT808_0X0001.ReplyMsgId = reader.ReadUInt16(); - jT808_0X0001.TerminalResult = (JT808TerminalResult)reader.ReadByte(); - jT808_0X0001.Test = reader.ReadUInt16(); - return jT808_0X0001; - } - /// - /// - /// - /// - /// - /// - public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0001_Replace value, IJT808Config config) - { - writer.WriteUInt16(value.ReplyMsgNum); - writer.WriteUInt16(value.ReplyMsgId); - writer.WriteByte((byte)value.TerminalResult); - writer.WriteUInt16(value.Test); - } - /// - /// - /// - /// - /// - /// - public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) - { - var replyMsgNum = reader.ReadUInt16(); - var replyMsgId = reader.ReadUInt16(); - var terminalResult = reader.ReadByte(); - var test = reader.ReadUInt16(); - writer.WriteNumber($"[{replyMsgNum.ReadNumber()}]应答流水号", replyMsgNum); - writer.WriteNumber($"[{replyMsgId.ReadNumber()}]应答消息Id", replyMsgId); - writer.WriteString($"[{terminalResult.ReadNumber()}]结果", ((JT808TerminalResult)terminalResult).ToString()); - writer.WriteNumber($"[{test.ReadNumber()}]测试", test); + var bytes = "7e0102400c01003000068109024a3130303330303030363831857e".ToHexBytes(); + JT808Package jT808Package = JT808Serializer.Deserialize(bytes, JT808Version.JTT2013Force);//强制使用2013协议转换 + //因头部的版本标识号是2019,实际上是使用2013的协议 + jT808Package.Header.MessageBodyProperty.VersionFlag = false; + //修改版本号之后,重新编码协议,以便后续服务正常使用 + var newBytes=JT808Serializer.Serialize(jT808Package); + JT808Package jT808PackageNew = JT808Serializer.Deserialize(newBytes); } } } diff --git a/src/JT808.Protocol.Test/Simples/Demo15.cs b/src/JT808.Protocol.Test/Simples/Demo15.cs index f48ea51..9b77292 100644 --- a/src/JT808.Protocol.Test/Simples/Demo15.cs +++ b/src/JT808.Protocol.Test/Simples/Demo15.cs @@ -36,13 +36,48 @@ namespace JT808.Protocol.Test.Simples [Fact] public void Test1() { - var bytes = "7e0102400c01003000068109024a3130303330303030363831857e".ToHexBytes(); - JT808Package jT808Package = JT808Serializer.Deserialize(bytes, JT808Version.JTT2013Force);//强制使用2013协议转换 - //因头部的版本标识号是2019,实际上是使用2013的协议 - jT808Package.Header.MessageBodyProperty.VersionFlag = false; - //修改版本号之后,重新编码协议,以便后续服务正常使用 - var newBytes=JT808Serializer.Serialize(jT808Package); - JT808Package jT808PackageNew = JT808Serializer.Deserialize(newBytes); + JT808Package jT808_0X0100 = new JT808Package + { + Header = new JT808Header + { + MsgId = Enums.JT808MsgId.终端注册.ToUInt16Value(), + ManualMsgNum = 10, + TerminalPhoneNo = "123456789", + }, + Bodies = new JT808_0x0100 + { + AreaID = 40, + CityOrCountyId = 50, + MakerId = "1234", + PlateColor = 1, + PlateNo = "粤A12345", + TerminalId = "CHI123", + TerminalModel = "tk12345" + } + }; + var hex = JT808Serializer.Serialize(jT808_0X0100, JT808Version.JTT2011).ToHexString(); + Assert.Equal("7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E", hex); + } + + [Fact] + public void Test2() + { + var bytes = "7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E".ToHexBytes(); + JT808Package jT808_0X0100 = JT808Serializer.Deserialize(bytes); + // 采用2011协议 的终端注册消息解析 + Assert.Equal(JT808MsgId.终端注册.ToUInt16Value(), jT808_0X0100.Header.MsgId); + Assert.Equal(1, jT808_0X0100.Header.ProtocolVersion); + Assert.Equal(10, jT808_0X0100.Header.MsgNum); + Assert.Equal("123456789", jT808_0X0100.Header.TerminalPhoneNo); + + JT808_0x0100 JT808Bodies = (JT808_0x0100)jT808_0X0100.Bodies; + Assert.Equal(40, JT808Bodies.AreaID); + Assert.Equal(50, JT808Bodies.CityOrCountyId); + Assert.Equal("1234", JT808Bodies.MakerId); + Assert.Equal(1, JT808Bodies.PlateColor); + Assert.Equal("粤A12345", JT808Bodies.PlateNo); + Assert.Equal("CHI123", JT808Bodies.TerminalId); + Assert.Equal("tk12345", JT808Bodies.TerminalModel); } } } diff --git a/src/JT808.Protocol.Test/Simples/Demo16.cs b/src/JT808.Protocol.Test/Simples/Demo16.cs deleted file mode 100644 index 6087ce5..0000000 --- a/src/JT808.Protocol.Test/Simples/Demo16.cs +++ /dev/null @@ -1,83 +0,0 @@ -using JT808.Protocol.Enums; -using JT808.Protocol.Interfaces; -using JT808.Protocol.Internal; -using JT808.Protocol.Extensions; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using JT808.Protocol.MessageBody; -using JT808.Protocol.Formatters; -using JT808.Protocol.MessagePack; -using System.Text.Json; -using JT808.Protocol.MessageBody.CarDVR; -using System.Linq; -using JT808.Protocol.Test.JT808LocationAttach; -using static JT808.Protocol.MessageBody.JT808_0x8105; -using System.Buffers.Binary; -using Newtonsoft.Json; - -namespace JT808.Protocol.Test.Simples -{ - public class Demo16 - { - JT808Serializer JT808Serializer; - - public Demo16() - { - IServiceCollection serviceDescriptors = new ServiceCollection(); - serviceDescriptors.AddJT808Configure(); - //通常在startup中使用app的Use进行扩展 - IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); - JT808Serializer = serviceProvider.GetRequiredService().GetSerializer(); - } - - [Fact] - public void Test1() - { - JT808Package jT808_0X0100 = new JT808Package - { - Header = new JT808Header - { - MsgId = Enums.JT808MsgId.终端注册.ToUInt16Value(), - ManualMsgNum = 10, - TerminalPhoneNo = "123456789", - }, - Bodies = new JT808_0x0100 - { - AreaID = 40, - CityOrCountyId = 50, - MakerId = "1234", - PlateColor = 1, - PlateNo = "粤A12345", - TerminalId = "CHI123", - TerminalModel = "tk12345" - } - }; - var hex = JT808Serializer.Serialize(jT808_0X0100, JT808Version.JTT2011).ToHexString(); - Assert.Equal("7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E", hex); - } - - [Fact] - public void Test2() - { - var bytes = "7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E".ToHexBytes(); - JT808Package jT808_0X0100 = JT808Serializer.Deserialize(bytes); - // 采用2011协议 的终端注册消息解析 - Assert.Equal(JT808MsgId.终端注册.ToUInt16Value(), jT808_0X0100.Header.MsgId); - Assert.Equal(1, jT808_0X0100.Header.ProtocolVersion); - Assert.Equal(10, jT808_0X0100.Header.MsgNum); - Assert.Equal("123456789", jT808_0X0100.Header.TerminalPhoneNo); - - JT808_0x0100 JT808Bodies = (JT808_0x0100)jT808_0X0100.Bodies; - Assert.Equal(40, JT808Bodies.AreaID); - Assert.Equal(50, JT808Bodies.CityOrCountyId); - Assert.Equal("1234", JT808Bodies.MakerId); - Assert.Equal(1, JT808Bodies.PlateColor); - Assert.Equal("粤A12345", JT808Bodies.PlateNo); - Assert.Equal("CHI123", JT808Bodies.TerminalId); - Assert.Equal("tk12345", JT808Bodies.TerminalModel); - } - } -} diff --git a/src/JT808.Protocol.Test/Simples/Demo2.cs b/src/JT808.Protocol.Test/Simples/Demo2.cs index 3b7821d..ac2fb5f 100644 --- a/src/JT808.Protocol.Test/Simples/Demo2.cs +++ b/src/JT808.Protocol.Test/Simples/Demo2.cs @@ -50,9 +50,9 @@ namespace JT808.Protocol.Test.Simples Assert.Equal(0, jT808_0x0200.Direction); Assert.Equal((uint)2, jT808_0x0200.StatusFlag); //4.1.附加信息1 - Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); //4.2.附加信息2 - Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } } } diff --git a/src/JT808.Protocol.Test/Simples/Demo3.cs b/src/JT808.Protocol.Test/Simples/Demo3.cs index fc0d48d..10cff7a 100644 --- a/src/JT808.Protocol.Test/Simples/Demo3.cs +++ b/src/JT808.Protocol.Test/Simples/Demo3.cs @@ -34,7 +34,7 @@ namespace JT808.Protocol.Test.Simples Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary + BasicLocationAttachData = new Dictionary { { JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}}, { JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}} diff --git a/src/JT808.Protocol.Test/Simples/Demo4.cs b/src/JT808.Protocol.Test/Simples/Demo4.cs index 6186636..63e8c63 100644 --- a/src/JT808.Protocol.Test/Simples/Demo4.cs +++ b/src/JT808.Protocol.Test/Simples/Demo4.cs @@ -48,7 +48,7 @@ namespace JT808.Protocol.Test.Simples Speed = 60, Direction = 0, StatusFlag = 2, - JT808CustomLocationAttachData = new Dictionary + CustomLocationAttachData = new Dictionary { {0x81,new JT808_0x0200_DT1_0x81 { Age=15, @@ -62,7 +62,7 @@ namespace JT808.Protocol.Test.Simples var jT808PackageResult = demo5JT808Serializer.Deserialize(data); JT808_0x0200 jT808_0X0200 = jT808PackageResult.Bodies as JT808_0x0200; - var attach = DeviceTypeFactory.Create(cache[jT808PackageResult.Header.TerminalPhoneNo], jT808_0X0200.JT808CustomLocationAttachData); + var attach = DeviceTypeFactory.Create(cache[jT808PackageResult.Header.TerminalPhoneNo], jT808_0X0200.CustomLocationAttachData); var extJson = attach.ExtData.Data.ToString(Formatting.None); var attachinfo81 = (JT808_0x0200_DT1_0x81)attach.JT808CustomLocationAttachData[0x81]; Assert.Equal((uint)15, attachinfo81.Age); diff --git a/src/JT808.Protocol/Interfaces/IJT808_0x0200_Custom_Factory.cs b/src/JT808.Protocol/Interfaces/IJT808_0x0200_Custom_Factory.cs index e8936c6..6cca162 100644 --- a/src/JT808.Protocol/Interfaces/IJT808_0x0200_Custom_Factory.cs +++ b/src/JT808.Protocol/Interfaces/IJT808_0x0200_Custom_Factory.cs @@ -11,14 +11,44 @@ namespace JT808.Protocol.Interfaces public interface IJT808_0x0200_Custom_Factory: IJT808ExternalRegister { /// - /// + /// map JT808_0x0200_CustomBodyBase /// IDictionary Map { get; } /// + /// map JT808_0x0200_CustomBodyBase2 + /// + IDictionary Map2 { get; } + /// + /// map JT808_0x0200_CustomBodyBase3 + /// + IDictionary Map3 { get; } + /// + /// map JT808_0x0200_CustomBodyBase4 + /// + IDictionary Map4 { get; } + /// /// /// /// /// IJT808_0x0200_Custom_Factory SetMap() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase; + /// + /// + /// + /// + /// + IJT808_0x0200_Custom_Factory SetMap2() where TJT808_0x0200_CustomBody2 : JT808_0x0200_CustomBodyBase2; + /// + /// + /// + /// + /// + IJT808_0x0200_Custom_Factory SetMap3() where TJT808_0x0200_CustomBody3 : JT808_0x0200_CustomBodyBase3; + /// + /// + /// + /// + /// + IJT808_0x0200_Custom_Factory SetMap4() where TJT808_0x0200_CustomBody4 : JT808_0x0200_CustomBodyBase4; } } diff --git a/src/JT808.Protocol/Internal/JT808_0x0200_Custom_Factory.cs b/src/JT808.Protocol/Internal/JT808_0x0200_Custom_Factory.cs index 398279f..faec144 100644 --- a/src/JT808.Protocol/Internal/JT808_0x0200_Custom_Factory.cs +++ b/src/JT808.Protocol/Internal/JT808_0x0200_Custom_Factory.cs @@ -12,9 +12,18 @@ namespace JT808.Protocol.Internal { public IDictionary Map { get; } + public IDictionary Map2 { get; } + + public IDictionary Map3 { get; } + + public IDictionary Map4 { get; } + public JT808_0x0200_Custom_Factory() { Map = new Dictionary(); + Map2 = new Dictionary(); + Map3 = new Dictionary(); + Map4 = new Dictionary(); } public void Register(Assembly externalAssembly) @@ -33,6 +42,51 @@ namespace JT808.Protocol.Internal Map.Add(attachid, instance); } } + + var types2 = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase2)).ToList(); + foreach (var type in types2) + { + var instance = Activator.CreateInstance(type); + var attachid = (ushort)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase2.AttachInfoId)).GetValue(instance); + if (Map2.ContainsKey(attachid)) + { + throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); + } + else + { + Map2.Add(attachid, instance); + } + } + + var types3 = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase3)).ToList(); + foreach (var type in types3) + { + var instance = Activator.CreateInstance(type); + var attachid = (ushort)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase3.AttachInfoId)).GetValue(instance); + if (Map3.ContainsKey(attachid)) + { + throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); + } + else + { + Map3.Add(attachid, instance); + } + } + + var types4 = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase4)).ToList(); + foreach (var type in types4) + { + var instance = Activator.CreateInstance(type); + var attachid = (byte)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase4.AttachInfoId)).GetValue(instance); + if (Map4.ContainsKey(attachid)) + { + throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); + } + else + { + Map4.Add(attachid, instance); + } + } } public IJT808_0x0200_Custom_Factory SetMap() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase @@ -50,5 +104,53 @@ namespace JT808.Protocol.Internal } return this; } + + public IJT808_0x0200_Custom_Factory SetMap2() where TJT808_0x0200_CustomBody2 : JT808_0x0200_CustomBodyBase2 + { + Type type = typeof(TJT808_0x0200_CustomBody2); + var instance = Activator.CreateInstance(type); + var attachInfoId = (ushort)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase2.AttachInfoId)).GetValue(instance); + if (Map2.ContainsKey(attachInfoId)) + { + throw new ArgumentException($"{type.FullName} {attachInfoId} An element with the same key already exists."); + } + else + { + Map2.Add(attachInfoId, instance); + } + return this; + } + + public IJT808_0x0200_Custom_Factory SetMap3() where TJT808_0x0200_CustomBody3 : JT808_0x0200_CustomBodyBase3 + { + Type type = typeof(TJT808_0x0200_CustomBody3); + var instance = Activator.CreateInstance(type); + var attachInfoId = (ushort)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase3.AttachInfoId)).GetValue(instance); + if (Map3.ContainsKey(attachInfoId)) + { + throw new ArgumentException($"{type.FullName} {attachInfoId} An element with the same key already exists."); + } + else + { + Map3.Add(attachInfoId, instance); + } + return this; + } + + public IJT808_0x0200_Custom_Factory SetMap4() where TJT808_0x0200_CustomBody4 : JT808_0x0200_CustomBodyBase4 + { + Type type = typeof(TJT808_0x0200_CustomBody4); + var instance = Activator.CreateInstance(type); + var attachInfoId = (byte)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase4.AttachInfoId)).GetValue(instance); + if (Map4.ContainsKey(attachInfoId)) + { + throw new ArgumentException($"{type.FullName} {attachInfoId} An element with the same key already exists."); + } + else + { + Map4.Add(attachInfoId, instance); + } + return this; + } } } diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index b05d7de..68b4885 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -4249,7 +4249,22 @@ - + map JT808_0x0200_CustomBodyBase + + + + + map JT808_0x0200_CustomBodyBase2 + + + + + map JT808_0x0200_CustomBodyBase3 + + + + + map JT808_0x0200_CustomBodyBase4 @@ -4259,6 +4274,27 @@ + + + + + + + + + + + + + + + + + + + + + 0x0200附加信息工厂 @@ -9079,17 +9115,12 @@ YY-MM-DD-hh-mm-ss(GMT+8 时间,本标准中之后涉及的时间均采用此时区) - + - 位置附加信息 + 基础位置附加信息 - - - 存储未知的附加信息源数据 - - - + 自定义位置附加信息 场景: @@ -9101,32 +9132,32 @@ 依赖平台录入的设备类型 - + + + 自定义位置附加信息2 + + + + + 自定义位置附加信息3 + + + - 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 - 形如: - 00 0C 这个是长度 - 00 B2 这个是长度 - 实际解析 - 00 附加信息Id - 0C 附加信息长度 - 00 附加信息Id - B2 附加信息长度 - 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 + 自定义位置附加信息4 - + + + 未知自定义附加数据【一切都是为了尽可能兼容】 + 形如:自定义_附加Id字节数_附加数据长度_附加Id + 注意:这边不是最好的解决方式,最好的方式就是通过已知的自定义协议附加,根据提供的文档进行组织后在注册。 + 这边采用优先1-1的,然后是绝大多数设备厂家有2-1,少部分是2-2,最后是1_4。 + + + - 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 - 形如: - 00 0C 这个是长度 - 00 B2 这个是长度 - 实际解析 - 00 附加信息Id - 0C 附加信息长度 - 00 附加信息Id - B2 附加信息长度 - 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 + 设备未知自定义附加数据(未注册)、数据解析异常 @@ -9955,11 +9986,53 @@ 自定义附加信息长度 - + + + 自定义位置附加信息 + + + + + 自定义附加信息Id扩展 + 两个字节 + + + + + 自定义附加信息长度 + + + - 附加信息长度扩展 - 4个字节 - 注意:只适用于已知的协议才行 + 自定义位置附加信息 + + + + + 自定义附加信息Id扩展 + 两个字节 + + + + + 自定义附加信息长度 + 两个字节 + + + + + 自定义位置附加信息 + + + + + 自定义附加信息Id扩展 + + + + + 自定义附加信息长度 + 四个字节 diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200.cs index 3beebaf..60401bd 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0200.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200.cs @@ -5,6 +5,7 @@ using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; +using System.Buffers.Binary; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -62,13 +63,9 @@ namespace JT808.Protocol.MessageBody /// public DateTime GPSTime { get; set; } /// - /// 位置附加信息 + /// 基础位置附加信息 /// - public Dictionary JT808LocationAttachData { get; set; } - /// - /// 存储未知的附加信息源数据 - /// - public Dictionary JT808UnknownLocationAttachOriginalData { get; set; } + public Dictionary BasicLocationAttachData { get; set; } /// /// 自定义位置附加信息 /// 场景: @@ -79,33 +76,30 @@ namespace JT808.Protocol.MessageBody /// 缺点: /// 依赖平台录入的设备类型 /// - public Dictionary JT808CustomLocationAttachData { get; set; } + public Dictionary CustomLocationAttachData { get; set; } /// - /// 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 - /// 形如: - /// 00 0C 这个是长度 - /// 00 B2 这个是长度 - /// 实际解析 - /// 00 附加信息Id - /// 0C 附加信息长度 - /// 00 附加信息Id - /// B2 附加信息长度 - /// 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 + /// 自定义位置附加信息2 /// - public List ExceptionLocationAttachOriginalData { get; set; } + public Dictionary CustomLocationAttachData2 { get; set; } + /// + /// 自定义位置附加信息3 + /// + public Dictionary CustomLocationAttachData3 { get; set; } /// - /// 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 - /// 形如: - /// 00 0C 这个是长度 - /// 00 B2 这个是长度 - /// 实际解析 - /// 00 附加信息Id - /// 0C 附加信息长度 - /// 00 附加信息Id - /// B2 附加信息长度 - /// 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 + /// 自定义位置附加信息4 /// - public List ExceptionLocationAttachData { get; set; } + public Dictionary CustomLocationAttachData4 { get; set; } + /// + /// 未知自定义附加数据【一切都是为了尽可能兼容】 + /// 形如:自定义_附加Id字节数_附加数据长度_附加Id + /// 注意:这边不是最好的解决方式,最好的方式就是通过已知的自定义协议附加,根据提供的文档进行组织后在注册。 + /// 这边采用优先1-1的,然后是绝大多数设备厂家有2-1,少部分是2-2,最后是1_4。 + /// + public Dictionary UnknownLocationAttachData { get; set; } + /// + /// 设备未知自定义附加数据(未注册)、数据解析异常 + /// + public List ExceptionLocationAttachOriginalData { get; set; } /// /// /// @@ -138,88 +132,145 @@ namespace JT808.Protocol.MessageBody jT808_0X0200.Direction = reader.ReadUInt16(); jT808_0X0200.GPSTime = reader.ReadDateTime6(); // 位置附加信息 - jT808_0X0200.JT808LocationAttachData = new Dictionary(); - jT808_0X0200.JT808CustomLocationAttachData = new Dictionary(); - jT808_0X0200.JT808UnknownLocationAttachOriginalData = new Dictionary(); + jT808_0X0200.BasicLocationAttachData = new Dictionary(); + jT808_0X0200.CustomLocationAttachData = new Dictionary(); + jT808_0X0200.CustomLocationAttachData2 = new Dictionary(); + jT808_0X0200.CustomLocationAttachData3 = new Dictionary(); + jT808_0X0200.CustomLocationAttachData4 = new Dictionary(); jT808_0X0200.ExceptionLocationAttachOriginalData = new List(); - jT808_0X0200.ExceptionLocationAttachData = new List(); + jT808_0X0200.UnknownLocationAttachData = new Dictionary(); while (reader.ReadCurrentRemainContentLength() > 0) { try { - ReadOnlySpan attachSpan = reader.GetVirtualReadOnlySpan(2); - byte attachId = attachSpan[0]; - byte attachLen = attachSpan[1]; - if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object jT808LocationAttachInstance)) + //正常自定义注册、正常数据解析,不支持国标乱序组包 + //优先国标组包->自定义附加数据注册->未知/异常数据 + //注意:最坏的是自定义的跟基础标准的附加信息Id冲突了,那么优先使用标准的进行解析 + //基础标准附加Id、自定义标准附加Id、自定义标准附加Id 4 + byte attachId = reader.ReadVirtualByte(); + //自定义标准附加Id2、自定义标准附加Id3 + ushort attachId2_3 = reader.ReadVirtualUInt16(); + if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object attachInstance)) { - if (jT808_0X0200.JT808LocationAttachData.ContainsKey(attachId)) + if (jT808_0X0200.BasicLocationAttachData.ContainsKey(attachId)) { //存在重复的就不解析,把数据统一放在异常定位数据里面 - reader.Skip(2); + reader.Skip(1); + byte attachLen = reader.ReadByte(); jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); reader.Skip(attachLen); } else { - dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(jT808LocationAttachInstance, ref reader, config); - jT808_0X0200.JT808LocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachInstance, ref reader, config); + jT808_0X0200.BasicLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); } } - else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId,out object customAttachInstance)) + else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance)) { - if (jT808_0X0200.JT808CustomLocationAttachData.ContainsKey(attachId)) + if (jT808_0X0200.CustomLocationAttachData.ContainsKey(attachId)) { - //目前根据坑爹的协议只做了附加Id相同的情况下,长度不同的解析方式。 - //在已知的情况:附加Id相同,但是长度不同的时候,只能当做用长度来识别是对应的哪个,然后把数据剩下一个放在异常附加数据里面 - dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config); - jT808_0X0200.ExceptionLocationAttachData.Add(attachImpl); + reader.Skip(1); + byte attachLen = reader.ReadByte(); + jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); + reader.Skip(attachLen); } else { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config); - jT808_0X0200.JT808CustomLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); + jT808_0X0200.CustomLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); + } + } + else if (config.JT808_0X0200_Custom_Factory.Map2.TryGetValue(attachId2_3, out object customAttachInstance2)) + { + if (jT808_0X0200.CustomLocationAttachData2.ContainsKey(attachId2_3)) + { + reader.Skip(2); + byte attachLen = reader.ReadByte(); + jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 3, attachLen + 3).ToArray()); + reader.Skip(attachLen); + } + else + { + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance2, ref reader, config); + jT808_0X0200.CustomLocationAttachData2.Add(attachImpl.AttachInfoId, attachImpl); + } + } + else if (config.JT808_0X0200_Custom_Factory.Map4.TryGetValue(attachId, out object customAttachInstance4)) + { + if (jT808_0X0200.CustomLocationAttachData4.ContainsKey(attachId)) + { + reader.Skip(1); + int attachLen = reader.ReadInt32(); + jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 5, attachLen + 5).ToArray()); + reader.Skip(attachLen); + } + else + { + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance4, ref reader, config); + jT808_0X0200.CustomLocationAttachData4.Add(attachImpl.AttachInfoId, attachImpl); + } + } + else if (config.JT808_0X0200_Custom_Factory.Map3.TryGetValue(attachId2_3, out object customAttachInstance3)) + { + if (jT808_0X0200.CustomLocationAttachData3.ContainsKey(attachId2_3)) + { + reader.Skip(2); + ushort attachLen = reader.ReadUInt16(); + jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 4, attachLen + 4).ToArray()); + reader.Skip(attachLen); + } + else + { + dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance3, ref reader, config); + jT808_0X0200.CustomLocationAttachData3.Add(attachImpl.AttachInfoId, attachImpl); } } else { - reader.Skip(2); - if (jT808_0X0200.JT808UnknownLocationAttachOriginalData.ContainsKey(attachId)) + //未知的附加只通过标准的自定义附加信息来解析,其余的通过自己注册,自己实现的方式来解析 + reader.Skip(1); + byte attachLen = reader.ReadByte(); + int remainLength = reader.ReadCurrentRemainContentLength(); + if(remainLength < attachLen) { - //未知的情况下:存在重复的就不解析,把数据统一放在异常定位数据里面 - jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); + jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(remainLength).ToArray()); } else { - jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); + if (jT808_0X0200.UnknownLocationAttachData.ContainsKey(attachId)) + { + //存在重复的就不解析,把数据统一放在异常定位数据里面 + jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); + } + else + { + jT808_0X0200.UnknownLocationAttachData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); + } + reader.Skip(attachLen); } - reader.Skip(attachLen); } } catch { try { - byte attachId = reader.ReadByte(); - byte attachLen = reader.ReadByte(); - if (jT808_0X0200.JT808UnknownLocationAttachOriginalData.ContainsKey(attachId)) - { - //未知的情况下:存在重复的就不解析,把数据统一放在异常定位数据里面 - jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); - } - else + var remainLength = reader.ReadCurrentRemainContentLength(); + if (remainLength > 0) { - jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); + jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(remainLength).ToArray()); + break; } - reader.Skip(attachLen); } catch (Exception ex) { - throw; + break; } } } return jT808_0X0200; } + /// /// /// @@ -263,9 +314,9 @@ namespace JT808.Protocol.MessageBody writer.WriteUInt16(value.Speed); writer.WriteUInt16(value.Direction); writer.WriteDateTime6(value.GPSTime); - if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0) + if (value.BasicLocationAttachData != null && value.BasicLocationAttachData.Count > 0) { - foreach (var item in value.JT808LocationAttachData) + foreach (var item in value.BasicLocationAttachData) { try { @@ -277,18 +328,52 @@ namespace JT808.Protocol.MessageBody } } } - if (value.JT808CustomLocationAttachData != null && value.JT808CustomLocationAttachData.Count > 0) + if (value.CustomLocationAttachData != null && value.CustomLocationAttachData.Count > 0) { - foreach (var item in value.JT808CustomLocationAttachData) + foreach (var item in value.CustomLocationAttachData) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); } } - if (value.ExceptionLocationAttachData != null && value.ExceptionLocationAttachData.Count > 0) + if (value.CustomLocationAttachData2 != null && value.CustomLocationAttachData2.Count > 0) + { + foreach (var item in value.CustomLocationAttachData2) + { + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); + } + } + if (value.CustomLocationAttachData3 != null && value.CustomLocationAttachData3.Count > 0) + { + foreach (var item in value.CustomLocationAttachData3) + { + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); + } + } + if (value.CustomLocationAttachData4 != null && value.CustomLocationAttachData4.Count > 0) + { + foreach (var item in value.CustomLocationAttachData4) + { + JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); + } + } + if (value.UnknownLocationAttachData!=null && value.UnknownLocationAttachData.Count > 0) + { + foreach (var item in value.UnknownLocationAttachData) + { + if(item.Value!=null && item.Value.Length >= 2) + { + writer.WriteArray(item.Value); + } + } + } + if (value.ExceptionLocationAttachOriginalData != null && value.ExceptionLocationAttachOriginalData.Count > 0) { - foreach (var item in value.ExceptionLocationAttachData) + foreach (var item in value.ExceptionLocationAttachOriginalData) { - JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); + if (item != null && item.Length >= 2) + { + writer.WriteArray(item); + } } } } @@ -430,57 +515,168 @@ namespace JT808.Protocol.MessageBody value.GPSTime = reader.ReadDateTime6(); writer.WriteString($"[{value.GPSTime:yyMMddHHmmss}]定位时间", value.GPSTime.ToString("yyyy-MM-dd HH:mm:ss")); // 位置附加信息 + value.BasicLocationAttachData = new Dictionary(); + value.CustomLocationAttachData = new Dictionary(); + value.CustomLocationAttachData2 = new Dictionary(); + value.CustomLocationAttachData3 = new Dictionary(); + value.CustomLocationAttachData4 = new Dictionary(); + value.ExceptionLocationAttachOriginalData = new List(); writer.WriteStartArray("附加信息列表"); while (reader.ReadCurrentRemainContentLength() > 0) { try { - ReadOnlySpan attachSpan = reader.GetVirtualReadOnlySpan(2); - byte attachId = attachSpan[0]; - byte attachLen = attachSpan[1]; - if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object jT808LocationAttachInstance)) + //正常自定义注册、正常数据解析,不支持国标乱序组包 + //优先国标组包->自定义附加数据注册->异常数据 + //注意:最坏的是自定义的跟基础标准的附加信息Id冲突了,那么优先使用标准的进行解析 + //基础标准附加Id、自定义标准附加Id、自定义标准附加Id 4 + byte attachId = reader.ReadVirtualByte(); + //自定义标准附加Id2、自定义标准附加Id3 + ushort attachId2_3 = reader.ReadVirtualUInt16(); + if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object attachInstance)) { - writer.WriteStartObject(); - jT808LocationAttachInstance.Analyze(ref reader, writer, config); - writer.WriteEndObject(); + if (value.BasicLocationAttachData.ContainsKey(attachId)) + { + //存在重复的就不解析,把数据统一放在异常定位数据里面 + reader.Skip(1); + byte attachLen = reader.ReadByte(); + writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); + writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); + writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); + reader.Skip(attachLen); + } + else + { + writer.WriteStartObject(); + attachInstance.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + value.BasicLocationAttachData.Add(attachId, null); + } } else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance)) { - writer.WriteStartObject(); - customAttachInstance.Analyze(ref reader, writer, config); - writer.WriteEndObject(); + if (value.CustomLocationAttachData.ContainsKey(attachId)) + { + reader.Skip(1); + byte attachLen = reader.ReadByte(); + writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); + writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); + writer.WriteString($"未知附加信息_{attachId}", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); + reader.Skip(attachLen); + } + else + { + writer.WriteStartObject(); + customAttachInstance.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + value.CustomLocationAttachData.Add(attachId, null); + } + } + else if (config.JT808_0X0200_Custom_Factory.Map4.TryGetValue(attachId, out object customAttachInstance4)) + { + if (value.CustomLocationAttachData4.ContainsKey(attachId)) + { + reader.Skip(1); + int attachLen = reader.ReadInt32(); + writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); + writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); + writer.WriteString($"未知附加信息1_4_{attachId}", reader.ReadArray(reader.ReaderCount - 5, attachLen + 5).ToArray().ToHexString()); + reader.Skip(attachLen); + } + else + { + writer.WriteStartObject(); + customAttachInstance4.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + value.CustomLocationAttachData4.Add(attachId, null); + } + } + else if (config.JT808_0X0200_Custom_Factory.Map2.TryGetValue(attachId2_3, out object customAttachInstance2)) + { + if (value.CustomLocationAttachData2.ContainsKey(attachId2_3)) + { + reader.Skip(2); + byte attachLen = reader.ReadByte(); + writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); + writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); + writer.WriteString($"未知附加信息2_1", reader.ReadArray(reader.ReaderCount - 3, attachLen + 3).ToArray().ToHexString()); + reader.Skip(attachLen); + } + else + { + writer.WriteStartObject(); + customAttachInstance2.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + value.CustomLocationAttachData2.Add(attachId2_3, null); + } + } + else if (config.JT808_0X0200_Custom_Factory.Map3.TryGetValue(attachId2_3, out object customAttachInstance3)) + { + if (value.CustomLocationAttachData3.ContainsKey(attachId2_3)) + { + reader.Skip(2); + ushort attachLen = reader.ReadUInt16(); + writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); + writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); + writer.WriteString($"未知附加信息2_2_{attachId}", reader.ReadArray(reader.ReaderCount - 4, attachLen + 4).ToArray().ToHexString()); + reader.Skip(attachLen); + } + else + { + writer.WriteStartObject(); + customAttachInstance3.Analyze(ref reader, writer, config); + writer.WriteEndObject(); + value.CustomLocationAttachData3.Add(attachId2_3, null); + } } else { + //未知的附加只通过标准的自定义附加信息来解析,其余的通过自己注册,自己实现的方式来解析 + reader.Skip(1); + byte attachLen = reader.ReadByte(); + int remainLength = reader.ReadCurrentRemainContentLength(); writer.WriteStartObject(); - reader.Skip(2); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); - writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); - reader.Skip(attachLen); + if ((attachLen+2) > remainLength) + { + writer.WriteString($"未知附加信息", reader.ReadArray(remainLength).ToArray().ToHexString()); + } + else + { + writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); + reader.Skip(attachLen); + } writer.WriteEndObject(); } } - catch + catch (Exception ex) { writer.WriteStartObject(); + writer.WriteString($"解析外部部未知附加信息报错", ex.StackTrace); try { - byte attachId = reader.ReadByte(); - byte attachLen = reader.ReadByte(); - writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); - writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); - writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); - reader.Skip(attachLen); + var remainLength = reader.ReadCurrentRemainContentLength(); + if (remainLength > 0) + { + writer.WriteString($"未知附加信息", reader.ReadArray(remainLength).ToArray().ToHexString()); + } + else + { + writer.WriteStartObject(); + writer.WriteString($"未知附加信息", "无"); + writer.WriteEndObject(); + } } - catch + catch (Exception innerEx) { - throw; + writer.WriteString($"解析内部未知附加信息报错", innerEx.StackTrace); } finally { writer.WriteEndObject(); } + break; } } writer.WriteEndArray(); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_0x25.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_0x25.cs index 4dc69a5..fd98328 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0200_0x25.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_0x25.cs @@ -44,21 +44,21 @@ namespace JT808.Protocol.MessageBody var carSignalStatus = Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0').AsSpan(); writer.WriteString("值", Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0')); writer.WriteString("bit15~31", "保留"); - writer.WriteString("bit14", (value.CarSignalStatus & 16384) == 16384 ? "离合器状态" : "无"); - writer.WriteString("bit13", (value.CarSignalStatus & 8192) == 8192 ? "加热器工作" : "无"); - writer.WriteString("bit12", (value.CarSignalStatus & 4096) == 4096 ? "ABS工作" : "无"); - writer.WriteString("bit11", (value.CarSignalStatus & 2048) == 2048 ? "缓速器工作" : "无"); - writer.WriteString("bit10", (value.CarSignalStatus & 1024) == 1024 ? "空挡信号" : "无"); - writer.WriteString("bit9", (value.CarSignalStatus & 512) == 512 ? "空调状态" : "无"); - writer.WriteString("bit8", (value.CarSignalStatus & 256) == 256 ? "喇叭信号" : "无"); - writer.WriteString("bit7", (value.CarSignalStatus & 128) == 128 ? "示廓灯" : "无"); - writer.WriteString("bit6", (value.CarSignalStatus & 64) == 64 ? "雾灯信号" : "无"); - writer.WriteString("bit5", (value.CarSignalStatus & 32) == 32 ? "倒档信号" : "无"); - writer.WriteString("bit4", (value.CarSignalStatus & 16) == 16 ? "制动信号" : "无"); - writer.WriteString("bit3", (value.CarSignalStatus & 8) == 8 ? "左转向灯信号" : "无"); - writer.WriteString("bit2", (value.CarSignalStatus & 4) == 4 ? "右转向灯信号" : "无"); - writer.WriteString("bit1", (value.CarSignalStatus & 2) == 2 ? "远光灯信号" : "无"); - writer.WriteString("bit0", (value.CarSignalStatus & 1) ==1?"近光灯信号":"无"); + writer.WriteString("bit14-离合器状态", (value.CarSignalStatus & 16384) == 16384 ? "离合器状态" : "无"); + writer.WriteString("bit13-加热器工作", (value.CarSignalStatus & 8192) == 8192 ? "加热器工作" : "无"); + writer.WriteString("bit12-ABS工作", (value.CarSignalStatus & 4096) == 4096 ? "ABS工作" : "无"); + writer.WriteString("bit11-缓速器工作", (value.CarSignalStatus & 2048) == 2048 ? "缓速器工作" : "无"); + writer.WriteString("bit10-空挡信号", (value.CarSignalStatus & 1024) == 1024 ? "空挡信号" : "无"); + writer.WriteString("bit9-空调状态", (value.CarSignalStatus & 512) == 512 ? "空调状态" : "无"); + writer.WriteString("bit8-喇叭信号", (value.CarSignalStatus & 256) == 256 ? "喇叭信号" : "无"); + writer.WriteString("bit7-示廓灯", (value.CarSignalStatus & 128) == 128 ? "示廓灯" : "无"); + writer.WriteString("bit6-雾灯信号", (value.CarSignalStatus & 64) == 64 ? "雾灯信号" : "无"); + writer.WriteString("bit5-倒档信号", (value.CarSignalStatus & 32) == 32 ? "倒档信号" : "无"); + writer.WriteString("bit4-制动信号", (value.CarSignalStatus & 16) == 16 ? "制动信号" : "无"); + writer.WriteString("bit3-左转向灯信号", (value.CarSignalStatus & 8) == 8 ? "左转向灯信号" : "无"); + writer.WriteString("bit2-右转向灯信号", (value.CarSignalStatus & 4) == 4 ? "右转向灯信号" : "无"); + writer.WriteString("bit1-远光灯信号", (value.CarSignalStatus & 2) == 2 ? "远光灯信号" : "无"); + writer.WriteString("bit0-近光灯信号", (value.CarSignalStatus & 1) ==1?"近光灯信号":"无"); writer.WriteEndObject(); } /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase.cs index e815fb8..c6dfe9a 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase.cs @@ -11,16 +11,10 @@ namespace JT808.Protocol.MessageBody /// 自定义附加信息Id /// public abstract byte AttachInfoId { get; set; } - + /// /// 自定义附加信息长度 /// public abstract byte AttachInfoLength { get; set; } - /// - /// 附加信息长度扩展 - /// 4个字节 - /// 注意:只适用于已知的协议才行 - /// - public virtual uint AttachInfoLengthExtend { get; set; } } } diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase2.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase2.cs new file mode 100644 index 0000000..8ae2a6d --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase2.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 自定义位置附加信息 + /// + public abstract class JT808_0x0200_CustomBodyBase2 + { + /// + /// 自定义附加信息Id扩展 + /// 两个字节 + /// + public abstract ushort AttachInfoId { get; set; } + /// + /// 自定义附加信息长度 + /// + public abstract byte AttachInfoLength { get; set; } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase3.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase3.cs new file mode 100644 index 0000000..bac4cac --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase3.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 自定义位置附加信息 + /// + public abstract class JT808_0x0200_CustomBodyBase3 + { + /// + /// 自定义附加信息Id扩展 + /// 两个字节 + /// + public abstract ushort AttachInfoId { get; set; } + /// + /// 自定义附加信息长度 + /// 两个字节 + /// + public abstract ushort AttachInfoLength { get; set; } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase4.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase4.cs new file mode 100644 index 0000000..d936633 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase4.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 自定义位置附加信息 + /// + public abstract class JT808_0x0200_CustomBodyBase4 + { + /// + /// 自定义附加信息Id扩展 + /// + public abstract byte AttachInfoId { get; set; } + /// + /// 自定义附加信息长度 + /// 四个字节 + /// + public abstract uint AttachInfoLength { get; set; } + } +}