ソースを参照

1.修改0x0200定位附加属性名称

2.兼容0x0200各个自定义附加数据
3.整合Demo10的各个自定义附加数据举例
4.修改readme文档
tags/v2.4.3
SmallChi(Koike) 3年前
コミット
f8270261ff
37個のファイルの変更1811行の追加859行の削除
  1. +27
    -21
      README.md
  2. +13
    -13
      src/JT808.Protocol.Benchmark/JT808SerializerContext.cs
  3. +12
    -12
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808LocationAttach.cs
  4. +6
    -6
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808_0x0200Test.cs
  5. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x64_Test.cs
  6. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x65_Test.cs
  7. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x66_Test.cs
  8. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x67_Test.cs
  9. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x64_Test.cs
  10. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x65_Test.cs
  11. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x66_Test.cs
  12. +3
    -3
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x67_Test.cs
  13. +0
    -1
      src/JT808.Protocol.Test/JT808.Protocol.Test.csproj
  14. +0
    -34
      src/JT808.Protocol.Test/MessageBody/JT808LocationAttachExtensions/JT808LocationAttachImpl0x62.cs
  15. +158
    -52
      src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs
  16. +5
    -5
      src/JT808.Protocol.Test/MessageBody/JT808_0x0201Test.cs
  17. +5
    -5
      src/JT808.Protocol.Test/MessageBody/JT808_0x0500Test.cs
  18. +10
    -10
      src/JT808.Protocol.Test/MessageBody/JT808_0x0704Test.cs
  19. +3
    -3
      src/JT808.Protocol.Test/Simples/Demo1.cs
  20. +554
    -45
      src/JT808.Protocol.Test/Simples/Demo10.cs
  21. +230
    -51
      src/JT808.Protocol.Test/Simples/Demo12.cs
  22. +94
    -207
      src/JT808.Protocol.Test/Simples/Demo13.cs
  23. +9
    -123
      src/JT808.Protocol.Test/Simples/Demo14.cs
  24. +42
    -7
      src/JT808.Protocol.Test/Simples/Demo15.cs
  25. +0
    -83
      src/JT808.Protocol.Test/Simples/Demo16.cs
  26. +2
    -2
      src/JT808.Protocol.Test/Simples/Demo2.cs
  27. +1
    -1
      src/JT808.Protocol.Test/Simples/Demo3.cs
  28. +2
    -2
      src/JT808.Protocol.Test/Simples/Demo4.cs
  29. +31
    -1
      src/JT808.Protocol/Interfaces/IJT808_0x0200_Custom_Factory.cs
  30. +102
    -0
      src/JT808.Protocol/Internal/JT808_0x0200_Custom_Factory.cs
  31. +108
    -35
      src/JT808.Protocol/JT808.Protocol.xml
  32. +290
    -94
      src/JT808.Protocol/MessageBody/JT808_0x0200.cs
  33. +15
    -15
      src/JT808.Protocol/MessageBody/JT808_0x0200_0x25.cs
  34. +1
    -7
      src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase.cs
  35. +22
    -0
      src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase2.cs
  36. +23
    -0
      src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase3.cs
  37. +22
    -0
      src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase4.cs

+ 27
- 21
README.md ファイルの表示

@@ -74,14 +74,14 @@ jT808_0x0200.Lng = 132444444;
jT808_0x0200.Speed = 60;
jT808_0x0200.Direction = 0;
jT808_0x0200.StatusFlag = 2;
jT808_0x0200.JT808LocationAttachData = new Dictionary<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安装



+ 13
- 13
src/JT808.Protocol.Benchmark/JT808SerializerContext.cs ファイルの表示

@@ -57,57 +57,57 @@ namespace JT808.Protocol.Benchmark
jT808UploadLocationRequest.Speed = 60;
jT808UploadLocationRequest.Direction = 0;
jT808UploadLocationRequest.StatusFlag = 2;
jT808UploadLocationRequest.JT808LocationAttachData = new Dictionary<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
});


+ 12
- 12
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808LocationAttach.cs ファイルの表示

@@ -35,25 +35,25 @@ namespace JT808.Protocol.Extensions.JT1078.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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]


+ 6
- 6
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JT1078.Test/JT808_0x0200Test.cs ファイルの表示

@@ -36,9 +36,9 @@ namespace JT808.Protocol.Extensions.JT1078.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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]


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x64_Test.cs ファイルの表示

@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x65_Test.cs ファイルの表示

@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x66_Test.cs ファイルの表示

@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.SuBiao.Test/JT808_0x0200_0x67_Test.cs ファイルの表示

@@ -32,9 +32,9 @@ namespace JT808.Protocol.Extensions.SuBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x64_Test.cs ファイルの表示

@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x65_Test.cs ファイルの表示

@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x66_Test.cs ファイルの表示

@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 3
- 3
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao.Test/JT808_0x0200_0x67_Test.cs ファイルの表示

@@ -31,9 +31,9 @@ namespace JT808.Protocol.Extensions.YueBiao.Test
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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);


+ 0
- 1
src/JT808.Protocol.Test/JT808.Protocol.Test.csproj ファイルの表示

@@ -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" />


+ 0
- 34
src/JT808.Protocol.Test/MessageBody/JT808LocationAttachExtensions/JT808LocationAttachImpl0x62.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);
}
}
}

+ 158
- 52
src/JT808.Protocol.Test/MessageBody/JT808_0x0200Test.cs ファイルの表示

@@ -43,13 +43,13 @@ namespace JT808.Protocol.Test.MessageBody
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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();


+ 5
- 5
src/JT808.Protocol.Test/MessageBody/JT808_0x0201Test.cs ファイルの表示

@@ -35,13 +35,13 @@ namespace JT808.Protocol.Test.MessageBody
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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]


+ 5
- 5
src/JT808.Protocol.Test/MessageBody/JT808_0x0500Test.cs ファイルの表示

@@ -32,13 +32,13 @@ namespace JT808.Protocol.Test.MessageBody
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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]


+ 10
- 10
src/JT808.Protocol.Test/MessageBody/JT808_0x0704Test.cs ファイルの表示

@@ -43,13 +43,13 @@ namespace JT808.Protocol.Test.MessageBody
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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]


+ 3
- 3
src/JT808.Protocol.Test/Simples/Demo1.cs ファイルの表示

@@ -41,15 +41,15 @@ namespace JT808.Protocol.Test.Simples
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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
});


+ 554
- 45
src/JT808.Protocol.Test/Simples/Demo10.cs ファイルの表示

@@ -12,113 +12,622 @@ using JT808.Protocol.Formatters;
using JT808.Protocol.MessagePack;
using System.Text.Json;
using JT808.Protocol.MessageBody.CarDVR;
using JT808.Protocol.Test.JT808LocationAttach;

namespace JT808.Protocol.Test.Simples
{
/// <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);
}
}
}

+ 230
- 51
src/JT808.Protocol.Test/Simples/Demo12.cs ファイルの表示

@@ -14,6 +14,9 @@ using System.Text.Json;
using JT808.Protocol.MessageBody.CarDVR;
using System.Linq;
using JT808.Protocol.Test.JT808LocationAttach;
using static JT808.Protocol.MessageBody.JT808_0x8105;
using System.Buffers.Binary;
using Newtonsoft.Json;

namespace JT808.Protocol.Test.Simples
{
@@ -24,73 +27,249 @@ namespace JT808.Protocol.Test.Simples
public Demo12()
{
IJT808Config jT808Config = new DefaultGlobalConfig();
jT808Config.JT808_0X0200_Custom_Factory.SetMap<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)
{

}
}
}
}

+ 94
- 207
src/JT808.Protocol.Test/Simples/Demo13.cs ファイルの表示

@@ -26,11 +26,19 @@ namespace JT808.Protocol.Test.Simples

public Demo13()
{
IJT808Config jT808Config = new DefaultGlobalConfig();
jT808Config.JT808_0x8105_Cusotm_Factory.SetMap<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);
}
}
}

+ 9
- 123
src/JT808.Protocol.Test/Simples/Demo14.cs ファイルの表示

@@ -27,136 +27,22 @@ namespace JT808.Protocol.Test.Simples
public Demo14()
{
IServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddJT808Configure(new DefaultGlobalConfig("replace"));
serviceDescriptors.AddJT808Configure();
//通常在startup中使用app的Use进行扩展
IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
Use(serviceProvider);
}

void Use(IServiceProvider serviceProvider)
{
IJT808Config jT808Config = serviceProvider.GetRequiredService<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);
}
}
}

+ 42
- 7
src/JT808.Protocol.Test/Simples/Demo15.cs ファイルの表示

@@ -36,13 +36,48 @@ namespace JT808.Protocol.Test.Simples
[Fact]
public void Test1()
{
var bytes = "7e0102400c01003000068109024a3130303330303030363831857e".ToHexBytes();
JT808Package jT808Package = JT808Serializer.Deserialize<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);
}
}
}

+ 0
- 83
src/JT808.Protocol.Test/Simples/Demo16.cs ファイルの表示

@@ -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);
}
}
}

+ 2
- 2
src/JT808.Protocol.Test/Simples/Demo2.cs ファイルの表示

@@ -50,9 +50,9 @@ namespace JT808.Protocol.Test.Simples
Assert.Equal(0, jT808_0x0200.Direction);
Assert.Equal((uint)2, jT808_0x0200.StatusFlag);
//4.1.附加信息1
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage);
Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage);
//4.2.附加信息2
Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil);
Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil);
}
}
}

+ 1
- 1
src/JT808.Protocol.Test/Simples/Demo3.cs ファイルの表示

@@ -34,7 +34,7 @@ namespace JT808.Protocol.Test.Simples
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808LocationAttachData = new Dictionary<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}}


+ 2
- 2
src/JT808.Protocol.Test/Simples/Demo4.cs ファイルの表示

@@ -48,7 +48,7 @@ namespace JT808.Protocol.Test.Simples
Speed = 60,
Direction = 0,
StatusFlag = 2,
JT808CustomLocationAttachData = new Dictionary<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);


+ 31
- 1
src/JT808.Protocol/Interfaces/IJT808_0x0200_Custom_Factory.cs ファイルの表示

@@ -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;
}
}

+ 102
- 0
src/JT808.Protocol/Internal/JT808_0x0200_Custom_Factory.cs ファイルの表示

@@ -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;
}
}
}

+ 108
- 35
src/JT808.Protocol/JT808.Protocol.xml ファイルの表示

@@ -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">


+ 290
- 94
src/JT808.Protocol/MessageBody/JT808_0x0200.cs ファイルの表示

@@ -5,6 +5,7 @@ using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System;
using System.Buffers.Binary;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
@@ -62,13 +63,9 @@ namespace JT808.Protocol.MessageBody
/// </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();


+ 15
- 15
src/JT808.Protocol/MessageBody/JT808_0x0200_0x25.cs ファイルの表示

@@ -44,21 +44,21 @@ namespace JT808.Protocol.MessageBody
var carSignalStatus = Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0').AsSpan();
writer.WriteString("值", Convert.ToString(value.CarSignalStatus, 2).PadLeft(32, '0'));
writer.WriteString("bit15~31", "保留");
writer.WriteString("bit14", (value.CarSignalStatus & 16384) == 16384 ? "离合器状态" : "无");
writer.WriteString("bit13", (value.CarSignalStatus & 8192) == 8192 ? "加热器工作" : "无");
writer.WriteString("bit12", (value.CarSignalStatus & 4096) == 4096 ? "ABS工作" : "无");
writer.WriteString("bit11", (value.CarSignalStatus & 2048) == 2048 ? "缓速器工作" : "无");
writer.WriteString("bit10", (value.CarSignalStatus & 1024) == 1024 ? "空挡信号" : "无");
writer.WriteString("bit9", (value.CarSignalStatus & 512) == 512 ? "空调状态" : "无");
writer.WriteString("bit8", (value.CarSignalStatus & 256) == 256 ? "喇叭信号" : "无");
writer.WriteString("bit7", (value.CarSignalStatus & 128) == 128 ? "示廓灯" : "无");
writer.WriteString("bit6", (value.CarSignalStatus & 64) == 64 ? "雾灯信号" : "无");
writer.WriteString("bit5", (value.CarSignalStatus & 32) == 32 ? "倒档信号" : "无");
writer.WriteString("bit4", (value.CarSignalStatus & 16) == 16 ? "制动信号" : "无");
writer.WriteString("bit3", (value.CarSignalStatus & 8) == 8 ? "左转向灯信号" : "无");
writer.WriteString("bit2", (value.CarSignalStatus & 4) == 4 ? "右转向灯信号" : "无");
writer.WriteString("bit1", (value.CarSignalStatus & 2) == 2 ? "远光灯信号" : "无");
writer.WriteString("bit0", (value.CarSignalStatus & 1) ==1?"近光灯信号":"无");
writer.WriteString("bit14-离合器状态", (value.CarSignalStatus & 16384) == 16384 ? "离合器状态" : "无");
writer.WriteString("bit13-加热器工作", (value.CarSignalStatus & 8192) == 8192 ? "加热器工作" : "无");
writer.WriteString("bit12-ABS工作", (value.CarSignalStatus & 4096) == 4096 ? "ABS工作" : "无");
writer.WriteString("bit11-缓速器工作", (value.CarSignalStatus & 2048) == 2048 ? "缓速器工作" : "无");
writer.WriteString("bit10-空挡信号", (value.CarSignalStatus & 1024) == 1024 ? "空挡信号" : "无");
writer.WriteString("bit9-空调状态", (value.CarSignalStatus & 512) == 512 ? "空调状态" : "无");
writer.WriteString("bit8-喇叭信号", (value.CarSignalStatus & 256) == 256 ? "喇叭信号" : "无");
writer.WriteString("bit7-示廓灯", (value.CarSignalStatus & 128) == 128 ? "示廓灯" : "无");
writer.WriteString("bit6-雾灯信号", (value.CarSignalStatus & 64) == 64 ? "雾灯信号" : "无");
writer.WriteString("bit5-倒档信号", (value.CarSignalStatus & 32) == 32 ? "倒档信号" : "无");
writer.WriteString("bit4-制动信号", (value.CarSignalStatus & 16) == 16 ? "制动信号" : "无");
writer.WriteString("bit3-左转向灯信号", (value.CarSignalStatus & 8) == 8 ? "左转向灯信号" : "无");
writer.WriteString("bit2-右转向灯信号", (value.CarSignalStatus & 4) == 4 ? "右转向灯信号" : "无");
writer.WriteString("bit1-远光灯信号", (value.CarSignalStatus & 2) == 2 ? "远光灯信号" : "无");
writer.WriteString("bit0-近光灯信号", (value.CarSignalStatus & 1) ==1?"近光灯信号":"无");
writer.WriteEndObject();
}
/// <summary>


+ 1
- 7
src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase.cs ファイルの表示

@@ -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; }
}
}

+ 22
- 0
src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase2.cs ファイルの表示

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.MessageBody
{
/// <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; }
}
}

+ 23
- 0
src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase3.cs ファイルの表示

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.MessageBody
{
/// <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; }
}
}

+ 22
- 0
src/JT808.Protocol/MessageBody/JT808_0x0200_CustomBodyBase4.cs ファイルの表示

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.MessageBody
{
/// <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; }
}
}

読み込み中…
キャンセル
保存