2.兼容0x0200各个自定义附加数据 3.整合Demo10的各个自定义附加数据举例 4.修改readme文档tags/v2.4.3
@@ -74,14 +74,14 @@ jT808_0x0200.Lng = 132444444; | |||
jT808_0x0200.Speed = 60; | |||
jT808_0x0200.Direction = 0; | |||
jT808_0x0200.StatusFlag = 2; | |||
jT808_0x0200.JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
jT808_0x0200.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808_0x0200.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 125 | |||
}); | |||
@@ -162,9 +162,9 @@ Assert.Equal(60, jT808_0x0200.Speed); | |||
Assert.Equal(0, jT808_0x0200.Direction); | |||
Assert.Equal((uint)2, jT808_0x0200.StatusFlag); | |||
//4.1.附加信息1 | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
//4.2.附加信息2 | |||
Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
``` | |||
### 举个栗子2 | |||
@@ -181,7 +181,7 @@ JT808Package jT808Package = Enums.JT808MsgId.位置信息汇报.Create("12345678 | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
JT808LocationAttachData = new Dictionary<byte, JT808LocationAttachBase> | |||
BasicLocationAttachData = new Dictionary<byte, JT808LocationAttachBase> | |||
{ | |||
{ JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}}, | |||
{ JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}} | |||
@@ -293,11 +293,26 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); | |||
### 举个栗子10 | |||
场景: | |||
场景1: | |||
有些设备,不会按照国标的附加信息Id来搞,把附加信息Id搞为两个字节,这样在上报上来的数据就会存在重复的附加Id,导致平台解析出错。 | |||
场景2: | |||
由于粤标的设备厂家自定义的附加信息长度可以为四4个字节的,所以需要兼容。 | |||
场景3: | |||
有些设备上报会出现两个相同的附加信息Id,那么只能解析一个,另一个只能丢在异常附加信息里面去处理。 | |||
|附加信息类说明| 附加ID字节数 | 附加长度字节数 | 备注 | | |||
| :--- | :---: | :---: | :---:| | |||
| JT808_0x0200_CustomBodyBase | 1 BYTE | 1 BYTE | 标准| | |||
| JT808_0x0200_CustomBodyBase2 | 2 BYTE | 1 BYTE | 自定义| | |||
| JT808_0x0200_CustomBodyBase3 | 2 BYTE | 2 BYTE | 自定义| | |||
| JT808_0x0200_CustomBodyBase4 | 1 BYTE | 4 BYTE | 自定义| | |||
[可以参考Simples的Demo10](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo10.cs) | |||
>注意:默认都是以**标准**的去解析,要是出现未知的附加,不一定解析就是正确,最好还是需要依照协议文档去开发然后自行注册解析器去解析。 | |||
### 举个栗子11 | |||
场景: | |||
@@ -308,39 +323,30 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); | |||
### 举个栗子12 | |||
场景: | |||
由于粤标的设备厂家自定义的附加信息长度可以为四4个字节的,所以需要兼容。 | |||
由于粤标的设备把2019版本的0x8105终端控制消息命令参数做了扩展,所以需要兼容。 | |||
[可以参考Simples的Demo12](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo12.cs) | |||
>注意:只适用于已知的设备厂家协议才行 | |||
### 举个栗子13 | |||
场景: | |||
由于粤标的设备把2019版本的0x8105终端控制消息命令参数做了扩展,所以需要兼容。 | |||
由于协议库本身可能存在消息解析出错的情况,要么就提PR上来,但是不一定会及时发布,这时候就需要自己把原有的消息解析复制出来,改造好,然后重新注册。 | |||
[可以参考Simples的Demo13](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo13.cs) | |||
[可以参考Simples的Demo14](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo13.cs) | |||
### 举个栗子14 | |||
场景: | |||
由于协议库本身可能存在消息解析出错的情况,要么就提PR上来,但是不一定会及时发布,这时候就需要自己把原有的消息解析复制出来,改造好,然后重新注册。 | |||
由于某些厂商不按要求去做,明明使用的2013的协议但是在消息头部的版本标识位置为1,导致程序认为是2019协议。从而解析报错。此时可以强制解析成2013后,然后修正版本标识,重新序列化消息,以供下游服务使用 | |||
[可以参考Simples的Demo14](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo14.cs) | |||
### 举个栗子15 | |||
场景: | |||
由于某些厂商不按要求去做,明明使用的2013的协议但是在消息头部的版本标识位置为1,导致程序认为是2019协议。从而解析报错。此时可以强制解析成2013后,然后修正版本标识,重新序列化消息,以供下游服务使用 | |||
[可以参考Simples的Demo15](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo15.cs) | |||
### 举个栗子16 | |||
场景: | |||
兼容2011协议的注册消息 | |||
[可以参考Simples的Demo16](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo16.cs) | |||
[可以参考Simples的Demo15](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo15.cs) | |||
## NuGet安装 | |||
@@ -57,57 +57,57 @@ namespace JT808.Protocol.Benchmark | |||
jT808UploadLocationRequest.Speed = 60; | |||
jT808UploadLocationRequest.Direction = 0; | |||
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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 | |||
{ | |||
Speed=56 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 | |||
{ | |||
EventId=1 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 | |||
{ | |||
AreaId=1, | |||
JT808PositionType= Enums.JT808PositionType.圆形区域 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 | |||
{ | |||
AreaId = 1, | |||
JT808PositionType = Enums.JT808PositionType.圆形区域, | |||
Direction= Enums.JT808DirectionType.出 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 | |||
{ | |||
DrivenRoute= Enums.JT808DrivenRouteType.过长, | |||
DrivenRouteId=2, | |||
Time=34 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 | |||
{ | |||
CarSignalStatus=23 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A | |||
{ | |||
IOStatus=244 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B | |||
{ | |||
Analog = 242 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 | |||
{ | |||
WiFiSignalStrength=0x02 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 | |||
{ | |||
GNSSCount=0x05 | |||
}); | |||
@@ -35,25 +35,25 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x15, new JT808_0x0200_0x15 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x15, new JT808_0x0200_0x15 | |||
{ | |||
VideoSignalLoseAlarmStatus = 100 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x16, new JT808_0x0200_0x16 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x16, new JT808_0x0200_0x16 | |||
{ | |||
VideoSignalOcclusionAlarmStatus = 100 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x17, new JT808_0x0200_0x17 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x17, new JT808_0x0200_0x17 | |||
{ | |||
StorageFaultAlarmStatus = 100 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(0x18, new JT808_0x0200_0x18 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(0x18, new JT808_0x0200_0x18 | |||
{ | |||
AbnormalDrivingBehaviorAlarmType = 100, | |||
FatigueLevel = 88 | |||
@@ -73,12 +73,12 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | |||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | |||
Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal(100u, ((JT808_0x0200_0x14)jT808UploadLocationRequest.JT808LocationAttachData[0x14]).VideoRelateAlarm); | |||
Assert.Equal(100u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.JT808LocationAttachData[0x15]).VideoSignalLoseAlarmStatus); | |||
Assert.Equal(100u, ((JT808_0x0200_0x16)jT808UploadLocationRequest.JT808LocationAttachData[0x16]).VideoSignalOcclusionAlarmStatus); | |||
Assert.Equal(100u, ((JT808_0x0200_0x17)jT808UploadLocationRequest.JT808LocationAttachData[0x17]).StorageFaultAlarmStatus); | |||
Assert.Equal(100u, ((JT808_0x0200_0x18)jT808UploadLocationRequest.JT808LocationAttachData[0x18]).AbnormalDrivingBehaviorAlarmType); | |||
Assert.Equal(88, ((JT808_0x0200_0x18)jT808UploadLocationRequest.JT808LocationAttachData[0x18]).FatigueLevel); | |||
Assert.Equal(100u, ((JT808_0x0200_0x14)jT808UploadLocationRequest.BasicLocationAttachData[0x14]).VideoRelateAlarm); | |||
Assert.Equal(100u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.BasicLocationAttachData[0x15]).VideoSignalLoseAlarmStatus); | |||
Assert.Equal(100u, ((JT808_0x0200_0x16)jT808UploadLocationRequest.BasicLocationAttachData[0x16]).VideoSignalOcclusionAlarmStatus); | |||
Assert.Equal(100u, ((JT808_0x0200_0x17)jT808UploadLocationRequest.BasicLocationAttachData[0x17]).StorageFaultAlarmStatus); | |||
Assert.Equal(100u, ((JT808_0x0200_0x18)jT808UploadLocationRequest.BasicLocationAttachData[0x18]).AbnormalDrivingBehaviorAlarmType); | |||
Assert.Equal(88, ((JT808_0x0200_0x18)jT808UploadLocationRequest.BasicLocationAttachData[0x18]).FatigueLevel); | |||
} | |||
[Fact] | |||
@@ -36,9 +36,9 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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.其他视频设备故障报警) | |||
}); | |||
@@ -57,7 +57,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | |||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | |||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal((uint)(VideoRelateAlarmType.视频信号遮挡报警 | VideoRelateAlarmType.其他视频设备故障报警), ((JT808_0x0200_0x14)jT808UploadLocationRequest.JT808LocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x14]).VideoRelateAlarm); | |||
Assert.Equal((uint)(VideoRelateAlarmType.视频信号遮挡报警 | VideoRelateAlarmType.其他视频设备故障报警), ((JT808_0x0200_0x14)jT808UploadLocationRequest.BasicLocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x14]).VideoRelateAlarm); | |||
} | |||
[Fact] | |||
@@ -80,9 +80,9 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
@@ -101,7 +101,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | |||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | |||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal(3u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.JT808LocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x15]).VideoSignalLoseAlarmStatus); | |||
Assert.Equal(3u, ((JT808_0x0200_0x15)jT808UploadLocationRequest.BasicLocationAttachData[JT808_JT1078_Constants.JT808_0X0200_0x15]).VideoSignalLoseAlarmStatus); | |||
} | |||
[Fact] | |||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -66,7 +66,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); | |||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -63,7 +63,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); | |||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -77,7 +77,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); | |||
@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -61,7 +61,7 @@ namespace JT808.Protocol.Extensions.SuBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); | |||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -67,7 +67,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X64.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X64.AlarmIdentification.AttachCount); | |||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -64,7 +64,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X65.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X65.AlarmIdentification.AttachCount); | |||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -78,7 +78,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X66.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X66.AlarmIdentification.AttachCount); | |||
@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
Speed = 60, | |||
Direction = 0, | |||
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, | |||
AlarmIdentification = new Metadata.AlarmIdentificationProperty | |||
@@ -61,7 +61,7 @@ namespace JT808.Protocol.Extensions.YueBiao.Test | |||
public void Deserialize() | |||
{ | |||
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; | |||
Assert.Equal(1u, jT808_0X0200_0X67.AlarmId); | |||
Assert.Equal(2, jT808_0X0200_0X67.AlarmIdentification.AttachCount); | |||
@@ -33,7 +33,6 @@ | |||
<Compile Include="Extensions\JT808HexExtensionsTest.cs" /> | |||
<Compile Include="Extensions\JT808PackageExtensionsTest.cs" /> | |||
<Compile Include="Extensions\JT808ValidationExtensionsTest.cs" /> | |||
<Compile Include="MessageBody\JT808LocationAttachExtensions\JT808LocationAttachImpl0x62.cs" /> | |||
<Compile Include="MessageBody\JT808LocationAttachExtensions\JT808LocationAttachImpl0x61.cs" /> | |||
<Compile Include="MessageBody\JT808_0x0001Test.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, | |||
Direction = 0, | |||
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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
@@ -83,13 +83,13 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
@@ -139,8 +139,8 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | |||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | |||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
} | |||
[Fact] | |||
@@ -181,18 +181,18 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
jT808UploadLocationRequest.JT808CustomLocationAttachData.Add(0x61, new JT808LocationAttachImpl0x61 | |||
jT808UploadLocationRequest.CustomLocationAttachData.Add(0x61, new JT808LocationAttachImpl0x61 | |||
{ | |||
Age = 18, | |||
Gender = 1, | |||
@@ -214,9 +214,9 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | |||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | |||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
var jT808LocationAttachImpl0x61 = (JT808LocationAttachImpl0x61)jT808UploadLocationRequest.JT808CustomLocationAttachData[0x61]; | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
var jT808LocationAttachImpl0x61 = (JT808LocationAttachImpl0x61)jT808UploadLocationRequest.CustomLocationAttachData[0x61]; | |||
Assert.Equal(18, jT808LocationAttachImpl0x61.Age); | |||
Assert.Equal(1, jT808LocationAttachImpl0x61.Gender); | |||
Assert.Equal("smallchi", jT808LocationAttachImpl0x61.UserName); | |||
@@ -243,13 +243,13 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
@@ -306,8 +306,8 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Equal(132444444, jT808UploadLocationRequest.Lng); | |||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | |||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
} | |||
[Fact] | |||
public void Test5_3() | |||
@@ -337,13 +337,13 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 1002222, | |||
JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
@@ -372,7 +372,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
// "[0B290B29]模拟量": 187239209 | |||
// }, | |||
// { | |||
// "[30]附加信息Id": 48, | |||
// "[30]附加信息Id": 48, | |||
// "[01]附加信息长度": 1, | |||
// "[17]无线通信网络信号强度": 23 | |||
// }, | |||
@@ -389,15 +389,15 @@ namespace JT808.Protocol.Test.MessageBody | |||
// { | |||
// "[00]未知附加信息Id": 0, 坑爹,相同的 | |||
// "[0C]未知附加信息长度": 12, | |||
// "未知附加信息": "000C00B289860620150013559848" | |||
// "未知附加信息": "000C00B222222222222222222222" | |||
// }, | |||
// { | |||
// "[EB]未知附加信息Id": 235, | |||
// "[0E]未知附加信息长度": 14, | |||
// "未知附加信息": "EB0E000C00B289860620150013559848" | |||
// "未知附加信息": "EB0E000C00B222222222222222222222" | |||
// } | |||
//] | |||
byte[] bodys = "7E020000520111111111100002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B289860620150013559848EB0E000C00B2898606201500135598486C7E".ToHexBytes(); | |||
byte[] bodys = "7E020000520111111111100002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B222222222222222222222EB0E000C00B2222222222222222222226C7E".ToHexBytes(); | |||
var package = JT808Serializer1.Deserialize(bodys); | |||
JT808_0x0200 jT808UploadLocationRequest = (JT808_0x0200)package.Bodies; | |||
Assert.Single(jT808UploadLocationRequest.ExceptionLocationAttachOriginalData); | |||
@@ -422,57 +422,57 @@ namespace JT808.Protocol.Test.MessageBody | |||
jT808UploadLocationRequest.Speed = 60; | |||
jT808UploadLocationRequest.Direction = 0; | |||
jT808UploadLocationRequest.StatusFlag = 2; | |||
jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x03, new JT808_0x0200_0x03 | |||
{ | |||
Speed = 56 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x04, new JT808_0x0200_0x04 | |||
{ | |||
EventId = 1 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x11, new JT808_0x0200_0x11 | |||
{ | |||
AreaId = 1, | |||
JT808PositionType = Enums.JT808PositionType.圆形区域 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x12, new JT808_0x0200_0x12 | |||
{ | |||
AreaId = 1, | |||
JT808PositionType = Enums.JT808PositionType.圆形区域, | |||
Direction = Enums.JT808DirectionType.出 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x13, new JT808_0x0200_0x13 | |||
{ | |||
DrivenRoute = Enums.JT808DrivenRouteType.过长, | |||
DrivenRouteId = 2, | |||
Time = 34 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x25, new JT808_0x0200_0x25 | |||
{ | |||
CarSignalStatus = 23 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2A, new JT808_0x0200_0x2A | |||
{ | |||
IOStatus = 244 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x2B, new JT808_0x0200_0x2B | |||
{ | |||
Analog = 242 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x30, new JT808_0x0200_0x30 | |||
{ | |||
WiFiSignalStrength = 0x02 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x31, new JT808_0x0200_0x31 | |||
{ | |||
GNSSCount = 0x05 | |||
}); | |||
@@ -553,8 +553,8 @@ namespace JT808.Protocol.Test.MessageBody | |||
jT808UploadLocationRequest.Speed = 60; | |||
jT808UploadLocationRequest.Direction = 0; | |||
jT808UploadLocationRequest.StatusFlag = 2; | |||
jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary<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>() | |||
{ | |||
@@ -638,7 +638,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
{ | |||
byte[] bytes = "000000010000000200BA7F0E07E4F11C0028003C0000210528181010072C0401030002020400050305000604050006030204000503050006040500060203050006040500060104050006".ToHexBytes(); | |||
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(4, jT808_0x0200_0x07.BeiDou.Count); | |||
Assert.Equal(3, jT808_0x0200_0x07.GPS.Count); | |||
@@ -646,6 +646,112 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Single(jT808_0x0200_0x07.Galileo); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo1_1() | |||
{ | |||
var bytes = "7E0200003F011111111111047D0100000000000C00C30161A2AA06BE84A000070000008C21082422494401040056AF7302020000030200002504000000002B040000000030011B310110FB0200657E".ToHexBytes(); | |||
JT808Package package = JT808Serializer1.Deserialize(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo1_2() | |||
{ | |||
var bytes = "7E0200003F011111111111047D0100000000000C00C30161A2AA06BE84A000070000008C21082422494401040056AF7302020000030200002504000000002B040000000030011B310110FB0200657E".ToHexBytes(); | |||
string json = JT808Serializer1.Analyze(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo2_1() | |||
{ | |||
var bytes = "7E020000850222222222220BAF00000000008C0003016892D6067D0154E0004801B2006321082422494701040007FD62030201AC050100060300000007030000002504000000022B04000000F0300118310111E0013DE10800000000000AA9D8E20400000000E30401B218F8E40400000000E50C001C5158001C5158001C5158EA0400001888EB0402000000EE0101F6041298A37E".ToHexBytes(); | |||
JT808Package package = JT808Serializer1.Deserialize(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo2_2() | |||
{ | |||
var bytes = "7E020000850222222222220BAF00000000008C0003016892D6067D0154E0004801B2006321082422494701040007FD62030201AC050100060300000007030000002504000000022B04000000F0300118310111E0013DE10800000000000AA9D8E20400000000E30401B218F8E40400000000E50C001C5158001C5158001C5158EA0400001888EB0402000000EE0101F6041298A37E".ToHexBytes(); | |||
string json = JT808Serializer1.Analyze(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo3_1() | |||
{ | |||
var bytes = "7E02000046033333333333061300000000000C0003020FC9E4069B20FC016402F7010421082422495401040005E44203020302060300000007030000002504000000022A0200002B040000000030011C310121D27E".ToHexBytes(); | |||
JT808Package package = JT808Serializer1.Deserialize(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo3_2() | |||
{ | |||
//7E02000046033333333333061300000000000C0003020FC9E4069B20FC016402F70104210824224954 | |||
//01 | |||
// 04 | |||
// 00 05 E4 42 | |||
//03 | |||
// 02 | |||
// 03 02 | |||
//06 | |||
// 03 | |||
// 00 00 00 | |||
//07 | |||
// 03 | |||
// 00 00 00 | |||
//25 | |||
// 04 | |||
// 00 00 00 02 | |||
//2A | |||
// 02 | |||
// 00 00 | |||
//2B | |||
// 04 | |||
// 00 00 00 00 | |||
//30 | |||
// 01 | |||
// 1C | |||
//31 | |||
// 01 | |||
// 21 | |||
//D2 | |||
//7E | |||
var bytes = "7E02000046033333333333061300000000000C0003020FC9E4069B20FC016402F7010421082422495401040005E44203020302060300000007030000002504000000022A0200002B040000000030011C310121D27E".ToHexBytes(); | |||
string json = JT808Serializer1.Analyze(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo4_1() | |||
{ | |||
var bytes = "7E020000810111111111110EB900000800000C0003027D011F0C07591E4F0033032100A521081016572114040000000001040033DA8B030203212504000000002A02000030011F310117710402170C0BEA04020CD303EF04000080007131000000080002020000010000304B475130534C210810165721000500050309000002057100000071000000710100007102AF7E".ToHexBytes(); | |||
JT808Package package = JT808Serializer1.Deserialize(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo4_2() | |||
{ | |||
var bytes = "7E020000810111111111110EB900000800000C0003027D011F0C07591E4F0033032100A521081016572114040000000001040033DA8B030203212504000000002A02000030011F310117710402170C0BEA04020CD303EF04000080007131000000080002020000010000304B475130534C210810165721000500050309000002057100000071000000710100007102AF7E".ToHexBytes(); | |||
string json = JT808Serializer1.Analyze(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo5_1() | |||
{ | |||
var bytes = "7E020000520111111111110002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B222222222222222222222EB0E000C00B2222222222222222222226C7E".ToHexBytes(); | |||
var package= JT808Serializer1.Deserialize(bytes); | |||
} | |||
[Fact] | |||
public void Test_Device_AttachInfo5_2() | |||
{ | |||
//7E | |||
//020000520111111111110002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B | |||
//00 | |||
// 04 | |||
// 00 CE 0B 29 | |||
//00 | |||
// 0C | |||
// 00 B2 | |||
// 22222222222222222222 | |||
//EB | |||
// 0E | |||
// 00 0C | |||
// 00 B2 | |||
// 22222222222222222222 | |||
//6C | |||
//7E | |||
var bytes = "7E020000520111111111110002000000000000000301789B3406238AFA0000018B00F62104020046090104000024C72B040B290B2930011731011B000400CE0B29000C00B222222222222222222222EB0E000C00B2222222222222222222226C7E".ToHexBytes(); | |||
string json = JT808Serializer1.Analyze(bytes); | |||
} | |||
[Fact] | |||
public void LatLngTest1_1() | |||
{ | |||
@@ -658,7 +764,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = -132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 0x18000000; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -688,7 +794,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = -132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 0x18000000 | 0x302; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -718,7 +824,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = 132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 0x10000000; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -749,7 +855,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = 132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 1111; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -768,7 +874,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = 132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 0x10000000 | 0x000300; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -798,7 +904,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = -132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 0x8000000; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -829,7 +935,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = -132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 1111; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -848,7 +954,7 @@ namespace JT808.Protocol.Test.MessageBody | |||
Lng = -132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
JT808LocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
BasicLocationAttachData = new Dictionary<byte, JT808_0x0200_BodyBase>() | |||
}; | |||
jT808UploadLocationRequest.StatusFlag = 0x8000000|0x6601; | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
@@ -35,13 +35,13 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 60, | |||
Direction = 0, | |||
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 | |||
}); | |||
jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
@@ -65,8 +65,8 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Equal(132444444, jT808_0X0201.Position.Lng); | |||
Assert.Equal(60, jT808_0X0201.Position.Speed); | |||
Assert.Equal((uint)2, jT808_0X0201.Position.StatusFlag); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0X0201.Position.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808_0X0201.Position.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0X0201.Position.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808_0X0201.Position.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
} | |||
[Fact] | |||
@@ -32,13 +32,13 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 60, | |||
Direction = 0, | |||
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 | |||
}); | |||
JT808_0x0200_1.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
JT808_0x0200_1.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
@@ -67,8 +67,8 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Equal(0, JT808Bodies.JT808_0x0200.Direction); | |||
Assert.Equal(60, JT808Bodies.JT808_0x0200.Speed); | |||
Assert.Equal((uint)2, JT808Bodies.JT808_0x0200.StatusFlag); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.JT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.JT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.JT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.JT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
} | |||
[Fact] | |||
@@ -43,13 +43,13 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 60, | |||
Direction = 0, | |||
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 | |||
}); | |||
JT808_0x0200_1.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
JT808_0x0200_1.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 55 | |||
}); | |||
@@ -67,13 +67,13 @@ namespace JT808.Protocol.Test.MessageBody | |||
Speed = 54, | |||
Direction = 120, | |||
StatusFlag = 1, | |||
JT808LocationAttachData = new Dictionary<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 | |||
}); | |||
JT808_0x0200_2.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
JT808_0x0200_2.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 | |||
{ | |||
Oil = 66 | |||
}); | |||
@@ -143,8 +143,8 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Equal(0, JT808Bodies.Positions[0].Direction); | |||
Assert.Equal(60, JT808Bodies.Positions[0].Speed); | |||
Assert.Equal((uint)2, JT808Bodies.Positions[0].StatusFlag); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.Positions[0].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.Positions[0].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)JT808Bodies.Positions[0].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)JT808Bodies.Positions[0].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal((uint)2, JT808Bodies.Positions[1].AlarmFlag); | |||
Assert.Equal(DateTime.Parse("2018-07-15 10:10:30"), JT808Bodies.Positions[1].GPSTime); | |||
@@ -153,8 +153,8 @@ namespace JT808.Protocol.Test.MessageBody | |||
Assert.Equal(54, JT808Bodies.Positions[1].Speed); | |||
Assert.Equal(120, JT808Bodies.Positions[1].Direction); | |||
Assert.Equal((uint)1, JT808Bodies.Positions[1].StatusFlag); | |||
Assert.Equal(96, ((JT808_0x0200_0x01)JT808Bodies.Positions[1].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(66, ((JT808_0x0200_0x02)JT808Bodies.Positions[1].JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(96, ((JT808_0x0200_0x01)JT808Bodies.Positions[1].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(66, ((JT808_0x0200_0x02)JT808Bodies.Positions[1].BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
} | |||
[Fact] | |||
@@ -41,15 +41,15 @@ namespace JT808.Protocol.Test.Simples | |||
Speed = 60, | |||
Direction = 0, | |||
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 | |||
}); | |||
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 | |||
}); | |||
@@ -12,113 +12,622 @@ using JT808.Protocol.Formatters; | |||
using JT808.Protocol.MessagePack; | |||
using System.Text.Json; | |||
using JT808.Protocol.MessageBody.CarDVR; | |||
using JT808.Protocol.Test.JT808LocationAttach; | |||
namespace JT808.Protocol.Test.Simples | |||
{ | |||
/// <summary> | |||
/// 主要测试 | |||
/// 1:1 正常自定义附加 | |||
/// 2:1 非正常自定义附加 | |||
/// 2:2 非正常自定义附加 | |||
/// 1:4 粤标自定义附加 | |||
/// 感谢大兄弟提供的真实设备数据 | |||
/// </summary> | |||
public class Demo10 | |||
{ | |||
JT808Serializer JT808Serializer; | |||
public class Demo10ConfigBase : GlobalConfigBase | |||
{ | |||
public override string ConfigId { get; protected set; } = "demo10Config"; | |||
} | |||
public Demo10() | |||
{ | |||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<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); | |||
} | |||
[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 | |||
{ | |||
AlarmFlag = 1, | |||
Altitude = 40, | |||
GPSTime = DateTime.Parse("2021-04-03 11:10:10"), | |||
GPSTime = DateTime.Parse("2021-08-30 18:17:10"), | |||
Lat = 12222222, | |||
Lng = 132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
JT808CustomLocationAttachData = new Dictionary<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] | |||
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(132444444, jT808UploadLocationRequest.Lng); | |||
Assert.Equal(60, jT808UploadLocationRequest.Speed); | |||
Assert.Equal((uint)2, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal(new byte[] { 0, 1, 2, 3 }, ((JT808LocationAttachImpl0x00)jT808UploadLocationRequest.JT808CustomLocationAttachData[0x00]).TestValue); | |||
Assert.Equal("012345678912", ((JT808LocationAttachImpl0x00)jT808UploadLocationRequest.ExceptionLocationAttachData[0]).TestId); | |||
Assert.Equal(2u, jT808UploadLocationRequest.StatusFlag); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(55, ((JT808_0x0200_0x02)jT808UploadLocationRequest.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
var jT808LocationAttachImpl0X62 = (JT808LocationAttachImpl0x62)jT808UploadLocationRequest.CustomLocationAttachData4[0x62]; | |||
Assert.Equal(0x62, jT808LocationAttachImpl0X62.AttachInfoId); | |||
Assert.Equal(new byte[256], jT808LocationAttachImpl0X62.Data); | |||
Assert.Equal(256u, jT808LocationAttachImpl0X62.AttachInfoLength); | |||
var jT808LocationAttachImpl0XDE = (JT808LocationAttachImpl0xDE)jT808UploadLocationRequest.CustomLocationAttachData2[0xDE]; | |||
Assert.Equal(0xDE, jT808LocationAttachImpl0XDE.AttachInfoId); | |||
Assert.Equal(new byte[66], jT808LocationAttachImpl0XDE.TestValue); | |||
Assert.Equal(66u, jT808LocationAttachImpl0XDE.AttachInfoLength); | |||
var jT808LocationAttachImpl0XDD = (JT808LocationAttachImpl0xDD)jT808UploadLocationRequest.CustomLocationAttachData3[0xDD]; | |||
Assert.Equal(0xDD, jT808LocationAttachImpl0XDD.AttachInfoId); | |||
Assert.Equal(new byte[66], jT808LocationAttachImpl0XDD.TestValue); | |||
Assert.Equal(66u, jT808LocationAttachImpl0XDD.AttachInfoLength); | |||
var jT808LocationAttachImpl0XDF = (JT808LocationAttachImpl0xDF)jT808UploadLocationRequest.CustomLocationAttachData[0xDF]; | |||
Assert.Equal(0xDF, jT808LocationAttachImpl0XDF.AttachInfoId); | |||
Assert.Equal(new byte[66], jT808LocationAttachImpl0XDF.TestValue); | |||
Assert.Equal(66u, jT808LocationAttachImpl0XDF.AttachInfoLength); | |||
Assert.True(jT808UploadLocationRequest.UnknownLocationAttachData.ContainsKey(0xCA)); | |||
Assert.True(jT808UploadLocationRequest.UnknownLocationAttachData.ContainsKey(0xCB)); | |||
Assert.Equal(new byte[3] { 0xCA, 0x1, 0xFF },jT808UploadLocationRequest.UnknownLocationAttachData[0xCA]); | |||
Assert.Equal(new byte[4] { 0xCB, 0x2, 0xFF, 0xFE },jT808UploadLocationRequest.UnknownLocationAttachData[0xCB]); | |||
//理论上组包的时候不会添加异常的原始数据下去 | |||
Assert.Equal(new byte[4] { 0xCD, 0x2, 0xFF, 0xFE },jT808UploadLocationRequest.UnknownLocationAttachData[0xCD]); | |||
Assert.Empty(jT808UploadLocationRequest.ExceptionLocationAttachOriginalData); | |||
} | |||
[Fact] | |||
public void Test_Repeat_1() | |||
{ | |||
JT808Package jT808Package = new JT808Package(); | |||
jT808Package.Header = new JT808Header | |||
{ | |||
MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), | |||
ManualMsgNum = 1, | |||
TerminalPhoneNo = "1122334455", | |||
}; | |||
JT808_0x0200 jT808UploadLocationRequest = new JT808_0x0200 | |||
{ | |||
AlarmFlag = 1, | |||
Altitude = 40, | |||
GPSTime = DateTime.Parse("2021-08-30 18:17:10"), | |||
Lat = 12222222, | |||
Lng = 132444444, | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
BasicLocationAttachData = new Dictionary<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> | |||
/// 附加Id 0x00 | |||
/// 附加Id 0xDF | |||
/// </summary> | |||
public override byte AttachInfoId { get; set; } = 0x00; | |||
public override byte AttachInfoId { get; set; } = 0xDF; | |||
/// <summary> | |||
/// 不固定 | |||
/// | |||
/// </summary> | |||
public override byte AttachInfoLength { get; set; } | |||
/// <summary> | |||
/// 只能存在一个 AttachInfoLength == 12 | |||
/// | |||
/// </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> | |||
/// 只能存在一个 AttachInfoLength == 4 | |||
/// | |||
/// </summary> | |||
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 System.Linq; | |||
using JT808.Protocol.Test.JT808LocationAttach; | |||
using static JT808.Protocol.MessageBody.JT808_0x8105; | |||
using System.Buffers.Binary; | |||
using Newtonsoft.Json; | |||
namespace JT808.Protocol.Test.Simples | |||
{ | |||
@@ -24,73 +27,249 @@ namespace JT808.Protocol.Test.Simples | |||
public Demo12() | |||
{ | |||
IJT808Config jT808Config = new DefaultGlobalConfig(); | |||
jT808Config.JT808_0X0200_Custom_Factory.SetMap<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); | |||
} | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT808Package jT808Package = new JT808Package(); | |||
jT808Package.Header = new JT808Header | |||
JT808Package jT808Package = new JT808Package | |||
{ | |||
MsgId = Enums.JT808MsgId.位置信息汇报.ToUInt16Value(), | |||
ManualMsgNum = 1, | |||
TerminalPhoneNo = "1122334455", | |||
Header = new JT808Header | |||
{ | |||
MsgId = Enums.JT808MsgId.终端控制.ToUInt16Value(), | |||
ManualMsgNum = 1, | |||
TerminalPhoneNo = "12345678900", | |||
}, | |||
Bodies = new JT808_0x8105 | |||
{ | |||
CommandWord = 1, | |||
CustomCommandParameters=new List<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() | |||
{ | |||
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] | |||
@@ -40,236 +48,115 @@ namespace JT808.Protocol.Test.Simples | |||
{ | |||
Header = new JT808Header | |||
{ | |||
MsgId = Enums.JT808MsgId.终端控制.ToUInt16Value(), | |||
ManualMsgNum = 1, | |||
TerminalPhoneNo = "12345678900", | |||
MsgId = Enums.JT808MsgId.终端通用应答.ToUInt16Value(), | |||
ManualMsgNum = 1203, | |||
TerminalPhoneNo = "012345678900", | |||
}, | |||
Bodies = new JT808_0x8105 | |||
Bodies = new JT808_0x0001_Replace | |||
{ | |||
CommandWord = 1, | |||
CustomCommandParameters=new List<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(); | |||
Assert.Equal("7E8105002A0123456789000001013B3B3B3B3B3B3B3B3B3B3B3B3B000000173B536D616C6C43686900003BFF486170707900000000003B827E", hex); | |||
Assert.Equal("7E0001000701234567890004B303E800020000A8797E", 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() | |||
{ | |||
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> | |||
/// ICusotmCommandParameter 自定义命令参数接口 | |||
/// ICommandParameterValue<> 对应的数据类型值 | |||
/// 注意:Order必须从13开始逐一递增 | |||
/// 0x0001 | |||
/// </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> | |||
/// ICusotmCommandParameter 自定义命令参数接口 | |||
/// ICommandParameterValue<> 对应的数据类型值 | |||
/// 注意:Order必须从13开始逐一递增 | |||
/// 结果 | |||
/// 0:成功/确认;1:失败;2:消息有误;3:不支持 | |||
/// </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> | |||
/// ICusotmCommandParameter 自定义命令参数接口 | |||
/// ICommandParameterValue<> 对应的数据类型值 | |||
/// 注意:Order必须从13开始逐一递增 | |||
/// 测试 | |||
/// </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> | |||
/// Koike3为对象 | |||
/// ICommandParameterConvert:命令参数转换 | |||
/// ToString:为对象类型用于分析器自定义显示 | |||
/// | |||
/// </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> | |||
/// ICusotmCommandParameter 自定义命令参数接口 | |||
/// ICommandParameterValue<> 对应的数据类型值 | |||
/// 注意:Order必须从13开始逐一递增 | |||
/// | |||
/// </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() | |||
{ | |||
IServiceCollection serviceDescriptors = new ServiceCollection(); | |||
serviceDescriptors.AddJT808Configure(new DefaultGlobalConfig("replace")); | |||
serviceDescriptors.AddJT808Configure(); | |||
//通常在startup中使用app的Use进行扩展 | |||
IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); | |||
Use(serviceProvider); | |||
} | |||
void Use(IServiceProvider serviceProvider) | |||
{ | |||
IJT808Config jT808Config = serviceProvider.GetRequiredService<DefaultGlobalConfig>(); | |||
//替换原有消息存在的BUG | |||
jT808Config.ReplaceMsgId<JT808_0x0001, JT808_0x0001_Replace>(); | |||
JT808Serializer = jT808Config.GetSerializer(); | |||
JT808Serializer = serviceProvider.GetRequiredService<IJT808Config>().GetSerializer(); | |||
} | |||
[Fact] | |||
public void Test1() | |||
{ | |||
JT808Package jT808Package = new JT808Package | |||
{ | |||
Header = new JT808Header | |||
{ | |||
MsgId = Enums.JT808MsgId.终端通用应答.ToUInt16Value(), | |||
ManualMsgNum = 1203, | |||
TerminalPhoneNo = "012345678900", | |||
}, | |||
Bodies = new JT808_0x0001_Replace | |||
{ | |||
ReplyMsgId = Enums.JT808MsgId.终端心跳.ToUInt16Value(), | |||
ReplyMsgNum = 1000, | |||
TerminalResult = Enums.JT808TerminalResult.Success, | |||
Test=168 | |||
} | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); | |||
Assert.Equal("7E0001000701234567890004B303E800020000A8797E", hex); | |||
} | |||
[Fact] | |||
public void Test2() | |||
{ | |||
var bytes = "7E0001000701234567890004B303E800020000A8797E".ToHexBytes(); | |||
JT808Package jT808Package = JT808Serializer.Deserialize<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] | |||
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((uint)2, jT808_0x0200.StatusFlag); | |||
//4.1.附加信息1 | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); | |||
//4.2.附加信息2 | |||
Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); | |||
} | |||
} | |||
} |
@@ -34,7 +34,7 @@ namespace JT808.Protocol.Test.Simples | |||
Speed = 60, | |||
Direction = 0, | |||
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_0x02,new JT808_0x0200_0x02{Oil = 125}} | |||
@@ -48,7 +48,7 @@ namespace JT808.Protocol.Test.Simples | |||
Speed = 60, | |||
Direction = 0, | |||
StatusFlag = 2, | |||
JT808CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase> | |||
CustomLocationAttachData = new Dictionary<byte, JT808_0x0200_CustomBodyBase> | |||
{ | |||
{0x81,new JT808_0x0200_DT1_0x81 { | |||
Age=15, | |||
@@ -62,7 +62,7 @@ namespace JT808.Protocol.Test.Simples | |||
var jT808PackageResult = demo5JT808Serializer.Deserialize<JT808Package>(data); | |||
JT808_0x0200 jT808_0X0200 = jT808PackageResult.Bodies as JT808_0x0200; | |||
var attach = DeviceTypeFactory.Create(cache[jT808PackageResult.Header.TerminalPhoneNo], jT808_0X0200.JT808CustomLocationAttachData); | |||
var attach = DeviceTypeFactory.Create(cache[jT808PackageResult.Header.TerminalPhoneNo], jT808_0X0200.CustomLocationAttachData); | |||
var extJson = attach.ExtData.Data.ToString(Formatting.None); | |||
var attachinfo81 = (JT808_0x0200_DT1_0x81)attach.JT808CustomLocationAttachData[0x81]; | |||
Assert.Equal((uint)15, attachinfo81.Age); | |||
@@ -11,14 +11,44 @@ namespace JT808.Protocol.Interfaces | |||
public interface IJT808_0x0200_Custom_Factory: IJT808ExternalRegister | |||
{ | |||
/// <summary> | |||
/// | |||
/// map JT808_0x0200_CustomBodyBase | |||
/// </summary> | |||
IDictionary<byte, object> Map { get; } | |||
/// <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> | |||
/// <typeparam name="TJT808_0x0200_CustomBody"></typeparam> | |||
/// <returns></returns> | |||
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<ushort, object> Map2 { get; } | |||
public IDictionary<ushort, object> Map3 { get; } | |||
public IDictionary<byte, object> Map4 { get; } | |||
public JT808_0x0200_Custom_Factory() | |||
{ | |||
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) | |||
@@ -33,6 +42,51 @@ namespace JT808.Protocol.Internal | |||
Map.Add(attachid, instance); | |||
} | |||
} | |||
var types2 = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase2)).ToList(); | |||
foreach (var type in types2) | |||
{ | |||
var instance = Activator.CreateInstance(type); | |||
var attachid = (ushort)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase2.AttachInfoId)).GetValue(instance); | |||
if (Map2.ContainsKey(attachid)) | |||
{ | |||
throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); | |||
} | |||
else | |||
{ | |||
Map2.Add(attachid, instance); | |||
} | |||
} | |||
var types3 = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase3)).ToList(); | |||
foreach (var type in types3) | |||
{ | |||
var instance = Activator.CreateInstance(type); | |||
var attachid = (ushort)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase3.AttachInfoId)).GetValue(instance); | |||
if (Map3.ContainsKey(attachid)) | |||
{ | |||
throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); | |||
} | |||
else | |||
{ | |||
Map3.Add(attachid, instance); | |||
} | |||
} | |||
var types4 = externalAssembly.GetTypes().Where(w => w.BaseType == typeof(JT808_0x0200_CustomBodyBase4)).ToList(); | |||
foreach (var type in types4) | |||
{ | |||
var instance = Activator.CreateInstance(type); | |||
var attachid = (byte)type.GetProperty(nameof(JT808_0x0200_CustomBodyBase4.AttachInfoId)).GetValue(instance); | |||
if (Map4.ContainsKey(attachid)) | |||
{ | |||
throw new ArgumentException($"{type.FullName} {attachid} An element with the same key already exists."); | |||
} | |||
else | |||
{ | |||
Map4.Add(attachid, instance); | |||
} | |||
} | |||
} | |||
public IJT808_0x0200_Custom_Factory SetMap<TJT808_0x0200_CustomBody>() where TJT808_0x0200_CustomBody : JT808_0x0200_CustomBodyBase | |||
@@ -50,5 +104,53 @@ namespace JT808.Protocol.Internal | |||
} | |||
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 name="P:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.Map"> | |||
<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> | |||
</member> | |||
<member name="M:JT808.Protocol.Interfaces.IJT808_0x0200_Custom_Factory.SetMap``1"> | |||
@@ -4259,6 +4274,27 @@ | |||
<typeparam name="TJT808_0x0200_CustomBody"></typeparam> | |||
<returns></returns> | |||
</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"> | |||
<summary> | |||
0x0200附加信息工厂 | |||
@@ -9079,17 +9115,12 @@ | |||
YY-MM-DD-hh-mm-ss(GMT+8 时间,本标准中之后涉及的时间均采用此时区) | |||
</summary> | |||
</member> | |||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.JT808LocationAttachData"> | |||
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200.BasicLocationAttachData"> | |||
<summary> | |||
位置附加信息 | |||
基础位置附加信息 | |||
</summary> | |||
</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> | |||
自定义位置附加信息 | |||
场景: | |||
@@ -9101,32 +9132,32 @@ | |||
依赖平台录入的设备类型 | |||
</summary> | |||
</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> | |||
有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||
形如: | |||
00 0C 这个是长度 | |||
00 B2 这个是长度 | |||
实际解析 | |||
00 附加信息Id | |||
0C 附加信息长度 | |||
00 附加信息Id | |||
B2 附加信息长度 | |||
只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||
自定义位置附加信息4 | |||
</summary> | |||
</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> | |||
有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||
形如: | |||
00 0C 这个是长度 | |||
00 B2 这个是长度 | |||
实际解析 | |||
00 附加信息Id | |||
0C 附加信息长度 | |||
00 附加信息Id | |||
B2 附加信息长度 | |||
只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||
设备未知自定义附加数据(未注册)、数据解析异常 | |||
</summary> | |||
</member> | |||
<member name="M:JT808.Protocol.MessageBody.JT808_0x0200.Deserialize(JT808.Protocol.MessagePack.JT808MessagePackReader@,JT808.Protocol.IJT808Config)"> | |||
@@ -9955,11 +9986,53 @@ | |||
自定义附加信息长度 | |||
</summary> | |||
</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> | |||
附加信息长度扩展 | |||
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> | |||
</member> | |||
<member name="T:JT808.Protocol.MessageBody.JT808_0x0201"> | |||
@@ -5,6 +5,7 @@ using JT808.Protocol.Formatters; | |||
using JT808.Protocol.Interfaces; | |||
using JT808.Protocol.MessagePack; | |||
using System; | |||
using System.Buffers.Binary; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text.Json; | |||
@@ -62,13 +63,9 @@ namespace JT808.Protocol.MessageBody | |||
/// </summary> | |||
public DateTime GPSTime { get; set; } | |||
/// <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> | |||
/// 自定义位置附加信息 | |||
/// 场景: | |||
@@ -79,33 +76,30 @@ namespace JT808.Protocol.MessageBody | |||
/// 缺点: | |||
/// 依赖平台录入的设备类型 | |||
/// </summary> | |||
public Dictionary<byte, JT808_0x0200_CustomBodyBase> JT808CustomLocationAttachData { get; set; } | |||
public Dictionary<byte, JT808_0x0200_CustomBodyBase> CustomLocationAttachData { get; set; } | |||
/// <summary> | |||
/// 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||
/// 形如: | |||
/// 00 0C 这个是长度 | |||
/// 00 B2 这个是长度 | |||
/// 实际解析 | |||
/// 00 附加信息Id | |||
/// 0C 附加信息长度 | |||
/// 00 附加信息Id | |||
/// B2 附加信息长度 | |||
/// 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||
/// 自定义位置附加信息2 | |||
/// </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> | |||
/// 有些坑爹的设备,不讲武德,不会按照国标的附加信息Id来搞,变成附加信息Id搞为两个字节,导致解析的时候出问题,存在重复的附加Id。 | |||
/// 形如: | |||
/// 00 0C 这个是长度 | |||
/// 00 B2 这个是长度 | |||
/// 实际解析 | |||
/// 00 附加信息Id | |||
/// 0C 附加信息长度 | |||
/// 00 附加信息Id | |||
/// B2 附加信息长度 | |||
/// 只能兼容作为一个字节的兼容,恰恰好一般长度不会超过255,要是超过就去怼厂家吧 | |||
/// 自定义位置附加信息4 | |||
/// </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> | |||
@@ -138,88 +132,145 @@ namespace JT808.Protocol.MessageBody | |||
jT808_0X0200.Direction = reader.ReadUInt16(); | |||
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.ExceptionLocationAttachData = new List<JT808_0x0200_CustomBodyBase>(); | |||
jT808_0X0200.UnknownLocationAttachData = new Dictionary<ushort, byte[]>(); | |||
while (reader.ReadCurrentRemainContentLength() > 0) | |||
{ | |||
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()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(jT808LocationAttachInstance, ref reader, config); | |||
jT808_0X0200.JT808LocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); | |||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachInstance, ref reader, config); | |||
jT808_0X0200.BasicLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); | |||
} | |||
} | |||
else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId,out object customAttachInstance)) | |||
else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance)) | |||
{ | |||
if (jT808_0X0200.JT808CustomLocationAttachData.ContainsKey(attachId)) | |||
if (jT808_0X0200.CustomLocationAttachData.ContainsKey(attachId)) | |||
{ | |||
//目前根据坑爹的协议只做了附加Id相同的情况下,长度不同的解析方式。 | |||
//在已知的情况:附加Id相同,但是长度不同的时候,只能当做用长度来识别是对应的哪个,然后把数据剩下一个放在异常附加数据里面 | |||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config); | |||
jT808_0X0200.ExceptionLocationAttachData.Add(attachImpl); | |||
reader.Skip(1); | |||
byte attachLen = reader.ReadByte(); | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config); | |||
jT808_0X0200.JT808CustomLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); | |||
jT808_0X0200.CustomLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); | |||
} | |||
} | |||
else if (config.JT808_0X0200_Custom_Factory.Map2.TryGetValue(attachId2_3, out object customAttachInstance2)) | |||
{ | |||
if (jT808_0X0200.CustomLocationAttachData2.ContainsKey(attachId2_3)) | |||
{ | |||
reader.Skip(2); | |||
byte attachLen = reader.ReadByte(); | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 3, attachLen + 3).ToArray()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance2, ref reader, config); | |||
jT808_0X0200.CustomLocationAttachData2.Add(attachImpl.AttachInfoId, attachImpl); | |||
} | |||
} | |||
else if (config.JT808_0X0200_Custom_Factory.Map4.TryGetValue(attachId, out object customAttachInstance4)) | |||
{ | |||
if (jT808_0X0200.CustomLocationAttachData4.ContainsKey(attachId)) | |||
{ | |||
reader.Skip(1); | |||
int attachLen = reader.ReadInt32(); | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 5, attachLen + 5).ToArray()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance4, ref reader, config); | |||
jT808_0X0200.CustomLocationAttachData4.Add(attachImpl.AttachInfoId, attachImpl); | |||
} | |||
} | |||
else if (config.JT808_0X0200_Custom_Factory.Map3.TryGetValue(attachId2_3, out object customAttachInstance3)) | |||
{ | |||
if (jT808_0X0200.CustomLocationAttachData3.ContainsKey(attachId2_3)) | |||
{ | |||
reader.Skip(2); | |||
ushort attachLen = reader.ReadUInt16(); | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 4, attachLen + 4).ToArray()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance3, ref reader, config); | |||
jT808_0X0200.CustomLocationAttachData3.Add(attachImpl.AttachInfoId, attachImpl); | |||
} | |||
} | |||
else | |||
{ | |||
reader.Skip(2); | |||
if (jT808_0X0200.JT808UnknownLocationAttachOriginalData.ContainsKey(attachId)) | |||
//未知的附加只通过标准的自定义附加信息来解析,其余的通过自己注册,自己实现的方式来解析 | |||
reader.Skip(1); | |||
byte attachLen = reader.ReadByte(); | |||
int remainLength = reader.ReadCurrentRemainContentLength(); | |||
if(remainLength < attachLen) | |||
{ | |||
//未知的情况下:存在重复的就不解析,把数据统一放在异常定位数据里面 | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(remainLength).ToArray()); | |||
} | |||
else | |||
{ | |||
jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||
if (jT808_0X0200.UnknownLocationAttachData.ContainsKey(attachId)) | |||
{ | |||
//存在重复的就不解析,把数据统一放在异常定位数据里面 | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||
} | |||
else | |||
{ | |||
jT808_0X0200.UnknownLocationAttachData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||
} | |||
reader.Skip(attachLen); | |||
} | |||
reader.Skip(attachLen); | |||
} | |||
} | |||
catch | |||
{ | |||
try | |||
{ | |||
byte attachId = reader.ReadByte(); | |||
byte attachLen = reader.ReadByte(); | |||
if (jT808_0X0200.JT808UnknownLocationAttachOriginalData.ContainsKey(attachId)) | |||
{ | |||
//未知的情况下:存在重复的就不解析,把数据统一放在异常定位数据里面 | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||
} | |||
else | |||
var remainLength = reader.ReadCurrentRemainContentLength(); | |||
if (remainLength > 0) | |||
{ | |||
jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); | |||
jT808_0X0200.ExceptionLocationAttachOriginalData.Add(reader.ReadArray(remainLength).ToArray()); | |||
break; | |||
} | |||
reader.Skip(attachLen); | |||
} | |||
catch (Exception ex) | |||
{ | |||
throw; | |||
break; | |||
} | |||
} | |||
} | |||
return jT808_0X0200; | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
@@ -263,9 +314,9 @@ namespace JT808.Protocol.MessageBody | |||
writer.WriteUInt16(value.Speed); | |||
writer.WriteUInt16(value.Direction); | |||
writer.WriteDateTime6(value.GPSTime); | |||
if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0) | |||
if (value.BasicLocationAttachData != null && value.BasicLocationAttachData.Count > 0) | |||
{ | |||
foreach (var item in value.JT808LocationAttachData) | |||
foreach (var item in value.BasicLocationAttachData) | |||
{ | |||
try | |||
{ | |||
@@ -277,18 +328,52 @@ namespace JT808.Protocol.MessageBody | |||
} | |||
} | |||
} | |||
if (value.JT808CustomLocationAttachData != null && value.JT808CustomLocationAttachData.Count > 0) | |||
if (value.CustomLocationAttachData != null && value.CustomLocationAttachData.Count > 0) | |||
{ | |||
foreach (var item in value.JT808CustomLocationAttachData) | |||
foreach (var item in value.CustomLocationAttachData) | |||
{ | |||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); | |||
} | |||
} | |||
if (value.ExceptionLocationAttachData != null && value.ExceptionLocationAttachData.Count > 0) | |||
if (value.CustomLocationAttachData2 != null && value.CustomLocationAttachData2.Count > 0) | |||
{ | |||
foreach (var item in value.CustomLocationAttachData2) | |||
{ | |||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); | |||
} | |||
} | |||
if (value.CustomLocationAttachData3 != null && value.CustomLocationAttachData3.Count > 0) | |||
{ | |||
foreach (var item in value.CustomLocationAttachData3) | |||
{ | |||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); | |||
} | |||
} | |||
if (value.CustomLocationAttachData4 != null && value.CustomLocationAttachData4.Count > 0) | |||
{ | |||
foreach (var item in value.CustomLocationAttachData4) | |||
{ | |||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); | |||
} | |||
} | |||
if (value.UnknownLocationAttachData!=null && value.UnknownLocationAttachData.Count > 0) | |||
{ | |||
foreach (var item in value.UnknownLocationAttachData) | |||
{ | |||
if(item.Value!=null && item.Value.Length >= 2) | |||
{ | |||
writer.WriteArray(item.Value); | |||
} | |||
} | |||
} | |||
if (value.ExceptionLocationAttachOriginalData != null && value.ExceptionLocationAttachOriginalData.Count > 0) | |||
{ | |||
foreach (var item in value.ExceptionLocationAttachData) | |||
foreach (var item in value.ExceptionLocationAttachOriginalData) | |||
{ | |||
JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); | |||
if (item != null && item.Length >= 2) | |||
{ | |||
writer.WriteArray(item); | |||
} | |||
} | |||
} | |||
} | |||
@@ -430,57 +515,168 @@ namespace JT808.Protocol.MessageBody | |||
value.GPSTime = reader.ReadDateTime6(); | |||
writer.WriteString($"[{value.GPSTime:yyMMddHHmmss}]定位时间", value.GPSTime.ToString("yyyy-MM-dd HH:mm:ss")); | |||
// 位置附加信息 | |||
value.BasicLocationAttachData = new Dictionary<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("附加信息列表"); | |||
while (reader.ReadCurrentRemainContentLength() > 0) | |||
{ | |||
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)) | |||
{ | |||
writer.WriteStartObject(); | |||
customAttachInstance.Analyze(ref reader, writer, config); | |||
writer.WriteEndObject(); | |||
if (value.CustomLocationAttachData.ContainsKey(attachId)) | |||
{ | |||
reader.Skip(1); | |||
byte attachLen = reader.ReadByte(); | |||
writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | |||
writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); | |||
writer.WriteString($"未知附加信息_{attachId}", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
writer.WriteStartObject(); | |||
customAttachInstance.Analyze(ref reader, writer, config); | |||
writer.WriteEndObject(); | |||
value.CustomLocationAttachData.Add(attachId, null); | |||
} | |||
} | |||
else if (config.JT808_0X0200_Custom_Factory.Map4.TryGetValue(attachId, out object customAttachInstance4)) | |||
{ | |||
if (value.CustomLocationAttachData4.ContainsKey(attachId)) | |||
{ | |||
reader.Skip(1); | |||
int attachLen = reader.ReadInt32(); | |||
writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | |||
writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); | |||
writer.WriteString($"未知附加信息1_4_{attachId}", reader.ReadArray(reader.ReaderCount - 5, attachLen + 5).ToArray().ToHexString()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
writer.WriteStartObject(); | |||
customAttachInstance4.Analyze(ref reader, writer, config); | |||
writer.WriteEndObject(); | |||
value.CustomLocationAttachData4.Add(attachId, null); | |||
} | |||
} | |||
else if (config.JT808_0X0200_Custom_Factory.Map2.TryGetValue(attachId2_3, out object customAttachInstance2)) | |||
{ | |||
if (value.CustomLocationAttachData2.ContainsKey(attachId2_3)) | |||
{ | |||
reader.Skip(2); | |||
byte attachLen = reader.ReadByte(); | |||
writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | |||
writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); | |||
writer.WriteString($"未知附加信息2_1", reader.ReadArray(reader.ReaderCount - 3, attachLen + 3).ToArray().ToHexString()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
writer.WriteStartObject(); | |||
customAttachInstance2.Analyze(ref reader, writer, config); | |||
writer.WriteEndObject(); | |||
value.CustomLocationAttachData2.Add(attachId2_3, null); | |||
} | |||
} | |||
else if (config.JT808_0X0200_Custom_Factory.Map3.TryGetValue(attachId2_3, out object customAttachInstance3)) | |||
{ | |||
if (value.CustomLocationAttachData3.ContainsKey(attachId2_3)) | |||
{ | |||
reader.Skip(2); | |||
ushort attachLen = reader.ReadUInt16(); | |||
writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | |||
writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); | |||
writer.WriteString($"未知附加信息2_2_{attachId}", reader.ReadArray(reader.ReaderCount - 4, attachLen + 4).ToArray().ToHexString()); | |||
reader.Skip(attachLen); | |||
} | |||
else | |||
{ | |||
writer.WriteStartObject(); | |||
customAttachInstance3.Analyze(ref reader, writer, config); | |||
writer.WriteEndObject(); | |||
value.CustomLocationAttachData3.Add(attachId2_3, null); | |||
} | |||
} | |||
else | |||
{ | |||
//未知的附加只通过标准的自定义附加信息来解析,其余的通过自己注册,自己实现的方式来解析 | |||
reader.Skip(1); | |||
byte attachLen = reader.ReadByte(); | |||
int remainLength = reader.ReadCurrentRemainContentLength(); | |||
writer.WriteStartObject(); | |||
reader.Skip(2); | |||
writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | |||
writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); | |||
writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); | |||
reader.Skip(attachLen); | |||
if ((attachLen+2) > remainLength) | |||
{ | |||
writer.WriteString($"未知附加信息", reader.ReadArray(remainLength).ToArray().ToHexString()); | |||
} | |||
else | |||
{ | |||
writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); | |||
reader.Skip(attachLen); | |||
} | |||
writer.WriteEndObject(); | |||
} | |||
} | |||
catch | |||
catch (Exception ex) | |||
{ | |||
writer.WriteStartObject(); | |||
writer.WriteString($"解析外部部未知附加信息报错", ex.StackTrace); | |||
try | |||
{ | |||
byte attachId = reader.ReadByte(); | |||
byte attachLen = reader.ReadByte(); | |||
writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); | |||
writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); | |||
writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); | |||
reader.Skip(attachLen); | |||
var remainLength = reader.ReadCurrentRemainContentLength(); | |||
if (remainLength > 0) | |||
{ | |||
writer.WriteString($"未知附加信息", reader.ReadArray(remainLength).ToArray().ToHexString()); | |||
} | |||
else | |||
{ | |||
writer.WriteStartObject(); | |||
writer.WriteString($"未知附加信息", "无"); | |||
writer.WriteEndObject(); | |||
} | |||
} | |||
catch | |||
catch (Exception innerEx) | |||
{ | |||
throw; | |||
writer.WriteString($"解析内部未知附加信息报错", innerEx.StackTrace); | |||
} | |||
finally | |||
{ | |||
writer.WriteEndObject(); | |||
} | |||
break; | |||
} | |||
} | |||
writer.WriteEndArray(); | |||
@@ -44,21 +44,21 @@ namespace JT808.Protocol.MessageBody | |||
var carSignalStatus = Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0').AsSpan(); | |||
writer.WriteString("值", Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0')); | |||
writer.WriteString("bit15~31", "保留"); | |||
writer.WriteString("bit14", (value.CarSignalStatus & 16384) == 16384 ? "离合器状态" : "无"); | |||
writer.WriteString("bit13", (value.CarSignalStatus & 8192) == 8192 ? "加热器工作" : "无"); | |||
writer.WriteString("bit12", (value.CarSignalStatus & 4096) == 4096 ? "ABS工作" : "无"); | |||
writer.WriteString("bit11", (value.CarSignalStatus & 2048) == 2048 ? "缓速器工作" : "无"); | |||
writer.WriteString("bit10", (value.CarSignalStatus & 1024) == 1024 ? "空挡信号" : "无"); | |||
writer.WriteString("bit9", (value.CarSignalStatus & 512) == 512 ? "空调状态" : "无"); | |||
writer.WriteString("bit8", (value.CarSignalStatus & 256) == 256 ? "喇叭信号" : "无"); | |||
writer.WriteString("bit7", (value.CarSignalStatus & 128) == 128 ? "示廓灯" : "无"); | |||
writer.WriteString("bit6", (value.CarSignalStatus & 64) == 64 ? "雾灯信号" : "无"); | |||
writer.WriteString("bit5", (value.CarSignalStatus & 32) == 32 ? "倒档信号" : "无"); | |||
writer.WriteString("bit4", (value.CarSignalStatus & 16) == 16 ? "制动信号" : "无"); | |||
writer.WriteString("bit3", (value.CarSignalStatus & 8) == 8 ? "左转向灯信号" : "无"); | |||
writer.WriteString("bit2", (value.CarSignalStatus & 4) == 4 ? "右转向灯信号" : "无"); | |||
writer.WriteString("bit1", (value.CarSignalStatus & 2) == 2 ? "远光灯信号" : "无"); | |||
writer.WriteString("bit0", (value.CarSignalStatus & 1) ==1?"近光灯信号":"无"); | |||
writer.WriteString("bit14-离合器状态", (value.CarSignalStatus & 16384) == 16384 ? "离合器状态" : "无"); | |||
writer.WriteString("bit13-加热器工作", (value.CarSignalStatus & 8192) == 8192 ? "加热器工作" : "无"); | |||
writer.WriteString("bit12-ABS工作", (value.CarSignalStatus & 4096) == 4096 ? "ABS工作" : "无"); | |||
writer.WriteString("bit11-缓速器工作", (value.CarSignalStatus & 2048) == 2048 ? "缓速器工作" : "无"); | |||
writer.WriteString("bit10-空挡信号", (value.CarSignalStatus & 1024) == 1024 ? "空挡信号" : "无"); | |||
writer.WriteString("bit9-空调状态", (value.CarSignalStatus & 512) == 512 ? "空调状态" : "无"); | |||
writer.WriteString("bit8-喇叭信号", (value.CarSignalStatus & 256) == 256 ? "喇叭信号" : "无"); | |||
writer.WriteString("bit7-示廓灯", (value.CarSignalStatus & 128) == 128 ? "示廓灯" : "无"); | |||
writer.WriteString("bit6-雾灯信号", (value.CarSignalStatus & 64) == 64 ? "雾灯信号" : "无"); | |||
writer.WriteString("bit5-倒档信号", (value.CarSignalStatus & 32) == 32 ? "倒档信号" : "无"); | |||
writer.WriteString("bit4-制动信号", (value.CarSignalStatus & 16) == 16 ? "制动信号" : "无"); | |||
writer.WriteString("bit3-左转向灯信号", (value.CarSignalStatus & 8) == 8 ? "左转向灯信号" : "无"); | |||
writer.WriteString("bit2-右转向灯信号", (value.CarSignalStatus & 4) == 4 ? "右转向灯信号" : "无"); | |||
writer.WriteString("bit1-远光灯信号", (value.CarSignalStatus & 2) == 2 ? "远光灯信号" : "无"); | |||
writer.WriteString("bit0-近光灯信号", (value.CarSignalStatus & 1) ==1?"近光灯信号":"无"); | |||
writer.WriteEndObject(); | |||
} | |||
/// <summary> | |||
@@ -11,16 +11,10 @@ namespace JT808.Protocol.MessageBody | |||
/// 自定义附加信息Id | |||
/// </summary> | |||
public abstract byte AttachInfoId { get; set; } | |||
/// <summary> | |||
/// 自定义附加信息长度 | |||
/// </summary> | |||
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; } | |||
} | |||
} |