@@ -74,14 +74,14 @@ jT808_0x0200.Lng = 132444444; | |||||
jT808_0x0200.Speed = 60; | jT808_0x0200.Speed = 60; | ||||
jT808_0x0200.Direction = 0; | jT808_0x0200.Direction = 0; | ||||
jT808_0x0200.StatusFlag = 2; | jT808_0x0200.StatusFlag = 2; | ||||
jT808_0x0200.JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808_0x0200.BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
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 | 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 | Oil = 125 | ||||
}); | }); | ||||
@@ -162,9 +162,9 @@ Assert.Equal(60, jT808_0x0200.Speed); | |||||
Assert.Equal(0, jT808_0x0200.Direction); | Assert.Equal(0, jT808_0x0200.Direction); | ||||
Assert.Equal((uint)2, jT808_0x0200.StatusFlag); | Assert.Equal((uint)2, jT808_0x0200.StatusFlag); | ||||
//4.1.附加信息1 | //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 | //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 | ### 举个栗子2 | ||||
@@ -181,7 +181,7 @@ JT808Package jT808Package = Enums.JT808MsgId.位置信息汇报.Create("12345678 | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808LocationAttachBase> | |||||
BasicLocationAttachData = new Dictionary<byte, JT808LocationAttachBase> | |||||
{ | { | ||||
{ JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}}, | { JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}}, | ||||
{ JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}} | { JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}} | ||||
@@ -293,11 +293,26 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); | |||||
### 举个栗子10 | ### 举个栗子10 | ||||
场景: | |||||
场景1: | |||||
有些设备,不会按照国标的附加信息Id来搞,把附加信息Id搞为两个字节,这样在上报上来的数据就会存在重复的附加Id,导致平台解析出错。 | 有些设备,不会按照国标的附加信息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) | [可以参考Simples的Demo10](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo10.cs) | ||||
>注意:默认都是以**标准**的去解析,要是出现未知的附加,不一定解析就是正确,最好还是需要依照协议文档去开发然后自行注册解析器去解析。 | |||||
### 举个栗子11 | ### 举个栗子11 | ||||
场景: | 场景: | ||||
@@ -308,39 +323,30 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); | |||||
### 举个栗子12 | ### 举个栗子12 | ||||
场景: | 场景: | ||||
由于粤标的设备厂家自定义的附加信息长度可以为四4个字节的,所以需要兼容。 | |||||
由于粤标的设备把2019版本的0x8105终端控制消息命令参数做了扩展,所以需要兼容。 | |||||
[可以参考Simples的Demo12](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo12.cs) | [可以参考Simples的Demo12](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo12.cs) | ||||
>注意:只适用于已知的设备厂家协议才行 | |||||
### 举个栗子13 | ### 举个栗子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 | ### 举个栗子14 | ||||
场景: | 场景: | ||||
由于协议库本身可能存在消息解析出错的情况,要么就提PR上来,但是不一定会及时发布,这时候就需要自己把原有的消息解析复制出来,改造好,然后重新注册。 | |||||
由于某些厂商不按要求去做,明明使用的2013的协议但是在消息头部的版本标识位置为1,导致程序认为是2019协议。从而解析报错。此时可以强制解析成2013后,然后修正版本标识,重新序列化消息,以供下游服务使用 | |||||
[可以参考Simples的Demo14](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo14.cs) | [可以参考Simples的Demo14](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo14.cs) | ||||
### 举个栗子15 | ### 举个栗子15 | ||||
场景: | |||||
由于某些厂商不按要求去做,明明使用的2013的协议但是在消息头部的版本标识位置为1,导致程序认为是2019协议。从而解析报错。此时可以强制解析成2013后,然后修正版本标识,重新序列化消息,以供下游服务使用 | |||||
[可以参考Simples的Demo15](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo15.cs) | |||||
### 举个栗子16 | |||||
场景: | 场景: | ||||
兼容2011协议的注册消息 | 兼容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安装 | ## NuGet安装 | ||||
@@ -57,57 +57,57 @@ namespace JT808.Protocol.Benchmark | |||||
jT808UploadLocationRequest.Speed = 60; | jT808UploadLocationRequest.Speed = 60; | ||||
jT808UploadLocationRequest.Direction = 0; | jT808UploadLocationRequest.Direction = 0; | ||||
jT808UploadLocationRequest.StatusFlag = 2; | jT808UploadLocationRequest.StatusFlag = 2; | ||||
jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | 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 | 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 | 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, | AreaId=1, | ||||
JT808PositionType= Enums.JT808PositionType.圆形区域 | 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, | AreaId = 1, | ||||
JT808PositionType = Enums.JT808PositionType.圆形区域, | JT808PositionType = Enums.JT808PositionType.圆形区域, | ||||
Direction= Enums.JT808DirectionType.出 | 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.过长, | DrivenRoute= Enums.JT808DrivenRouteType.过长, | ||||
DrivenRouteId=2, | DrivenRouteId=2, | ||||
Time=34 | 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 | 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 | 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 | 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 | 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 | GNSSCount=0x05 | ||||
}); | }); | ||||
@@ -35,25 +35,25 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x14, new JT808_0x0200_0x14 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x14, new JT808_0x0200_0x14 | |||||
{ | { | ||||
VideoRelateAlarm = 100 | VideoRelateAlarm = 100 | ||||
}); | }); | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x15, new JT808_0x0200_0x15 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x15, new JT808_0x0200_0x15 | |||||
{ | { | ||||
VideoSignalLoseAlarmStatus = 100 | VideoSignalLoseAlarmStatus = 100 | ||||
}); | }); | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x16, new JT808_0x0200_0x16 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x16, new JT808_0x0200_0x16 | |||||
{ | { | ||||
VideoSignalOcclusionAlarmStatus = 100 | VideoSignalOcclusionAlarmStatus = 100 | ||||
}); | }); | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x17, new JT808_0x0200_0x17 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x17, new JT808_0x0200_0x17 | |||||
{ | { | ||||
StorageFaultAlarmStatus = 100 | StorageFaultAlarmStatus = 100 | ||||
}); | }); | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x18, new JT808_0x0200_0x18 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x18, new JT808_0x0200_0x18 | |||||
{ | { | ||||
AbnormalDrivingBehaviorAlarmType = 100, | AbnormalDrivingBehaviorAlarmType = 100, | ||||
FatigueLevel = 88 | FatigueLevel = 88 | ||||
@@ -73,12 +73,12 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | ||||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | Assert.Equal(60, jT808UploadLocationRequest.Speed); | ||||
Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); | 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] | [Fact] | ||||
@@ -36,9 +36,9 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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.其他视频设备故障报警) | VideoRelateAlarm = (uint)(VideoRelateAlarmType.视频信号遮挡报警 | VideoRelateAlarmType.其他视频设备故障报警) | ||||
}); | }); | ||||
@@ -57,7 +57,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | ||||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | Assert.Equal(60, jT808UploadLocationRequest.Speed); | ||||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | 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] | [Fact] | ||||
@@ -80,9 +80,9 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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 | VideoSignalLoseAlarmStatus=3 | ||||
}); | }); | ||||
@@ -101,7 +101,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | ||||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | Assert.Equal(60, jT808UploadLocationRequest.Speed); | ||||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | 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] | [Fact] | ||||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -66,7 +66,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C00001807151010106420000000010C0605120A0B100F1100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x64 jT808_0X0200_0X64 = value as JT808_0x0200_0x64; | ||||
Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); | ||||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -63,7 +63,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C00001807151010106520000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x65 jT808_0X0200_0X65 = value as JT808_0x0200_0x65; | ||||
Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); | ||||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -77,7 +77,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C0000180715101010663B000000010C1100070000000D0000000E191211183100001334343434343434191210183100030200020400010003000500020900060008000A0007".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x66 jT808_0X0200_0X66 = value as JT808_0x0200_0x66; | ||||
Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); | ||||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -61,7 +61,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C0000180715101010672A000000010C09081100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x67 jT808_0X0200_0X67 = value as JT808_0x0200_0x67; | ||||
Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); | ||||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -67,7 +67,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C00001807151010106447000000010C0605120A0B100F1100070000000D0000000E191211183100001334343434343434000000000000000000000000000000000000000000000019121018310003020506".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x64 jT808_0X0200_0X64 = value as JT808_0x0200_0x64; | ||||
Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); | ||||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -64,7 +64,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C00001807151010106547000000010C060512010203041100070000000D0000000E191211183100001334343434343434000000000000000000000000000000000000000000000019121018310003020506".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x65 jT808_0X0200_0X65 = value as JT808_0x0200_0x65; | ||||
Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); | ||||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -78,7 +78,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C00001807151010106655000000010C1100070000000D0000000E1912111831000013343434343434340000000000000000000000000000000000000000000000191210183100030205060200040001000300050002000900060008000A0007".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x66 jT808_0X0200_0X66 = value as JT808_0x0200_0x66; | ||||
Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); | ||||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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, | AlarmId = 1, | ||||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | AlarmIdentification = new Metadata.AlarmIdentificationProperty | ||||
@@ -61,7 +61,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||||
public void Deserialize() | public void Deserialize() | ||||
{ | { | ||||
var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C00001807151010106741000000010C091100070000000D0000000E191211183100001334343434343434000000000000000000000000000000000000000000000019121018310003020506".ToHexBytes()); | var jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>("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; | JT808_0x0200_0x67 jT808_0X0200_0X67 = value as JT808_0x0200_0x67; | ||||
Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); | Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); | ||||
Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); | Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); | ||||
@@ -33,7 +33,6 @@ | |||||
<Compile Include="Extensions\JT808HexExtensionsTest.cs" /> | <Compile Include="Extensions\JT808HexExtensionsTest.cs" /> | ||||
<Compile Include="Extensions\JT808PackageExtensionsTest.cs" /> | <Compile Include="Extensions\JT808PackageExtensionsTest.cs" /> | ||||
<Compile Include="Extensions\JT808ValidationExtensionsTest.cs" /> | <Compile Include="Extensions\JT808ValidationExtensionsTest.cs" /> | ||||
<Compile Include="MessageBody\JT808LocationAttachExtensions\JT808LocationAttachImpl0x62.cs" /> | |||||
<Compile Include="MessageBody\JT808LocationAttachExtensions\JT808LocationAttachImpl0x61.cs" /> | <Compile Include="MessageBody\JT808LocationAttachExtensions\JT808LocationAttachImpl0x61.cs" /> | ||||
<Compile Include="MessageBody\JT808_0x0001Test.cs" /> | <Compile Include="MessageBody\JT808_0x0001Test.cs" /> | ||||
<Compile Include="MessageBody\JT808_0x0002Test.cs" /> | <Compile Include="MessageBody\JT808_0x0002Test.cs" /> | ||||
@@ -1,34 +0,0 @@ | |||||
using JT808.Protocol.Formatters; | |||||
using JT808.Protocol.MessageBody; | |||||
using JT808.Protocol.MessagePack; | |||||
namespace JT808.Protocol.Test.JT808LocationAttach | |||||
{ | |||||
/// <summary> | |||||
/// 自定义附加信息 | |||||
/// data-byte[]-256 | |||||
/// </summary> | |||||
public class JT808LocationAttachImpl0x62 : JT808_0x0200_CustomBodyBase, IJT808MessagePackFormatter<JT808LocationAttachImpl0x62> | |||||
{ | |||||
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); | |||||
} | |||||
} | |||||
} |
@@ -43,13 +43,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | Oil = 55 | ||||
}); | }); | ||||
@@ -83,13 +83,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | Oil = 55 | ||||
}); | }); | ||||
@@ -139,8 +139,8 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | ||||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | Assert.Equal(60, jT808UploadLocationRequest.Speed); | ||||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | 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] | [Fact] | ||||
@@ -181,18 +181,18 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(), | |||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(), | |||||
CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | Oil = 55 | ||||
}); | }); | ||||
jT808UploadLocationRequest.JT808CustomLocationAttachData.Add(0x61, new JT808LocationAttachImpl0x61 | |||||
jT808UploadLocationRequest.CustomLocationAttachData.Add(0x61, new JT808LocationAttachImpl0x61 | |||||
{ | { | ||||
Age = 18, | Age = 18, | ||||
Gender = 1, | Gender = 1, | ||||
@@ -214,9 +214,9 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | ||||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | Assert.Equal(60, jT808UploadLocationRequest.Speed); | ||||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | 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(18, jT808LocationAttachImpl0x61.Age); | ||||
Assert.Equal(1, jT808LocationAttachImpl0x61.Gender); | Assert.Equal(1, jT808LocationAttachImpl0x61.Gender); | ||||
Assert.Equal("smallchi", jT808LocationAttachImpl0x61.UserName); | Assert.Equal("smallchi", jT808LocationAttachImpl0x61.UserName); | ||||
@@ -243,13 +243,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | Oil = 55 | ||||
}); | }); | ||||
@@ -306,8 +306,8 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | ||||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | Assert.Equal(60, jT808UploadLocationRequest.Speed); | ||||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | 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] | [Fact] | ||||
public void Test5_3() | public void Test5_3() | ||||
@@ -337,13 +337,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 1002222, | StatusFlag = 1002222, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | Oil = 55 | ||||
}); | }); | ||||
@@ -372,7 +372,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
// "[0B290B29]模拟量": 187239209 | // "[0B290B29]模拟量": 187239209 | ||||
// }, | // }, | ||||
// { | // { | ||||
// "[30]附加信息Id": 48, | |||||
// "[30]附加信息Id": 48, | |||||
// "[01]附加信息长度": 1, | // "[01]附加信息长度": 1, | ||||
// "[17]无线通信网络信号强度": 23 | // "[17]无线通信网络信号强度": 23 | ||||
// }, | // }, | ||||
@@ -389,15 +389,15 @@ namespace JT808.Protocol.Test.MessageBody | |||||
// { | // { | ||||
// "[00]未知附加信息Id": 0, 坑爹,相同的 | // "[00]未知附加信息Id": 0, 坑爹,相同的 | ||||
// "[0C]未知附加信息长度": 12, | // "[0C]未知附加信息长度": 12, | ||||
// "未知附加信息": "000C00B289860620150013559848" | |||||
// "未知附加信息": "000C00B222222222222222222222" | |||||
// }, | // }, | ||||
// { | // { | ||||
// "[EB]未知附加信息Id": 235, | // "[EB]未知附加信息Id": 235, | ||||
// "[0E]未知附加信息长度": 14, | // "[0E]未知附加信息长度": 14, | ||||
// "未知附加信息": "EB0E000C00B289860620150013559848" | |||||
// "未知附加信息": "EB0E000C00B222222222222222222222" | |||||
// } | // } | ||||
//] | //] | ||||
byte[] bodys = "7E020000520111111111100002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B289860620150013559848EB0E000C00B2898606201500135598486C7E".ToHexBytes(); | |||||
byte[] bodys = "7E020000520111111111100002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B222222222222222222222EB0E000C00B2222222222222222222226C7E".ToHexBytes(); | |||||
var package = JT808Serializer1.Deserialize(bodys); | var package = JT808Serializer1.Deserialize(bodys); | ||||
JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)package.Bodies; | JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)package.Bodies; | ||||
Assert.Single(jT808UploadLocationRequest.ExceptionLocationAttachOriginalData); | Assert.Single(jT808UploadLocationRequest.ExceptionLocationAttachOriginalData); | ||||
@@ -422,57 +422,57 @@ namespace JT808.Protocol.Test.MessageBody | |||||
jT808UploadLocationRequest.Speed = 60; | jT808UploadLocationRequest.Speed = 60; | ||||
jT808UploadLocationRequest.Direction = 0; | jT808UploadLocationRequest.Direction = 0; | ||||
jT808UploadLocationRequest.StatusFlag = 2; | jT808UploadLocationRequest.StatusFlag = 2; | ||||
jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | 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 | 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 | 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, | AreaId = 1, | ||||
JT808PositionType = Enums.JT808PositionType.圆形区域 | 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, | AreaId = 1, | ||||
JT808PositionType = Enums.JT808PositionType.圆形区域, | JT808PositionType = Enums.JT808PositionType.圆形区域, | ||||
Direction = Enums.JT808DirectionType.出 | 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.过长, | DrivenRoute = Enums.JT808DrivenRouteType.过长, | ||||
DrivenRouteId = 2, | DrivenRouteId = 2, | ||||
Time = 34 | 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 | 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 | 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 | 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 | 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 | GNSSCount = 0x05 | ||||
}); | }); | ||||
@@ -553,8 +553,8 @@ namespace JT808.Protocol.Test.MessageBody | |||||
jT808UploadLocationRequest.Speed = 60; | jT808UploadLocationRequest.Speed = 60; | ||||
jT808UploadLocationRequest.Direction = 0; | jT808UploadLocationRequest.Direction = 0; | ||||
jT808UploadLocationRequest.StatusFlag = 2; | jT808UploadLocationRequest.StatusFlag = 2; | ||||
jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x07, new JT808_0x0200_0x07 | |||||
jT808UploadLocationRequest.BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x07, new JT808_0x0200_0x07 | |||||
{ | { | ||||
BeiDou=new List<JT808_0x0200_0x07.SatelliteStatusInformation>() | BeiDou=new List<JT808_0x0200_0x07.SatelliteStatusInformation>() | ||||
{ | { | ||||
@@ -638,7 +638,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
{ | { | ||||
byte[] bytes = "000000010000000200BA7F0E07E4F11C0028003C0000210528181010072C0401030002020400050305000604050006030204000503050006040500060203050006040500060104050006".ToHexBytes(); | byte[] bytes = "000000010000000200BA7F0E07E4F11C0028003C0000210528181010072C0401030002020400050305000604050006030204000503050006040500060203050006040500060104050006".ToHexBytes(); | ||||
var jT808_0X0200 = JT808Serializer.Deserialize<JT808_0x0200>(bytes); | var jT808_0X0200 = JT808Serializer.Deserialize<JT808_0x0200>(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((byte)(4 + (4 * 4 + 4 * 3 + 4 * 2 + 4)), jT808_0x0200_0x07.AttachInfoLength); | ||||
Assert.Equal(4, jT808_0x0200_0x07.BeiDou.Count); | Assert.Equal(4, jT808_0x0200_0x07.BeiDou.Count); | ||||
Assert.Equal(3, jT808_0x0200_0x07.GPS.Count); | Assert.Equal(3, jT808_0x0200_0x07.GPS.Count); | ||||
@@ -646,6 +646,112 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Single(jT808_0x0200_0x07.Galileo); | 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] | [Fact] | ||||
public void LatLngTest1_1() | public void LatLngTest1_1() | ||||
{ | { | ||||
@@ -658,7 +764,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = -132444444, | Lng = -132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 0x18000000; | jT808UploadLocationRequest.StatusFlag = 0x18000000; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -688,7 +794,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = -132444444, | Lng = -132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 0x18000000 | 0x302; | jT808UploadLocationRequest.StatusFlag = 0x18000000 | 0x302; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -718,7 +824,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = 132444444, | Lng = 132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 0x10000000; | jT808UploadLocationRequest.StatusFlag = 0x10000000; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -749,7 +855,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = 132444444, | Lng = 132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 1111; | jT808UploadLocationRequest.StatusFlag = 1111; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -768,7 +874,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = 132444444, | Lng = 132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 0x10000000 | 0x000300; | jT808UploadLocationRequest.StatusFlag = 0x10000000 | 0x000300; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -798,7 +904,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = -132444444, | Lng = -132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 0x8000000; | jT808UploadLocationRequest.StatusFlag = 0x8000000; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -829,7 +935,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = -132444444, | Lng = -132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 1111; | jT808UploadLocationRequest.StatusFlag = 1111; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -848,7 +954,7 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Lng = -132444444, | Lng = -132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.StatusFlag = 0x8000000|0x6601; | jT808UploadLocationRequest.StatusFlag = 0x8000000|0x6601; | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
@@ -35,13 +35,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
{ | { | ||||
Mileage = 100 | 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 | Oil = 55 | ||||
}); | }); | ||||
@@ -65,8 +65,8 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Equal(132444444, jT808_0X0201.Position.Lng); | Assert.Equal(132444444, jT808_0X0201.Position.Lng); | ||||
Assert.Equal(60, jT808_0X0201.Position.Speed); | Assert.Equal(60, jT808_0X0201.Position.Speed); | ||||
Assert.Equal((uint)2, jT808_0X0201.Position.StatusFlag); | 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] | [Fact] | ||||
@@ -32,13 +32,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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 | 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 | Oil = 55 | ||||
}); | }); | ||||
@@ -67,8 +67,8 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Equal(0, JT808Bodies.JT808_0x0200.Direction); | Assert.Equal(0, JT808Bodies.JT808_0x0200.Direction); | ||||
Assert.Equal(60, JT808Bodies.JT808_0x0200.Speed); | Assert.Equal(60, JT808Bodies.JT808_0x0200.Speed); | ||||
Assert.Equal((uint)2, JT808Bodies.JT808_0x0200.StatusFlag); | 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] | [Fact] | ||||
@@ -43,13 +43,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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 | 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 | Oil = 55 | ||||
}); | }); | ||||
@@ -67,13 +67,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Speed = 54, | Speed = 54, | ||||
Direction = 120, | Direction = 120, | ||||
StatusFlag = 1, | StatusFlag = 1, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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 | 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 | Oil = 66 | ||||
}); | }); | ||||
@@ -143,8 +143,8 @@ namespace JT808.Protocol.Test.MessageBody | |||||
Assert.Equal(0, JT808Bodies.Positions[0].Direction); | Assert.Equal(0, JT808Bodies.Positions[0].Direction); | ||||
Assert.Equal(60, JT808Bodies.Positions[0].Speed); | Assert.Equal(60, JT808Bodies.Positions[0].Speed); | ||||
Assert.Equal((uint)2, JT808Bodies.Positions[0].StatusFlag); | 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((uint)2, JT808Bodies.Positions[1].AlarmFlag); | ||||
Assert.Equal(DateTime.Parse("2018-07-15 10:10:30"), JT808Bodies.Positions[1].GPSTime); | 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(54, JT808Bodies.Positions[1].Speed); | ||||
Assert.Equal(120, JT808Bodies.Positions[1].Direction); | Assert.Equal(120, JT808Bodies.Positions[1].Direction); | ||||
Assert.Equal((uint)1, JT808Bodies.Positions[1].StatusFlag); | 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] | [Fact] | ||||
@@ -41,15 +41,15 @@ namespace JT808.Protocol.Test.Simples | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||||
}; | }; | ||||
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 | 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 | Oil = 125 | ||||
}); | }); | ||||
@@ -12,113 +12,622 @@ using JT808.Protocol.Formatters; | |||||
using JT808.Protocol.MessagePack; | using JT808.Protocol.MessagePack; | ||||
using System.Text.Json; | using System.Text.Json; | ||||
using JT808.Protocol.MessageBody.CarDVR; | using JT808.Protocol.MessageBody.CarDVR; | ||||
using JT808.Protocol.Test.JT808LocationAttach; | |||||
namespace JT808.Protocol.Test.Simples | namespace JT808.Protocol.Test.Simples | ||||
{ | { | ||||
/// <summary> | |||||
/// 主要测试 | |||||
/// 1:1 正常自定义附加 | |||||
/// 2:1 非正常自定义附加 | |||||
/// 2:2 非正常自定义附加 | |||||
/// 1:4 粤标自定义附加 | |||||
/// 感谢大兄弟提供的真实设备数据 | |||||
/// </summary> | |||||
public class Demo10 | public class Demo10 | ||||
{ | { | ||||
JT808Serializer JT808Serializer; | JT808Serializer JT808Serializer; | ||||
public class Demo10ConfigBase : GlobalConfigBase | |||||
{ | |||||
public override string ConfigId { get; protected set; } = "demo10Config"; | |||||
} | |||||
public Demo10() | public Demo10() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808LocationAttachImpl0x00>(); | |||||
IJT808Config jT808Config = new Demo10ConfigBase(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808LocationAttachImpl0xDF>(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap2<JT808LocationAttachImpl0xDE>(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap3<JT808LocationAttachImpl0xDD>(); | |||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap4<JT808LocationAttachImpl0x62>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
[Fact] | [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<byte, JT808_0x0200_BodyBase>(), | |||||
CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>() | |||||
}; | |||||
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<JT808Package>(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<byte, JT808_0x0200_BodyBase>(), | |||||
CustomLocationAttachData3 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase3>() | |||||
}; | |||||
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<JT808Package>(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<byte, JT808_0x0200_BodyBase>(), | |||||
CustomLocationAttachData2 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase2>() | |||||
}; | |||||
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<JT808Package>(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<byte, JT808_0x0200_BodyBase>(), | |||||
CustomLocationAttachData4 = new Dictionary<byte, JT808_0x0200_CustomBodyBase4>() | |||||
}; | |||||
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<JT808Package>(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 | JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 | ||||
{ | { | ||||
AlarmFlag = 1, | AlarmFlag = 1, | ||||
Altitude = 40, | Altitude = 40, | ||||
GPSTime = DateTime.Parse("2021-04-03 11:10:10"), | |||||
GPSTime = DateTime.Parse("2021-08-30 18:17:10"), | |||||
Lat = 12222222, | Lat = 12222222, | ||||
Lng = 132444444, | Lng = 132444444, | ||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(), | |||||
ExceptionLocationAttachData = new List<JT808_0x0200_CustomBodyBase>() | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(), | |||||
CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(), | |||||
CustomLocationAttachData2 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase2>(), | |||||
CustomLocationAttachData3 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase3>(), | |||||
CustomLocationAttachData4 = new Dictionary<byte, JT808_0x0200_CustomBodyBase4>(), | |||||
UnknownLocationAttachData = new Dictionary<ushort, byte[]>(), | |||||
ExceptionLocationAttachOriginalData = new List<byte[]>() | |||||
}; | }; | ||||
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] | [Fact] | ||||
public void Test1_1() | |||||
public void Test_Mix_2() | |||||
{ | { | ||||
byte[] bodys = "000000010000000200BA7F0E07E4F11C0028003C0000210403111010000400010203000C303132333435363738393132".ToHexBytes(); | |||||
JT808_0x0200 jT808UploadLocationRequest = JT808Serializer.Deserialize<JT808_0x0200>(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<JT808Package>(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(12222222, jT808UploadLocationRequest.Lat); | ||||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | ||||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | 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<byte, JT808_0x0200_BodyBase>(), | |||||
CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(), | |||||
CustomLocationAttachData2 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase2>(), | |||||
CustomLocationAttachData3 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase3>(), | |||||
CustomLocationAttachData4 = new Dictionary<byte, JT808_0x0200_CustomBodyBase4>(), | |||||
UnknownLocationAttachData = new Dictionary<ushort, byte[]>(), | |||||
ExceptionLocationAttachOriginalData = new List<byte[]>() | |||||
}; | |||||
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<JT808Package>(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<JT808LocationAttachImpl0x00> | |||||
/// <summary> | |||||
/// 1:1 | |||||
/// </summary> | |||||
public class JT808LocationAttachImpl0xDF : JT808_0x0200_CustomBodyBase, IJT808MessagePackFormatter<JT808LocationAttachImpl0xDF> | |||||
{ | { | ||||
/// <summary> | /// <summary> | ||||
/// 附加Id 0x00 | |||||
/// 附加Id 0xDF | |||||
/// </summary> | /// </summary> | ||||
public override byte AttachInfoId { get; set; } = 0x00; | |||||
public override byte AttachInfoId { get; set; } = 0xDF; | |||||
/// <summary> | /// <summary> | ||||
/// 不固定 | |||||
/// | |||||
/// </summary> | /// </summary> | ||||
public override byte AttachInfoLength { get; set; } | public override byte AttachInfoLength { get; set; } | ||||
/// <summary> | /// <summary> | ||||
/// 只能存在一个 AttachInfoLength == 12 | |||||
/// | |||||
/// </summary> | /// </summary> | ||||
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); | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 2:1 | |||||
/// </summary> | |||||
public class JT808LocationAttachImpl0xDE : JT808_0x0200_CustomBodyBase2, IJT808MessagePackFormatter<JT808LocationAttachImpl0xDE> | |||||
{ | |||||
/// <summary> | |||||
/// 附加Id 0xDE | |||||
/// </summary> | |||||
public override ushort AttachInfoId { get; set; } = 0xDE; | |||||
/// <summary> | |||||
/// 不固定 | |||||
/// </summary> | |||||
public override byte AttachInfoLength { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 只能存在一个 AttachInfoLength == 4 | |||||
/// | |||||
/// </summary> | /// </summary> | ||||
public byte[] TestValue { get; set; } | 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; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 2:2 | |||||
/// </summary> | |||||
public class JT808LocationAttachImpl0xDD : JT808_0x0200_CustomBodyBase3, IJT808MessagePackFormatter<JT808LocationAttachImpl0xDD> | |||||
{ | |||||
/// <summary> | |||||
/// 附加Id 0xDD | |||||
/// </summary> | |||||
public override ushort AttachInfoId { get; set; } = 0xDD; | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
public override ushort AttachInfoLength { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
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); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
/// <summary> | |||||
/// 1:4 | |||||
/// </summary> | |||||
public class JT808LocationAttachImpl0x62 : JT808_0x0200_CustomBodyBase4, IJT808MessagePackFormatter<JT808LocationAttachImpl0x62> | |||||
{ | |||||
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); | |||||
} | |||||
} | |||||
} | } |
@@ -14,6 +14,9 @@ using System.Text.Json; | |||||
using JT808.Protocol.MessageBody.CarDVR; | using JT808.Protocol.MessageBody.CarDVR; | ||||
using System.Linq; | using System.Linq; | ||||
using JT808.Protocol.Test.JT808LocationAttach; | using JT808.Protocol.Test.JT808LocationAttach; | ||||
using static JT808.Protocol.MessageBody.JT808_0x8105; | |||||
using System.Buffers.Binary; | |||||
using Newtonsoft.Json; | |||||
namespace JT808.Protocol.Test.Simples | namespace JT808.Protocol.Test.Simples | ||||
{ | { | ||||
@@ -24,73 +27,249 @@ namespace JT808.Protocol.Test.Simples | |||||
public Demo12() | public Demo12() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | IJT808Config jT808Config = new DefaultGlobalConfig(); | ||||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<JT808LocationAttachImpl0x62>(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<Koike1CommandParameter>(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<Koike2CommandParameter>(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<Koike3CommandParameter>(); | |||||
JT808Serializer = new JT808Serializer(jT808Config); | JT808Serializer = new JT808Serializer(jT808Config); | ||||
} | } | ||||
[Fact] | [Fact] | ||||
public void Test1() | 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<ICommandParameter> | |||||
{ | |||||
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<JT808Package>(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<Koike1CommandParameter>().Value.Value); | |||||
Assert.Equal("SmallChi", JT808_0x8105.CustomCommandParameters.GetCommandParameter<Koike2CommandParameter>().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<byte, JT808_0x0200_BodyBase>(), | |||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>() | |||||
}; | |||||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 | |||||
Value1 = 0xff, | |||||
Value2 = "Happy" | |||||
}, JT808_0x8105.CustomCommandParameters.GetCommandParameter<Koike3CommandParameter>().Value); | |||||
} | |||||
[Fact] | |||||
public void Test3() | |||||
{ | |||||
byte[] bytes = "7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E".ToHexBytes(); | |||||
var json = JT808Serializer.Analyze(bytes); | |||||
} | |||||
[Fact] | |||||
public void Test4() | |||||
{ | |||||
var ex= Assert.Throws<System.ArgumentException>(() => | |||||
{ | { | ||||
Mileage = 100 | |||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<ErrorCommandParameter>(); | |||||
}); | }); | ||||
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."); | |||||
} | |||||
/// <summary> | |||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// </summary> | |||||
public class Koike1CommandParameter : ICusotmCommandParameter, ICommandParameterValue<uint?> | |||||
{ | |||||
public int Order => 13; | |||||
public string CommandName => "Koike1"; | |||||
public uint? Value { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
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; | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
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); | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// </summary> | |||||
public class Koike2CommandParameter : ICusotmCommandParameter, ICommandParameterValue<string> | |||||
{ | |||||
public int Order => 14; | |||||
public string CommandName => "Koike2"; | |||||
public string Value { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public byte[] ToBytes() | |||||
{ | |||||
if (string.IsNullOrEmpty(Value)) return default; | |||||
return JT808Constants.Encoding.GetBytes(Value.PadRight(10, '\0')); | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
public void ToValue(byte[] bytes) | |||||
{ | |||||
if (bytes != null && bytes.Length > 0) | |||||
{ | |||||
Value = JT808Constants.Encoding.GetString(bytes).Trim('\0'); | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// </summary> | |||||
public class Koike3CommandParameter : ICusotmCommandParameter, ICommandParameterValue<Koike3Object> | |||||
{ | |||||
public int Order => 15; | |||||
public string CommandName => "Koike3"; | |||||
public Koike3Object Value { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public byte[] ToBytes() | |||||
{ | |||||
if (Value==null) return default; | |||||
return Value.ToBytes(); | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
public void ToValue(byte[] bytes) | |||||
{ | |||||
if (bytes != null && bytes.Length > 0) | |||||
{ | |||||
Value = new Koike3Object(); | |||||
Value.ToValue(bytes); | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Koike3为对象 | |||||
/// ICommandParameterConvert:命令参数转换 | |||||
/// ToString:为对象类型用于分析器自定义显示 | |||||
/// </summary> | |||||
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'); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 用于分析器描述 | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public override string ToString() | |||||
{ | |||||
return JsonConvert.SerializeObject(this); | |||||
} | |||||
} | } | ||||
[Fact] | |||||
public void Test2() | |||||
/// <summary> | |||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// </summary> | |||||
public class ErrorCommandParameter : ICusotmCommandParameter, ICommandParameterValue<bool> | |||||
{ | { | ||||
byte[] bytes = "7E0200012B0011223344550001000000010000000200BA7F0E07E4F11C0028003C000021053118171001040000006402020037620000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D57E".ToHexBytes(); | |||||
var jT808Package = JT808Serializer.Deserialize<JT808Package>(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; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public byte[] ToBytes() | |||||
{ | |||||
return default; | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
public void ToValue(byte[] bytes) | |||||
{ | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -26,11 +26,19 @@ namespace JT808.Protocol.Test.Simples | |||||
public Demo13() | public Demo13() | ||||
{ | { | ||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<Koike1CommandParameter>(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<Koike2CommandParameter>(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<Koike3CommandParameter>(); | |||||
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<DefaultGlobalConfig>(); | |||||
//替换原有消息存在的BUG | |||||
jT808Config.ReplaceMsgId<JT808_0x0001, JT808_0x0001_Replace>(); | |||||
JT808Serializer = jT808Config.GetSerializer(); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -40,236 +48,115 @@ namespace JT808.Protocol.Test.Simples | |||||
{ | { | ||||
Header = new JT808Header | 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<ICommandParameter> | |||||
{ | |||||
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(); | var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); | ||||
Assert.Equal("7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E", hex); | |||||
Assert.Equal("7E0001000701234567890004B303E800020000A8797E", hex); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public void Test2() | public void Test2() | ||||
{ | { | ||||
byte[] bytes = "7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E".ToHexBytes(); | |||||
var jT808Package = JT808Serializer.Deserialize<JT808Package>(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<Koike1CommandParameter>().Value.Value); | |||||
Assert.Equal("SmallChi", JT808_0x8105.CustomCommandParameters.GetCommandParameter<Koike2CommandParameter>().Value); | |||||
Assert.Equal(new Koike3Object() | |||||
{ | |||||
Value1 = 0xff, | |||||
Value2 = "Happy" | |||||
}, JT808_0x8105.CustomCommandParameters.GetCommandParameter<Koike3CommandParameter>().Value); | |||||
} | |||||
[Fact] | |||||
public void Test3() | |||||
{ | |||||
byte[] bytes = "7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E".ToHexBytes(); | |||||
var json = JT808Serializer.Analyze(bytes); | |||||
} | |||||
[Fact] | |||||
public void Test4() | |||||
{ | |||||
var ex= Assert.Throws<System.ArgumentException>(() => | |||||
{ | |||||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||||
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<ErrorCommandParameter>(); | |||||
}); | |||||
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<JT808Package>(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); | |||||
} | } | ||||
} | |||||
/// <summary> | |||||
/// 终端通用应答_替换原有的消息,来解决库现有的bug | |||||
/// </summary> | |||||
public class JT808_0x0001_Replace : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0001_Replace>, IJT808Analyze | |||||
{ | |||||
/// <summary> | /// <summary> | ||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// 0x0001 | |||||
/// </summary> | /// </summary> | ||||
public class Koike1CommandParameter : ICusotmCommandParameter, ICommandParameterValue<uint?> | |||||
{ | |||||
public int Order => 13; | |||||
public string CommandName => "Koike1"; | |||||
public uint? Value { get; set; } | |||||
public override ushort MsgId => 0x0001; | |||||
/// <summary> | |||||
/// 终端通用应答 | |||||
/// </summary> | |||||
public override string Description => "终端通用应答"; | |||||
/// <summary> | |||||
/// 应答流水号 | |||||
/// 对应的平台消息的流水号 | |||||
/// </summary> | |||||
public ushort ReplyMsgNum { get; set; } | |||||
/// <summary> | |||||
/// 应答 ID | |||||
/// 对应的平台消息的 ID | |||||
/// <see cref="JT808.Protocol.Enums.JT808MsgId"/> | |||||
/// </summary> | |||||
public ushort ReplyMsgId { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public byte[] ToBytes() | |||||
{ | |||||
if (!Value.HasValue) return default; | |||||
var value = new byte[4]; | |||||
BinaryPrimitives.WriteUInt32BigEndian(value, Value.Value); | |||||
return value; | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
public void ToValue(byte[] bytes) | |||||
{ | |||||
if (bytes != null && bytes.Length > 0) | |||||
{ | |||||
Value = BinaryPrimitives.ReadUInt32BigEndian(bytes); | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | /// <summary> | ||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// 结果 | |||||
/// 0:成功/确认;1:失败;2:消息有误;3:不支持 | |||||
/// </summary> | /// </summary> | ||||
public class Koike2CommandParameter : ICusotmCommandParameter, ICommandParameterValue<string> | |||||
{ | |||||
public int Order => 14; | |||||
public string CommandName => "Koike2"; | |||||
public string Value { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public byte[] ToBytes() | |||||
{ | |||||
if (string.IsNullOrEmpty(Value)) return default; | |||||
return JT808Constants.Encoding.GetBytes(Value.PadRight(10, '\0')); | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
public void ToValue(byte[] bytes) | |||||
{ | |||||
if (bytes != null && bytes.Length > 0) | |||||
{ | |||||
Value = JT808Constants.Encoding.GetString(bytes).Trim('\0'); | |||||
} | |||||
} | |||||
} | |||||
public JT808TerminalResult TerminalResult { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// 测试 | |||||
/// </summary> | /// </summary> | ||||
public class Koike3CommandParameter : ICusotmCommandParameter, ICommandParameterValue<Koike3Object> | |||||
public ushort Test { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="reader"></param> | |||||
/// <param name="config"></param> | |||||
/// <returns></returns> | |||||
public JT808_0x0001_Replace Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||||
{ | { | ||||
public int Order => 15; | |||||
public string CommandName => "Koike3"; | |||||
public Koike3Object Value { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public byte[] ToBytes() | |||||
{ | |||||
if (Value==null) return default; | |||||
return Value.ToBytes(); | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
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; | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// Koike3为对象 | |||||
/// ICommandParameterConvert:命令参数转换 | |||||
/// ToString:为对象类型用于分析器自定义显示 | |||||
/// | |||||
/// </summary> | /// </summary> | ||||
public record Koike3Object : ICommandParameterConvert | |||||
/// <param name="writer"></param> | |||||
/// <param name="value"></param> | |||||
/// <param name="config"></param> | |||||
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'); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 用于分析器描述 | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
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); | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// ICusotmCommandParameter 自定义命令参数接口 | |||||
/// ICommandParameterValue<> 对应的数据类型值 | |||||
/// 注意:Order必须从13开始逐一递增 | |||||
/// | |||||
/// </summary> | /// </summary> | ||||
public class ErrorCommandParameter : ICusotmCommandParameter, ICommandParameterValue<bool> | |||||
/// <param name="reader"></param> | |||||
/// <param name="writer"></param> | |||||
/// <param name="config"></param> | |||||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||||
{ | { | ||||
public int Order => 3; | |||||
public string CommandName => "Error"; | |||||
public bool Value { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <returns></returns> | |||||
public byte[] ToBytes() | |||||
{ | |||||
return default; | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="bytes"></param> | |||||
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); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -27,136 +27,22 @@ namespace JT808.Protocol.Test.Simples | |||||
public Demo14() | public Demo14() | ||||
{ | { | ||||
IServiceCollection serviceDescriptors = new ServiceCollection(); | IServiceCollection serviceDescriptors = new ServiceCollection(); | ||||
serviceDescriptors.AddJT808Configure(new DefaultGlobalConfig("replace")); | |||||
serviceDescriptors.AddJT808Configure(); | |||||
//通常在startup中使用app的Use进行扩展 | //通常在startup中使用app的Use进行扩展 | ||||
IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); | IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); | ||||
Use(serviceProvider); | |||||
} | |||||
void Use(IServiceProvider serviceProvider) | |||||
{ | |||||
IJT808Config jT808Config = serviceProvider.GetRequiredService<DefaultGlobalConfig>(); | |||||
//替换原有消息存在的BUG | |||||
jT808Config.ReplaceMsgId<JT808_0x0001, JT808_0x0001_Replace>(); | |||||
JT808Serializer = jT808Config.GetSerializer(); | |||||
JT808Serializer = serviceProvider.GetRequiredService<IJT808Config>().GetSerializer(); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public void Test1() | 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<JT808Package>(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); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 终端通用应答_替换原有的消息,来解决库现有的bug | |||||
/// </summary> | |||||
public class JT808_0x0001_Replace : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0001_Replace>, IJT808Analyze | |||||
{ | |||||
/// <summary> | |||||
/// 0x0001 | |||||
/// </summary> | |||||
public override ushort MsgId => 0x0001; | |||||
/// <summary> | |||||
/// 终端通用应答 | |||||
/// </summary> | |||||
public override string Description => "终端通用应答"; | |||||
/// <summary> | |||||
/// 应答流水号 | |||||
/// 对应的平台消息的流水号 | |||||
/// </summary> | |||||
public ushort ReplyMsgNum { get; set; } | |||||
/// <summary> | |||||
/// 应答 ID | |||||
/// 对应的平台消息的 ID | |||||
/// <see cref="JT808.Protocol.Enums.JT808MsgId"/> | |||||
/// </summary> | |||||
public ushort ReplyMsgId { get; set; } | |||||
/// <summary> | |||||
/// 结果 | |||||
/// 0:成功/确认;1:失败;2:消息有误;3:不支持 | |||||
/// </summary> | |||||
public JT808TerminalResult TerminalResult { get; set; } | |||||
/// <summary> | |||||
/// 测试 | |||||
/// </summary> | |||||
public ushort Test { get; set; } | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="reader"></param> | |||||
/// <param name="config"></param> | |||||
/// <returns></returns> | |||||
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; | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="writer"></param> | |||||
/// <param name="value"></param> | |||||
/// <param name="config"></param> | |||||
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); | |||||
} | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <param name="reader"></param> | |||||
/// <param name="writer"></param> | |||||
/// <param name="config"></param> | |||||
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<JT808Package>(bytes, JT808Version.JTT2013Force);//强制使用2013协议转换 | |||||
//因头部的版本标识号是2019,实际上是使用2013的协议 | |||||
jT808Package.Header.MessageBodyProperty.VersionFlag = false; | |||||
//修改版本号之后,重新编码协议,以便后续服务正常使用 | |||||
var newBytes=JT808Serializer.Serialize(jT808Package); | |||||
JT808Package jT808PackageNew = JT808Serializer.Deserialize<JT808Package>(newBytes); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -36,13 +36,48 @@ namespace JT808.Protocol.Test.Simples | |||||
[Fact] | [Fact] | ||||
public void Test1() | public void Test1() | ||||
{ | { | ||||
var bytes = "7e0102400c01003000068109024a3130303330303030363831857e".ToHexBytes(); | |||||
JT808Package jT808Package = JT808Serializer.Deserialize<JT808Package>(bytes, JT808Version.JTT2013Force);//强制使用2013协议转换 | |||||
//因头部的版本标识号是2019,实际上是使用2013的协议 | |||||
jT808Package.Header.MessageBodyProperty.VersionFlag = false; | |||||
//修改版本号之后,重新编码协议,以便后续服务正常使用 | |||||
var newBytes=JT808Serializer.Serialize(jT808Package); | |||||
JT808Package jT808PackageNew = JT808Serializer.Deserialize<JT808Package>(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<JT808Package>(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); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -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<IJT808Config>().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<JT808Package>(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); | |||||
} | |||||
} | |||||
} |
@@ -50,9 +50,9 @@ namespace JT808.Protocol.Test.Simples | |||||
Assert.Equal(0, jT808_0x0200.Direction); | Assert.Equal(0, jT808_0x0200.Direction); | ||||
Assert.Equal((uint)2, jT808_0x0200.StatusFlag); | Assert.Equal((uint)2, jT808_0x0200.StatusFlag); | ||||
//4.1.附加信息1 | //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 | //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); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -34,7 +34,7 @@ namespace JT808.Protocol.Test.Simples | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase> | |||||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase> | |||||
{ | { | ||||
{ JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}}, | { JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}}, | ||||
{ JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}} | { JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}} | ||||
@@ -48,7 +48,7 @@ namespace JT808.Protocol.Test.Simples | |||||
Speed = 60, | Speed = 60, | ||||
Direction = 0, | Direction = 0, | ||||
StatusFlag = 2, | StatusFlag = 2, | ||||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase> | |||||
CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase> | |||||
{ | { | ||||
{0x81,new JT808_0x0200_DT1_0x81 { | {0x81,new JT808_0x0200_DT1_0x81 { | ||||
Age=15, | Age=15, | ||||
@@ -62,7 +62,7 @@ namespace JT808.Protocol.Test.Simples | |||||
var jT808PackageResult = demo5JT808Serializer.Deserialize<JT808Package>(data); | var jT808PackageResult = demo5JT808Serializer.Deserialize<JT808Package>(data); | ||||
JT808_0x0200 jT808_0X0200 = jT808PackageResult.Bodies as JT808_0x0200; | 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 extJson = attach.ExtData.Data.ToString(Formatting.None); | ||||
var attachinfo81 = (JT808_0x0200_DT1_0x81)attach.JT808CustomLocationAttachData[0x81]; | var attachinfo81 = (JT808_0x0200_DT1_0x81)attach.JT808CustomLocationAttachData[0x81]; | ||||
Assert.Equal((uint)15, attachinfo81.Age); | Assert.Equal((uint)15, attachinfo81.Age); | ||||
@@ -11,14 +11,44 @@ namespace JT808.Protocol.Interfaces | |||||
public interface IJT808_0x0200_Custom_Factory: IJT808ExternalRegister | public interface IJT808_0x0200_Custom_Factory: IJT808ExternalRegister | ||||
{ | { | ||||
/// <summary> | /// <summary> | ||||
/// | |||||
/// map JT808_0x0200_CustomBodyBase | |||||
/// </summary> | /// </summary> | ||||
IDictionary<byte, object> Map { get; } | IDictionary<byte, object> Map { get; } | ||||
/// <summary> | /// <summary> | ||||
/// map JT808_0x0200_CustomBodyBase2 | |||||
/// </summary> | |||||
IDictionary<ushort, object> Map2 { get; } | |||||
/// <summary> | |||||
/// map JT808_0x0200_CustomBodyBase3 | |||||
/// </summary> | |||||
IDictionary<ushort, object> Map3 { get; } | |||||
/// <summary> | |||||
/// map JT808_0x0200_CustomBodyBase4 | |||||
/// </summary> | |||||
IDictionary<byte, object> Map4 { get; } | |||||
/// <summary> | |||||
/// | /// | ||||
/// </summary> | /// </summary> | ||||
/// <typeparam name="TJT808_0x0200_CustomBody"></typeparam> | /// <typeparam name="TJT808_0x0200_CustomBody"></typeparam> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
IJT808_0x0200_Custom_Factory SetMap<TJT808_0x0200_CustomBody>() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase; | IJT808_0x0200_Custom_Factory SetMap<TJT808_0x0200_CustomBody>() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase; | ||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <typeparam name="TJT808_0x0200_CustomBody2"></typeparam> | |||||
/// <returns></returns> | |||||
IJT808_0x0200_Custom_Factory SetMap2<TJT808_0x0200_CustomBody2>() where TJT808_0x0200_CustomBody2 : JT808_0x0200_CustomBodyBase2; | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <typeparam name="TJT808_0x0200_CustomBody3"></typeparam> | |||||
/// <returns></returns> | |||||
IJT808_0x0200_Custom_Factory SetMap3<TJT808_0x0200_CustomBody3>() where TJT808_0x0200_CustomBody3 : JT808_0x0200_CustomBodyBase3; | |||||
/// <summary> | |||||
/// | |||||
/// </summary> | |||||
/// <typeparam name="TJT808_0x0200_CustomBody4"></typeparam> | |||||
/// <returns></returns> | |||||
IJT808_0x0200_Custom_Factory SetMap4<TJT808_0x0200_CustomBody4>() where TJT808_0x0200_CustomBody4 : JT808_0x0200_CustomBodyBase4; | |||||
} | } | ||||
} | } |
@@ -12,9 +12,18 @@ namespace JT808.Protocol.Internal | |||||
{ | { | ||||
public IDictionary<byte, object> Map { get; } | public IDictionary<byte, object> Map { get; } | ||||
public IDictionary<ushort, object> Map2 { get; } | |||||
public IDictionary<ushort, object> Map3 { get; } | |||||
public IDictionary<byte, object> Map4 { get; } | |||||
public JT808_0x0200_Custom_Factory() | public JT808_0x0200_Custom_Factory() | ||||
{ | { | ||||
Map = new Dictionary<byte, object>(); | Map = new Dictionary<byte, object>(); | ||||
Map2 = new Dictionary<ushort, object>(); | |||||
Map3 = new Dictionary<ushort, object>(); | |||||
Map4 = new Dictionary<byte, object>(); | |||||
} | } | ||||
public void Register(Assembly externalAssembly) | public void Register(Assembly externalAssembly) | ||||
@@ -33,6 +42,51 @@ namespace JT808.Protocol.Internal | |||||
Map.Add(attachid, instance); | 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<TJT808_0x0200_CustomBody>() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase | public IJT808_0x0200_Custom_Factory SetMap<TJT808_0x0200_CustomBody>() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase | ||||
@@ -50,5 +104,53 @@ namespace JT808.Protocol.Internal | |||||
} | } | ||||
return this; | return this; | ||||
} | } | ||||
public IJT808_0x0200_Custom_Factory SetMap2<TJT808_0x0200_CustomBody2>() 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<TJT808_0x0200_CustomBody3>() 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<TJT808_0x0200_CustomBody4>() 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; | |||||
} | |||||
} | } | ||||
} | } |
@@ -4249,7 +4249,22 @@ | |||||
</member> | </member> | ||||
<member name="P:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.Map"> | <member name="P:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.Map"> | ||||
<summary> | <summary> | ||||
map JT808_0x0200_CustomBodyBase | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.Map2"> | |||||
<summary> | |||||
map JT808_0x0200_CustomBodyBase2 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.Map3"> | |||||
<summary> | |||||
map JT808_0x0200_CustomBodyBase3 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.Map4"> | |||||
<summary> | |||||
map JT808_0x0200_CustomBodyBase4 | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="M:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.SetMap``1"> | <member name="M:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.SetMap``1"> | ||||
@@ -4259,6 +4274,27 @@ | |||||
<typeparam name="TJT808_0x0200_CustomBody"></typeparam> | <typeparam name="TJT808_0x0200_CustomBody"></typeparam> | ||||
<returns></returns> | <returns></returns> | ||||
</member> | </member> | ||||
<member name="M:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.SetMap2``1"> | |||||
<summary> | |||||
</summary> | |||||
<typeparam name="TJT808_0x0200_CustomBody2"></typeparam> | |||||
<returns></returns> | |||||
</member> | |||||
<member name="M:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.SetMap3``1"> | |||||
<summary> | |||||
</summary> | |||||
<typeparam name="TJT808_0x0200_CustomBody3"></typeparam> | |||||
<returns></returns> | |||||
</member> | |||||
<member name="M:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.SetMap4``1"> | |||||
<summary> | |||||
</summary> | |||||
<typeparam name="TJT808_0x0200_CustomBody4"></typeparam> | |||||
<returns></returns> | |||||
</member> | |||||
<member name="T:JT808.Protocol.Interfaces.IJT808_0x0200_Factory"> | <member name="T:JT808.Protocol.Interfaces.IJT808_0x0200_Factory"> | ||||
<summary> | <summary> | ||||
0x0200附加信息工厂 | 0x0200附加信息工厂 | ||||
@@ -9079,17 +9115,12 @@ | |||||
YY-MM-DD-hh-mm-ss(GMT+8 时间,本标准中之后涉及的时间均采用此时区) | YY-MM-DD-hh-mm-ss(GMT+8 时间,本标准中之后涉及的时间均采用此时区) | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.JT808LocationAttachData"> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.BasicLocationAttachData"> | |||||
<summary> | <summary> | ||||
位置附加信息 | |||||
基础位置附加信息 | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.JT808UnknownLocationAttachOriginalData"> | |||||
<summary> | |||||
存储未知的附加信息源数据 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.JT808CustomLocationAttachData"> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.CustomLocationAttachData"> | |||||
<summary> | <summary> | ||||
自定义位置附加信息 | 自定义位置附加信息 | ||||
场景: | 场景: | ||||
@@ -9101,32 +9132,32 @@ | |||||
依赖平台录入的设备类型 | 依赖平台录入的设备类型 | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.ExceptionLocationAttachOriginalData"> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.CustomLocationAttachData2"> | |||||
<summary> | |||||
自定义位置附加信息2 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.CustomLocationAttachData3"> | |||||
<summary> | |||||
自定义位置附加信息3 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.CustomLocationAttachData4"> | |||||
<summary> | <summary> | ||||
有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||||
形如: | |||||
00 0C 这个是长度 | |||||
00 B2 这个是长度 | |||||
实际解析 | |||||
00 附加信息Id | |||||
0C 附加信息长度 | |||||
00 附加信息Id | |||||
B2 附加信息长度 | |||||
只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||||
自定义位置附加信息4 | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.ExceptionLocationAttachData"> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.UnknownLocationAttachData"> | |||||
<summary> | |||||
未知自定义附加数据【一切都是为了尽可能兼容】 | |||||
形如:自定义_附加Id字节数_附加数据长度_附加Id | |||||
注意:这边不是最好的解决方式,最好的方式就是通过已知的自定义协议附加,根据提供的文档进行组织后在注册。 | |||||
这边采用优先1-1的,然后是绝大多数设备厂家有2-1,少部分是2-2,最后是1_4。 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.ExceptionLocationAttachOriginalData"> | |||||
<summary> | <summary> | ||||
有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||||
形如: | |||||
00 0C 这个是长度 | |||||
00 B2 这个是长度 | |||||
实际解析 | |||||
00 附加信息Id | |||||
0C 附加信息长度 | |||||
00 附加信息Id | |||||
B2 附加信息长度 | |||||
只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||||
设备未知自定义附加数据(未注册)、数据解析异常 | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="M:JT808.Protocol.MessageBody.JT808_0x0200.Deserialize(JT808.Protocol.MessagePack.JT808MessagePackReader@,JT808.Protocol.IJT808Config)"> | <member name="M:JT808.Protocol.MessageBody.JT808_0x0200.Deserialize(JT808.Protocol.MessagePack.JT808MessagePackReader@,JT808.Protocol.IJT808Config)"> | ||||
@@ -9955,11 +9986,53 @@ | |||||
自定义附加信息长度 | 自定义附加信息长度 | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase.AttachInfoLengthExtend"> | |||||
<member name="T:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase2"> | |||||
<summary> | |||||
自定义位置附加信息 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase2.AttachInfoId"> | |||||
<summary> | |||||
自定义附加信息Id扩展 | |||||
两个字节 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase2.AttachInfoLength"> | |||||
<summary> | |||||
自定义附加信息长度 | |||||
</summary> | |||||
</member> | |||||
<member name="T:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase3"> | |||||
<summary> | <summary> | ||||
附加信息长度扩展 | |||||
4个字节 | |||||
注意:只适用于已知的协议才行 | |||||
自定义位置附加信息 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase3.AttachInfoId"> | |||||
<summary> | |||||
自定义附加信息Id扩展 | |||||
两个字节 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase3.AttachInfoLength"> | |||||
<summary> | |||||
自定义附加信息长度 | |||||
两个字节 | |||||
</summary> | |||||
</member> | |||||
<member name="T:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase4"> | |||||
<summary> | |||||
自定义位置附加信息 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase4.AttachInfoId"> | |||||
<summary> | |||||
自定义附加信息Id扩展 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase4.AttachInfoLength"> | |||||
<summary> | |||||
自定义附加信息长度 | |||||
四个字节 | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="T:JT808.Protocol.MessageBody.JT808_0x0201"> | <member name="T:JT808.Protocol.MessageBody.JT808_0x0201"> | ||||
@@ -5,6 +5,7 @@ using JT808.Protocol.Formatters; | |||||
using JT808.Protocol.Interfaces; | using JT808.Protocol.Interfaces; | ||||
using JT808.Protocol.MessagePack; | using JT808.Protocol.MessagePack; | ||||
using System; | using System; | ||||
using System.Buffers.Binary; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | using System.Linq; | ||||
using System.Text.Json; | using System.Text.Json; | ||||
@@ -62,13 +63,9 @@ namespace JT808.Protocol.MessageBody | |||||
/// </summary> | /// </summary> | ||||
public DateTime GPSTime { get; set; } | public DateTime GPSTime { get; set; } | ||||
/// <summary> | /// <summary> | ||||
/// 位置附加信息 | |||||
/// 基础位置附加信息 | |||||
/// </summary> | /// </summary> | ||||
public Dictionary<byte, JT808_0x0200_BodyBase> JT808LocationAttachData { get; set; } | |||||
/// <summary> | |||||
/// 存储未知的附加信息源数据 | |||||
/// </summary> | |||||
public Dictionary<byte, byte[]> JT808UnknownLocationAttachOriginalData { get; set; } | |||||
public Dictionary<byte, JT808_0x0200_BodyBase> BasicLocationAttachData { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 自定义位置附加信息 | /// 自定义位置附加信息 | ||||
/// 场景: | /// 场景: | ||||
@@ -79,33 +76,30 @@ namespace JT808.Protocol.MessageBody | |||||
/// 缺点: | /// 缺点: | ||||
/// 依赖平台录入的设备类型 | /// 依赖平台录入的设备类型 | ||||
/// </summary> | /// </summary> | ||||
public Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; set; } | |||||
public Dictionary<byte, JT808_0x0200_CustomBodyBase> CustomLocationAttachData { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||||
/// 形如: | |||||
/// 00 0C 这个是长度 | |||||
/// 00 B2 这个是长度 | |||||
/// 实际解析 | |||||
/// 00 附加信息Id | |||||
/// 0C 附加信息长度 | |||||
/// 00 附加信息Id | |||||
/// B2 附加信息长度 | |||||
/// 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||||
/// 自定义位置附加信息2 | |||||
/// </summary> | /// </summary> | ||||
public List<byte[]> ExceptionLocationAttachOriginalData { get; set; } | |||||
public Dictionary<ushort, JT808_0x0200_CustomBodyBase2> CustomLocationAttachData2 { get; set; } | |||||
/// <summary> | |||||
/// 自定义位置附加信息3 | |||||
/// </summary> | |||||
public Dictionary<ushort, JT808_0x0200_CustomBodyBase3> CustomLocationAttachData3 { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||||
/// 形如: | |||||
/// 00 0C 这个是长度 | |||||
/// 00 B2 这个是长度 | |||||
/// 实际解析 | |||||
/// 00 附加信息Id | |||||
/// 0C 附加信息长度 | |||||
/// 00 附加信息Id | |||||
/// B2 附加信息长度 | |||||
/// 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||||
/// 自定义位置附加信息4 | |||||
/// </summary> | /// </summary> | ||||
public List<JT808_0x0200_CustomBodyBase> ExceptionLocationAttachData { get; set; } | |||||
public Dictionary<byte, JT808_0x0200_CustomBodyBase4> CustomLocationAttachData4 { get; set; } | |||||
/// <summary> | |||||
/// 未知自定义附加数据【一切都是为了尽可能兼容】 | |||||
/// 形如:自定义_附加Id字节数_附加数据长度_附加Id | |||||
/// 注意:这边不是最好的解决方式,最好的方式就是通过已知的自定义协议附加,根据提供的文档进行组织后在注册。 | |||||
/// 这边采用优先1-1的,然后是绝大多数设备厂家有2-1,少部分是2-2,最后是1_4。 | |||||
/// </summary> | |||||
public Dictionary<ushort, byte[]> UnknownLocationAttachData { get; set; } | |||||
/// <summary> | |||||
/// 设备未知自定义附加数据(未注册)、数据解析异常 | |||||
/// </summary> | |||||
public List<byte[]> ExceptionLocationAttachOriginalData { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// | /// | ||||
/// </summary> | /// </summary> | ||||
@@ -138,88 +132,145 @@ namespace JT808.Protocol.MessageBody | |||||
jT808_0X0200.Direction = reader.ReadUInt16(); | jT808_0X0200.Direction = reader.ReadUInt16(); | ||||
jT808_0X0200.GPSTime = reader.ReadDateTime6(); | jT808_0X0200.GPSTime = reader.ReadDateTime6(); | ||||
// 位置附加信息 | // 位置附加信息 | ||||
jT808_0X0200.JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808_0X0200.JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | |||||
jT808_0X0200.JT808UnknownLocationAttachOriginalData = new Dictionary<byte, byte[]>(); | |||||
jT808_0X0200.BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
jT808_0X0200.CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | |||||
jT808_0X0200.CustomLocationAttachData2 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase2>(); | |||||
jT808_0X0200.CustomLocationAttachData3 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase3>(); | |||||
jT808_0X0200.CustomLocationAttachData4 = new Dictionary<byte, JT808_0x0200_CustomBodyBase4>(); | |||||
jT808_0X0200.ExceptionLocationAttachOriginalData = new List<byte[]>(); | jT808_0X0200.ExceptionLocationAttachOriginalData = new List<byte[]>(); | ||||
jT808_0X0200.ExceptionLocationAttachData = new List<JT808_0x0200_CustomBodyBase>(); | |||||
jT808_0X0200.UnknownLocationAttachData = new Dictionary<ushort, byte[]>(); | |||||
while (reader.ReadCurrentRemainContentLength() > 0) | while (reader.ReadCurrentRemainContentLength() > 0) | ||||
{ | { | ||||
try | try | ||||
{ | { | ||||
ReadOnlySpan<byte> 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()); | jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | ||||
reader.Skip(attachLen); | reader.Skip(attachLen); | ||||
} | } | ||||
else | 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 | else | ||||
{ | { | ||||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config); | 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 | 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 | 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 | catch | ||||
{ | { | ||||
try | 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) | catch (Exception ex) | ||||
{ | { | ||||
throw; | |||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
return jT808_0X0200; | return jT808_0X0200; | ||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// | /// | ||||
/// </summary> | /// </summary> | ||||
@@ -263,9 +314,9 @@ namespace JT808.Protocol.MessageBody | |||||
writer.WriteUInt16(value.Speed); | writer.WriteUInt16(value.Speed); | ||||
writer.WriteUInt16(value.Direction); | writer.WriteUInt16(value.Direction); | ||||
writer.WriteDateTime6(value.GPSTime); | 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 | 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); | 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(); | value.GPSTime = reader.ReadDateTime6(); | ||||
writer.WriteString($"[{value.GPSTime:yyMMddHHmmss}]定位时间", value.GPSTime.ToString("yyyy-MM-dd HH:mm:ss")); | writer.WriteString($"[{value.GPSTime:yyMMddHHmmss}]定位时间", value.GPSTime.ToString("yyyy-MM-dd HH:mm:ss")); | ||||
// 位置附加信息 | // 位置附加信息 | ||||
value.BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>(); | |||||
value.CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase>(); | |||||
value.CustomLocationAttachData2 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase2>(); | |||||
value.CustomLocationAttachData3 = new Dictionary<ushort, JT808_0x0200_CustomBodyBase3>(); | |||||
value.CustomLocationAttachData4 = new Dictionary<byte, JT808_0x0200_CustomBodyBase4>(); | |||||
value.ExceptionLocationAttachOriginalData = new List<byte[]>(); | |||||
writer.WriteStartArray("附加信息列表"); | writer.WriteStartArray("附加信息列表"); | ||||
while (reader.ReadCurrentRemainContentLength() > 0) | while (reader.ReadCurrentRemainContentLength() > 0) | ||||
{ | { | ||||
try | try | ||||
{ | { | ||||
ReadOnlySpan<byte> 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)) | 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 | else | ||||
{ | { | ||||
//未知的附加只通过标准的自定义附加信息来解析,其余的通过自己注册,自己实现的方式来解析 | |||||
reader.Skip(1); | |||||
byte attachLen = reader.ReadByte(); | |||||
int remainLength = reader.ReadCurrentRemainContentLength(); | |||||
writer.WriteStartObject(); | writer.WriteStartObject(); | ||||
reader.Skip(2); | |||||
writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | ||||
writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); | 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(); | writer.WriteEndObject(); | ||||
} | } | ||||
} | } | ||||
catch | |||||
catch (Exception ex) | |||||
{ | { | ||||
writer.WriteStartObject(); | writer.WriteStartObject(); | ||||
writer.WriteString($"解析外部部未知附加信息报错", ex.StackTrace); | |||||
try | 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 | finally | ||||
{ | { | ||||
writer.WriteEndObject(); | writer.WriteEndObject(); | ||||
} | } | ||||
break; | |||||
} | } | ||||
} | } | ||||
writer.WriteEndArray(); | writer.WriteEndArray(); | ||||
@@ -44,21 +44,21 @@ namespace JT808.Protocol.MessageBody | |||||
var carSignalStatus = Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0').AsSpan(); | var carSignalStatus = Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0').AsSpan(); | ||||
writer.WriteString("值", Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0')); | writer.WriteString("值", Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0')); | ||||
writer.WriteString("bit15~31", "保留"); | 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(); | writer.WriteEndObject(); | ||||
} | } | ||||
/// <summary> | /// <summary> | ||||
@@ -11,16 +11,10 @@ namespace JT808.Protocol.MessageBody | |||||
/// 自定义附加信息Id | /// 自定义附加信息Id | ||||
/// </summary> | /// </summary> | ||||
public abstract byte AttachInfoId { get; set; } | public abstract byte AttachInfoId { get; set; } | ||||
/// <summary> | /// <summary> | ||||
/// 自定义附加信息长度 | /// 自定义附加信息长度 | ||||
/// </summary> | /// </summary> | ||||
public abstract byte AttachInfoLength { get; set; } | public abstract byte AttachInfoLength { get; set; } | ||||
/// <summary> | |||||
/// 附加信息长度扩展 | |||||
/// 4个字节 | |||||
/// 注意:只适用于已知的协议才行 | |||||
/// </summary> | |||||
public virtual uint AttachInfoLengthExtend { get; set; } | |||||
} | } | ||||
} | } |
@@ -0,0 +1,22 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Protocol.MessageBody | |||||
{ | |||||
/// <summary> | |||||
/// 自定义位置附加信息 | |||||
/// </summary> | |||||
public abstract class JT808_0x0200_CustomBodyBase2 | |||||
{ | |||||
/// <summary> | |||||
/// 自定义附加信息Id扩展 | |||||
/// 两个字节 | |||||
/// </summary> | |||||
public abstract ushort AttachInfoId { get; set; } | |||||
/// <summary> | |||||
/// 自定义附加信息长度 | |||||
/// </summary> | |||||
public abstract byte AttachInfoLength { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Protocol.MessageBody | |||||
{ | |||||
/// <summary> | |||||
/// 自定义位置附加信息 | |||||
/// </summary> | |||||
public abstract class JT808_0x0200_CustomBodyBase3 | |||||
{ | |||||
/// <summary> | |||||
/// 自定义附加信息Id扩展 | |||||
/// 两个字节 | |||||
/// </summary> | |||||
public abstract ushort AttachInfoId { get; set; } | |||||
/// <summary> | |||||
/// 自定义附加信息长度 | |||||
/// 两个字节 | |||||
/// </summary> | |||||
public abstract ushort AttachInfoLength { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,22 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Protocol.MessageBody | |||||
{ | |||||
/// <summary> | |||||
/// 自定义位置附加信息 | |||||
/// </summary> | |||||
public abstract class JT808_0x0200_CustomBodyBase4 | |||||
{ | |||||
/// <summary> | |||||
/// 自定义附加信息Id扩展 | |||||
/// </summary> | |||||
public abstract byte AttachInfoId { get; set; } | |||||
/// <summary> | |||||
/// 自定义附加信息长度 | |||||
/// 四个字节 | |||||
/// </summary> | |||||
public abstract uint AttachInfoLength { get; set; } | |||||
} | |||||
} |