waterliu99 3 лет назад
Родитель
Сommit
f8a27c58f0
10 измененных файлов: 508 добавлений и 130 удалений
  1. +30
    -28
      README.md
  2. +32
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs
  3. +36
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0801Test.cs
  4. +92
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0802Test.cs
  5. +77
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x8800Test.cs
  6. +5
    -3
      src/JT808.Protocol/JT808.Protocol.xml
  7. +140
    -70
      src/JT808.Protocol/MessageBody/JT808_0x0702.cs
  8. +45
    -10
      src/JT808.Protocol/MessageBody/JT808_0x0801.cs
  9. +17
    -4
      src/JT808.Protocol/MessageBody/JT808_0x0802.cs
  10. +34
    -15
      src/JT808.Protocol/MessageBody/JT808_0x8800.cs

+ 30
- 28
README.md Просмотреть файл

@@ -1,5 +1,6 @@
# JT808协议


[![MIT Licence](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SmallChi/JT808/blob/master/LICENSE)![.NET Core](https://github.com/SmallChi/JT808/workflows/.NET%20Core/badge.svg?branch=master)

## 前提条件
@@ -379,33 +380,34 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 5.0
| **0x0100Serialize** | **0x0100Serializer** | **100000** | **80,403.44 μs** | **1,522.446 μs** | **1,563.440 μs** | **10714.2857** | **-** | **-** | **66406.25 KB** |
| 0x0100Deserialize | 0x0100Serializer | 100000 | 69,196.07 μs | 1,289.555 μs | 1,206.251 μs | 15666.6667 | - | - | 96875.13 KB |


## JT808终端通讯协议消息对照表

| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 |2019版本|
| :---: | :-----------: | :------: | :------: | :---------------------------- |:----------------------------:|
| 序号 | 消息ID | 完成情况 | 测试情况 | 消息体名称 |2019版本 | 2011版本
| :---: | :-----------: | :------: | :------: | :---------------------------- |:----------------------------:|:----------------------------:|
| 1 | 0x0001 | √ | √ | 终端通用应答 |
| 2 | 0x8001 | √ | √ | 平台通用应答 |
| 3 | 0x0002 | √ | √ | 终端心跳 |
| 4 | 0x8003 | √ | √ | 补传分包请求 |
| 5 | 0x0100 | √ | √ | 终端注册 |修改|
| 4 | 0x8003 | √ | √ | 补传分包请求 | |被新增
| 5 | 0x0100 | √ | √ | 终端注册 |修改 |被修改
| 6 | 0x8100 | √ | √ | 终端注册应答 |
| 7 | 0x0003 | √ | √ | 终端注销 |
| 8 | 0x0102 | √ | √ | 终端鉴权 |修改|
| 9 | 0x8103 | √ | √ | 设置终端参数 |修改且增加|
| 9 | 0x8103 | √ | √ | 设置终端参数 |修改且增加 |被修改
| 10 | 0x8104 | √ | √ | 查询终端参数 |
| 11 | 0x0104 | √ | √ | 查询终端参数应答 |
| 12 | 0x8105 | √ | √ | 终端控制 |
| 13 | 0x8106 | √ | √ | 查询指定终端参数 |
| 14 | 0x8107 | √ | 消息体为空| 查询终端属性 |
| 15 | 0x0107 | √ | √ | 查询终端属性应答 |
| 16 | 0x8108 | √ | √ | 下发终端升级包 |
| 17 | 0x0108 | √ | √ | 终端升级结果通知 |
| 18 | 0x0200 | √ | √ | 位置信息汇报 |增加附加信息|
| 13 | 0x8106 | √ | √ | 查询指定终端参数 | |被新增
| 14 | 0x8107 | √ | 消息体为空| 查询终端属性 | |被新增
| 15 | 0x0107 | √ | √ | 查询终端属性应答 | |被新增
| 16 | 0x8108 | √ | √ | 下发终端升级包 | |被新增
| 17 | 0x0108 | √ | √ | 终端升级结果通知 | |被新增
| 18 | 0x0200 | √ | √ | 位置信息汇报 |增加附加信息 |被修改
| 19 | 0x8201 | √ | √ | 位置信息查询 |
| 20 | 0x0201 | √ | √ | 位置信息查询应答 |
| 21 | 0x8202 | √ | √ | 临时位置跟踪控制 |
| 22 | 0x8203 | √ | √ | 人工确认报警消息 |
| 23 | 0x8300 | √ | √ | 文本信息下发 |修改|
| 22 | 0x8203 | √ | √ | 人工确认报警消息 | |被新增
| 23 | 0x8300 | √ | √ | 文本信息下发 |修改 |被修改
| 24 | 0x8301 | √ | √ | 事件设置 |删除|
| 25 | 0x0301 | √ | √ | 事件报告 |删除|
| 26 | 0x8302 | √ | √ | 提问下发 |删除|
@@ -417,7 +419,7 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 5.0
| 32 | 0x8401 | √ | √ | 设置电话本 |
| 33 | 0x8500 | √ | √ | 车辆控制 |修改|
| 34 | 0x0500 | √ | √ | 车辆控制应答 |
| 35 | 0x8600 | √ | √ | 设置圆形区域 |修改|
| 35 | 0x8600 | √ | √ | 设置圆形区域 |修改 |被修改
| 36 | 0x8601 | √ | √ | 删除圆形区域 |
| 37 | 0x8602 | √ | √ | 设置矩形区域 |修改|
| 38 | 0x8603 | √ | √ | 删除矩形区域 |
@@ -425,26 +427,26 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 5.0
| 40 | 0x8605 | √ | √ | 删除多边形区域 |
| 41 | 0x8606 | √ | √ | 设置路线 |修改|
| 42 | 0x8607 | √ | √ | 删除路线 |
| 43 | 0x8700 | √ | √ | 行驶记录仪数据采集命令 |
| 43 | 0x8700 | √ | √ | 行驶记录仪数据采集命令 | |被修改
| 44 | 0x0700 | √ | √ | 行驶记录仪数据上传 |
| 45 | 0x8701 | √ | √ | 行驶记录仪参数下传命令 |
| 45 | 0x8701 | √ | √ | 行驶记录仪参数下传命令 | |被修改
| 46 | 0x0701 | √ | √ | 电子运单上报 |
| 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 |修改|
| 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 |
| 49 | 0x0704 | √ | √ | 定位数据批量上传 |修改|
| 50 | 0x0705 | √ | √ | CAN 总线数据上传 |修改|
| 51 | 0x0800 | √ | √ | 多媒体事件信息上传 |
| 52 | 0x0801 | √ | √ | 多媒体数据上传 |修改|
| 53 | 0x8800 | √ | √ | 多媒体数据上传应答 |
| 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 |修改 |被修改
| 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 | |被新增
| 49 | 0x0704 | √ | √ | 定位数据批量上传 |修改| |被新增
| 50 | 0x0705 | √ | √ | CAN 总线数据上传 |修改| |被新增
| 51 | 0x0800 | √ | √ | 多媒体事件信息上传 | |被修改
| 52 | 0x0801 | √ | √ | 多媒体数据上传 |修改 |被修改
| 53 | 0x8800 | √ | √ | 多媒体数据上传应答 | |被修改
| 54 | 0x8801 | √ | √ | 摄像头立即拍摄命令 |修改|
| 55 | 0x0805 | √ | √ | 摄像头立即拍摄命令应答 |修改|
| 55 | 0x0805 | √ | √ | 摄像头立即拍摄命令应答 |修改| |被新增
| 56 | 0x8802 | √ | √ | 存储多媒体数据检索 |
| 57 | 0x0802 | √ | √ | 存储多媒体数据检索应答 |
| 57 | 0x0802 | √ | √ | 存储多媒体数据检索应答 | |被修改
| 58 | 0x8803 | √ | √ | 存储多媒体数据上传 |
| 59 | 0x8804 | √ | √ | 录音开始命令 |
| 60 | 0x8805 | √ | √ | 单条存储多媒体数据检索上传命令 |修改|
| 61 | 0x8900 | √ | √ | 数据下行透传 |修改|
| 62 | 0x0900 | √ | √ | 数据上行透传 |修改|
| 60 | 0x8805 | √ | √ | 单条存储多媒体数据检索上传命令 |修改| |被新增
| 61 | 0x8900 | √ | √ | 数据下行透传 |修改 |被修改
| 62 | 0x0900 | √ | √ | 数据上行透传 |修改 |被修改
| 63 | 0x0901 | √ | √ | 数据压缩上报 |
| 64 | 0x8A00 | √ | √ | 平台 RSA 公钥 |
| 65 | 0x0A00 | √ | √ | 终端 RSA 公钥 |


+ 32
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs Просмотреть файл

@@ -168,5 +168,37 @@ namespace JT808.Protocol.Test.MessageBody
byte[] bytes = "0121052818111100056B6F696B65000000000000000071776531323334353661616106717765727478202105280000003132333435363738393031323334353637630000003132333435363738393031323334353637".ToHexBytes();
string json = JT808Serializer.Analyze<JT808_0x0702>(bytes, JT808Version.JTT2019);
}

[Fact]
public void Test2011_1()
{
JT808_0x0702 jT808_0X0702 = new JT808_0x0702
{
DriverUserName = "tk",
DriverIdentityCard="123456789123456789",
QualificationCode = "qwe123456aaa",
LicenseIssuing = "qwertx"
};
var hex = JT808Serializer.Serialize(jT808_0X0702, JT808Version.JTT2011).ToHexString();
Assert.Equal("02746B00003132333435363738393132333435363738390000000000000000000000000000000000000000000000000000000071776531323334353661616106717765727478".Replace(" ", ""), hex);
}

[Fact]
public void Test2011_2()
{
byte[] bytes = "02746B00003132333435363738393132333435363738390000000000000000000000000000000000000000000000000000000071776531323334353661616106717765727478".ToHexBytes();
JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes);
Assert.Equal("tk", jT808_0X0702.DriverUserName);
Assert.Equal("qwe123456aaa", jT808_0X0702.QualificationCode);
Assert.Equal("qwertx", jT808_0X0702.LicenseIssuing);
Assert.Equal("123456789123456789", jT808_0X0702.DriverIdentityCard);
}

[Fact]
public void Test2011_3()
{
byte[] bytes = "02746B00003132333435363738393132333435363738390000000000000000000000000000000000000000000000000000000071776531323334353661616106717765727478".ToHexBytes();
string json = JT808Serializer.Analyze<JT808_0x0702>(bytes, JT808Version.JTT2011);
}
}
}

+ 36
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x0801Test.cs Просмотреть файл

@@ -97,5 +97,41 @@ namespace JT808.Protocol.Test.MessageBody
byte[] bytes = "7e080123000138123456782032000a000205060708090a0bffc400b5100002010303020403050504040000017d0101020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffdd00040000ffda000c03010002110311003f006c6a2a755ce299a5c942e0f35281c5004aa72314a54e38a07b8841ef4840a0673de21b4ff498ee402038dade991fe7f4acc110f4a0cd8ef2f1405cd01d45f2e9360a062edc5745616a6dad511861cfccff0053499512e056cf1460e3348a0ed4b8e338fc2819cb5edbfd9ee648b18556f97fdd3d3f4aafb4d332ea433a6573e9550d3131d18c9c558031c0a4083a503039a60c42c2984e4f4a06260d370690098ef4751400c615132d021868a621431a33480ef235e05595403eb54cbb0b8e7069dc0e3a9a41b12a024f4a9d40f4a18c5651e951c88179268194ee614b989a2719461ffea35cfdcda4b6b2ed71c1e55874345c96ba91819a704c50217613db349b39031c9e945c66a69ba794713cebf30fb8be9ee6b540c1e948a48760e3a526d2dc77a0a144471d297cb623a71484646bb685234b81d01d8e7d018f43f9ff003ac16386c552225b8300c2a84c8c8c4ed247b502616cc0517e".ToHexBytes();
JT808HeaderPackage jT808_0X0801 = JT808Serializer.HeaderDeserialize(bytes);
}

[Fact]
public void Test2011_1()
{
JT808_0x0801 jT808_0X0801 = new JT808_0x0801
{
ChannelId = 123,
EventItemCoding = JT808EventItemCoding.定时动作.ToByteValue(),
MultimediaCodingFormat = JT808MultimediaCodingFormat.JPEG.ToByteValue(),
MultimediaId = 2567,
MultimediaType = JT808MultimediaType.图像.ToByteValue(),
MultimediaDataPackage = new byte[] { 0x01, 0x02, 0x03, 0x04 }
};
string hex = JT808Serializer.Serialize(jT808_0X0801,JT808Version.JTT2011).ToHexString();
Assert.Equal("00000A070000017B01020304", hex);
}

[Fact]
public void Test2011_2()
{
byte[] bytes = "00000A070000017B01020304".ToHexBytes();
JT808_0x0801 jT808_0X0801 = JT808Serializer.Deserialize<JT808_0x0801>(bytes);
Assert.Equal(123, jT808_0X0801.ChannelId);
Assert.Equal(JT808EventItemCoding.定时动作.ToByteValue(), jT808_0X0801.EventItemCoding);
Assert.Equal(JT808MultimediaCodingFormat.JPEG.ToByteValue(), jT808_0X0801.MultimediaCodingFormat);
Assert.Equal((uint)2567, jT808_0X0801.MultimediaId);
Assert.Equal(JT808MultimediaType.图像.ToByteValue(), jT808_0X0801.MultimediaType);
Assert.Equal(new byte[] { 0x01, 0x02, 0x03, 0x04 }, jT808_0X0801.MultimediaDataPackage);
}

[Fact]
public void Test2011_3()
{
byte[] bytes = "00000A070000017B01020304".ToHexBytes();
string json = JT808Serializer.Analyze<JT808_0x0801>(bytes);
}
}
}

+ 92
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x0802Test.cs Просмотреть файл

@@ -106,5 +106,97 @@ namespace JT808.Protocol.Test.MessageBody
byte[] bytes = "3051000200000102007B01000000010000000200BA7F0E07E4F11C0028003C000018111620202000000103027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222".ToHexBytes();
string json = JT808Serializer.Analyze<JT808_0x0802>(bytes);
}

[Fact]
public void Test2011_1()
{
JT808_0x0802 jT808_0X0802 = new JT808_0x0802
{
MsgNum = 12369,
MultimediaSearchItems = new List<JT808MultimediaSearchProperty>()
};

jT808_0X0802.MultimediaSearchItems.Add(new JT808MultimediaSearchProperty()
{
ChannelId = 123,
EventItemCoding = JT808EventItemCoding.定时动作.ToByteValue(),
MultimediaType = JT808MultimediaType.图像.ToByteValue(),
Position = new JT808_0x0200()
{
AlarmFlag = 1,
Altitude = 40,
GPSTime = DateTime.Parse("2018-11-16 20:20:20"),
Lat = 12222222,
Lng = 132444444,
Speed = 60,
Direction = 0,
StatusFlag = 2,
}
});

jT808_0X0802.MultimediaSearchItems.Add(new JT808MultimediaSearchProperty()
{
ChannelId = 124,
EventItemCoding = JT808EventItemCoding.平台下发指令.ToByteValue(),
MultimediaType = JT808MultimediaType.视频.ToByteValue(),
Position = new JT808_0x0200()
{
AlarmFlag = 1,
Altitude = 40,
GPSTime = DateTime.Parse("2018-11-16 22:22:22"),
Lat = 12222222,
Lng = 132444444,
Speed = 60,
Direction = 0,
StatusFlag = 2,
}
});

string hex = JT808Serializer.Serialize(jT808_0X0802,JT808Version.JTT2011).ToHexString();
Assert.Equal("30510002007B01000000010000000200BA7F0E07E4F11C0028003C0000181116202020027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222", hex);
}

[Fact]
public void Test2011_2()
{
byte[] bytes = "30510002007B01000000010000000200BA7F0E07E4F11C0028003C0000181116202020027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222".ToHexBytes();
JT808_0x0802 jT808_0X0802 = JT808Serializer.Deserialize<JT808_0x0802>(bytes);
Assert.Equal(12369, jT808_0X0802.MsgNum);
Assert.Equal(2, jT808_0X0802.MultimediaItemCount);


Assert.Equal(123, jT808_0X0802.MultimediaSearchItems[0].ChannelId);
Assert.Equal(JT808EventItemCoding.定时动作.ToByteValue(), jT808_0X0802.MultimediaSearchItems[0].EventItemCoding);
Assert.Equal(JT808MultimediaType.图像.ToByteValue(), jT808_0X0802.MultimediaSearchItems[0].MultimediaType);

Assert.Equal((uint)1, jT808_0X0802.MultimediaSearchItems[0].Position.AlarmFlag);
Assert.Equal((ushort)40, jT808_0X0802.MultimediaSearchItems[0].Position.Altitude);
Assert.Equal(DateTime.Parse("2018-11-16 20:20:20"), jT808_0X0802.MultimediaSearchItems[0].Position.GPSTime);
Assert.Equal(12222222, jT808_0X0802.MultimediaSearchItems[0].Position.Lat);
Assert.Equal(132444444, jT808_0X0802.MultimediaSearchItems[0].Position.Lng);
Assert.Equal((ushort)60, jT808_0X0802.MultimediaSearchItems[0].Position.Speed);
Assert.Equal((ushort)0, jT808_0X0802.MultimediaSearchItems[0].Position.Direction);
Assert.Equal((uint)2, jT808_0X0802.MultimediaSearchItems[0].Position.StatusFlag);

Assert.Equal(124, jT808_0X0802.MultimediaSearchItems[1].ChannelId);
Assert.Equal(JT808EventItemCoding.平台下发指令.ToByteValue(), jT808_0X0802.MultimediaSearchItems[1].EventItemCoding);
Assert.Equal(JT808MultimediaType.视频.ToByteValue(), jT808_0X0802.MultimediaSearchItems[1].MultimediaType);

Assert.Equal((uint)1, jT808_0X0802.MultimediaSearchItems[1].Position.AlarmFlag);
Assert.Equal((ushort)40, jT808_0X0802.MultimediaSearchItems[1].Position.Altitude);
Assert.Equal(DateTime.Parse("2018-11-16 22:22:22"), jT808_0X0802.MultimediaSearchItems[1].Position.GPSTime);
Assert.Equal(12222222, jT808_0X0802.MultimediaSearchItems[1].Position.Lat);
Assert.Equal(132444444, jT808_0X0802.MultimediaSearchItems[1].Position.Lng);
Assert.Equal((ushort)60, jT808_0X0802.MultimediaSearchItems[1].Position.Speed);
Assert.Equal((ushort)0, jT808_0X0802.MultimediaSearchItems[1].Position.Direction);
Assert.Equal((uint)2, jT808_0X0802.MultimediaSearchItems[1].Position.StatusFlag);
}

[Fact]
public void Test2011_3()
{
byte[] bytes = "30510002007B01000000010000000200BA7F0E07E4F11C0028003C0000181116202020027C00000000010000000200BA7F0E07E4F11C0028003C0000181116222222".ToHexBytes();
string json = JT808Serializer.Analyze<JT808_0x0802>(bytes);
}
}
}

+ 77
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x8800Test.cs Просмотреть файл

@@ -46,5 +46,82 @@ namespace JT808.Protocol.Test.MessageBody
byte[] bytes = "7E8800000900012345678900010000008102010203048E7E".ToHexBytes();
string json = JT808Serializer.Analyze<JT808Package>(bytes);
}
[Fact]
public void Test2013_1()
{
JT808Package jT808Package = new JT808Package
{
Header = new JT808Header
{
MsgId = (ushort)JT808MsgId.多媒体数据上传应答,
TerminalPhoneNo = "123456789",
},
Bodies = new JT808_0x8800
{
MultimediaId = 129,
RetransmitPackageIds = new byte[] { }
}

};
string hex = JT808Serializer.Serialize(jT808Package, JT808Version.JTT2013).ToHexString();
Assert.Equal("7E88000004000123456789000100000081857E", hex);
}

[Fact]
public void Test2013_2()
{
byte[] bytes = "7E88000004000123456789000100000081857E".ToHexBytes();
var jt808Package = JT808Serializer.Deserialize<JT808Package>(bytes);
JT808_0x8800 jT808_0X8800 = jt808Package.Bodies as JT808_0x8800;
Assert.Equal((uint)129, jT808_0X8800.MultimediaId);
Assert.Equal(0, jT808_0X8800.RetransmitPackageCount);
Assert.Null(jT808_0X8800.RetransmitPackageIds);
}

[Fact]
public void Test2013_3()
{
byte[] bytes = "7E88000004000123456789000100000081857E".ToHexBytes();
string json = JT808Serializer.Analyze<JT808Package>(bytes);
}

[Fact]
public void Test2011_1()
{
JT808Package jT808Package = new JT808Package
{
Header = new JT808Header
{
MsgId = (ushort)JT808MsgId.多媒体数据上传应答,
TerminalPhoneNo = "123456789",
},
Bodies = new JT808_0x8800
{
MultimediaId = 129,
RetransmitPackageIds = new byte[] { }
}

};
string hex = JT808Serializer.Serialize(jT808Package,JT808Version.JTT2011).ToHexString();
Assert.Equal("7E8800000500012345678900010000008100847E", hex);
}

[Fact]
public void Test2011_2()
{
byte[] bytes = "7E8800000500012345678900010000008100847E".ToHexBytes();
var jt808Package = JT808Serializer.Deserialize<JT808Package>(bytes);
JT808_0x8800 jT808_0X8800 = jt808Package.Bodies as JT808_0x8800;
Assert.Equal((uint)129, jT808_0X8800.MultimediaId);
Assert.Equal(0, jT808_0X8800.RetransmitPackageCount);
Assert.Null(jT808_0X8800.RetransmitPackageIds);
}

[Fact]
public void Test2011_3()
{
byte[] bytes = "7E8800000500012345678900010000008100847E".ToHexBytes();
string json = JT808Serializer.Analyze<JT808Package>(bytes);
}
}
}

+ 5
- 3
src/JT808.Protocol/JT808.Protocol.xml Просмотреть файл

@@ -10361,8 +10361,9 @@
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0702.QualificationCode">
<summary>
从业资格证编码
长度 20 位,不足补 0x00。
从业资格证编码
2011 长度40 位 ,不足补 '\0';
2013 长度 20 位,不足补 '\0'。
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0702.LicenseIssuingLength">
@@ -10382,7 +10383,8 @@
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0702.DriverIdentityCard">
<summary>
驾驶员身份证号 长度20 不足补0
驾驶员身份证号 长度20 不足补 '\0'
2011版本
2019版本
</summary>
</member>


+ 140
- 70
src/JT808.Protocol/MessageBody/JT808_0x0702.cs Просмотреть файл

@@ -52,8 +52,9 @@ namespace JT808.Protocol.MessageBody
/// </summary>
public string DriverUserName { get; set; }
/// <summary>
/// 从业资格证编码
/// 长度 20 位,不足补 0x00。
/// 从业资格证编码
/// 2011 长度40 位 ,不足补 '\0';
/// 2013 长度 20 位,不足补 '\0'。
/// </summary>
public string QualificationCode { get; set; }
/// <summary>
@@ -69,7 +70,8 @@ namespace JT808.Protocol.MessageBody
/// </summary>
public DateTime CertificateExpiresDate { get; set; }
/// <summary>
/// 驾驶员身份证号 长度20 不足补0
/// 驾驶员身份证号 长度20 不足补 '\0'
/// 2011版本
/// 2019版本
/// </summary>
public string DriverIdentityCard { get; set; }
@@ -94,46 +96,81 @@ namespace JT808.Protocol.MessageBody
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0702 value = new JT808_0x0702();
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status);
value.IC_Card_PlugDateTime = reader.ReadDateTime6();
writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
var firstByte = reader.ReadVirtualByte();
//因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n
if (firstByte == 0x01)
{
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
writer.WriteNumber($"[{((byte)value.IC_Card_ReadResult).ReadNumber()}]IC卡读取结果-{value.IC_Card_ReadResult.ToString()}", (byte)value.IC_Card_ReadResult);
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status);
value.IC_Card_PlugDateTime = reader.ReadDateTime6();
writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
{
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
writer.WriteNumber($"[{((byte)value.IC_Card_ReadResult).ReadNumber()}]IC卡读取结果-{value.IC_Card_ReadResult.ToString()}", (byte)value.IC_Card_ReadResult);
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
{
value.DriverUserNameLength = reader.ReadByte();
writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength);
var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength);
value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName);
var qualificationCodeBuffer = reader.ReadVirtualArray(20);
value.QualificationCode = reader.ReadString(20);
writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode);
value.LicenseIssuingLength = reader.ReadByte();
writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength);
var licenseIssuingLengtheBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
writer.WriteString($"[{licenseIssuingLengtheBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
value.CertificateExpiresDate = reader.ReadDateTime4();
writer.WriteString($"[{value.CertificateExpiresDate.ToString("yyMMdd")}]插拔卡时间", value.CertificateExpiresDate.ToString("yyyy-MM-dd"));
if (reader.Version == JT808Version.JTT2019)
{
var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
value.DriverIdentityCard = reader.ReadString(20);
writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
//兼容808-2019 补充
if (reader.ReadCurrentRemainContentLength() > 0)
{
value.FaceMatchValue = reader.ReadByte();
writer.WriteNumber($"[{value.FaceMatchValue.Value.ReadNumber()}]人脸匹配度", value.FaceMatchValue.Value);
var uidBuffer = reader.ReadVirtualArray(20);
value.UID = reader.ReadString(20);
writer.WriteString($"[{uidBuffer.ToArray().ToHexString()}]身份证UID", value.UID);
}
}
}
}
}
else
{
if (firstByte == 0x02 && reader.ReadCurrentRemainContentLength() == 7)
{
//如果字节是0x02且长度只有7,那么该协议就是2013或者2019
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status);
value.IC_Card_PlugDateTime = reader.ReadDateTime6();
writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
value.DriverUserNameLength = reader.ReadByte();
writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength);
var driverUserNameBuffer= reader.ReadVirtualArray(value.DriverUserNameLength);
var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength);
value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName);
var qualificationCodeBuffer = reader.ReadVirtualArray(20);
value.QualificationCode = reader.ReadString(20);
var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
value.DriverIdentityCard = reader.ReadString(20);
writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
var qualificationCodeBuffer = reader.ReadVirtualArray(40);
value.QualificationCode = reader.ReadString(40);
writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode);
value.LicenseIssuingLength = reader.ReadByte();
writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength);
var licenseIssuingLengtheBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
var licenseIssuingBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
writer.WriteString($"[{licenseIssuingLengtheBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
value.CertificateExpiresDate = reader.ReadDateTime4();
writer.WriteString($"[{value.CertificateExpiresDate.ToString("yyMMdd")}]插拔卡时间", value.CertificateExpiresDate.ToString("yyyy-MM-dd"));
if (reader.Version == JT808Version.JTT2019)
{
var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
value.DriverIdentityCard = reader.ReadString(20);
writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
//兼容808-2019 补充
if (reader.ReadCurrentRemainContentLength() > 0)
{
value.FaceMatchValue = reader.ReadByte();
writer.WriteNumber($"[{value.FaceMatchValue.Value.ReadNumber()}]人脸匹配度", value.FaceMatchValue.Value);
var uidBuffer = reader.ReadVirtualArray(20);
value.UID = reader.ReadString(20);
writer.WriteString($"[{uidBuffer.ToArray().ToHexString()}]身份证UID", value.UID);
}
}
writer.WriteString($"[{licenseIssuingBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
}
}
}
@@ -146,31 +183,53 @@ namespace JT808.Protocol.MessageBody
public JT808_0x0702 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0702 value = new JT808_0x0702();
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
value.IC_Card_PlugDateTime = reader.ReadDateTime6();
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
var firstByte = reader.ReadVirtualByte();
//因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n
if (firstByte == 0x01)
{
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
value.IC_Card_PlugDateTime = reader.ReadDateTime6();
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
{
value.DriverUserNameLength = reader.ReadByte();
value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
value.QualificationCode = reader.ReadString(20);
value.LicenseIssuingLength = reader.ReadByte();
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
value.CertificateExpiresDate = reader.ReadDateTime4();
if(reader.Version== JT808Version.JTT2019)
value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
{
value.DriverIdentityCard = reader.ReadString(20);
//兼容808-2019 补充
if (reader.ReadCurrentRemainContentLength() > 0)
value.DriverUserNameLength = reader.ReadByte();
value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
value.QualificationCode = reader.ReadString(20);
value.LicenseIssuingLength = reader.ReadByte();
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
value.CertificateExpiresDate = reader.ReadDateTime4();
if (reader.Version == JT808Version.JTT2019)
{
value.FaceMatchValue = reader.ReadByte();
value.UID = reader.ReadString(20);
value.DriverIdentityCard = reader.ReadString(20);
//兼容808-2019 补充
if (reader.ReadCurrentRemainContentLength() > 0)
{
value.FaceMatchValue = reader.ReadByte();
value.UID = reader.ReadString(20);
}
}
}
}
}
else
{
if (firstByte == 0x02 && reader.ReadCurrentRemainContentLength() == 7)
{
//如果字节是0x02且长度只有7,那么该协议就是2013或者2019
value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
value.IC_Card_PlugDateTime = reader.ReadDateTime6();
}
else {
value.DriverUserNameLength = reader.ReadByte();
value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
value.DriverIdentityCard = reader.ReadString(20);
value.QualificationCode = reader.ReadString(40);
value.LicenseIssuingLength = reader.ReadByte();
value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
}
}
return value;
}
/// <summary>
@@ -181,30 +240,41 @@ namespace JT808.Protocol.MessageBody
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0702 value, IJT808Config config)
{
writer.WriteByte((byte)value.IC_Card_Status);
writer.WriteDateTime6(value.IC_Card_PlugDateTime);
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
if (writer.Version == JT808Version.JTT2011)
{
writer.WriteByte((byte)value.IC_Card_ReadResult);
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
writer.WriteByte((byte)value.DriverUserName.Length);
writer.WriteString(value.DriverUserName);
writer.WriteString(value.DriverIdentityCard.PadLeft(20,'\0').ValiString(nameof(value.DriverIdentityCard), 20));
writer.WriteString(value.QualificationCode.PadLeft(40, '\0').ValiString(nameof(value.QualificationCode), 40));
writer.WriteByte((byte)value.LicenseIssuing.Length);
writer.WriteString(value.LicenseIssuing);
}
else {
writer.WriteByte((byte)value.IC_Card_Status);
writer.WriteDateTime6(value.IC_Card_PlugDateTime);
if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
{
writer.WriteByte((byte)value.DriverUserName.Length);
writer.WriteString(value.DriverUserName);
writer.WriteString(value.QualificationCode.PadLeft(20, '\0').ValiString(nameof(value.QualificationCode),20));
writer.WriteByte((byte)value.LicenseIssuing.Length);
writer.WriteString(value.LicenseIssuing);
writer.WriteDateTime4(value.CertificateExpiresDate);
if (writer.Version == JT808Version.JTT2019)
writer.WriteByte((byte)value.IC_Card_ReadResult);
if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
{
writer.WriteString(value.DriverIdentityCard.PadLeft(20,'\0').ValiString(nameof(value.DriverIdentityCard), 20));
//兼容808-2019 补充
if (value.FaceMatchValue.HasValue)
{
writer.WriteByte(value.FaceMatchValue.Value);
}
if (!string.IsNullOrEmpty(value.UID))
writer.WriteByte((byte)value.DriverUserName.Length);
writer.WriteString(value.DriverUserName);
writer.WriteString(value.QualificationCode.PadLeft(20, '\0').ValiString(nameof(value.QualificationCode), 20));
writer.WriteByte((byte)value.LicenseIssuing.Length);
writer.WriteString(value.LicenseIssuing);
writer.WriteDateTime4(value.CertificateExpiresDate);
if (writer.Version == JT808Version.JTT2019)
{
writer.WriteString(value.UID.PadLeft(20, '\0').ValiString(nameof(value.UID), 20));
writer.WriteString(value.DriverIdentityCard.PadLeft(20, '\0').ValiString(nameof(value.DriverIdentityCard), 20));
//兼容808-2019 补充
if (value.FaceMatchValue.HasValue)
{
writer.WriteByte(value.FaceMatchValue.Value);
}
if (!string.IsNullOrEmpty(value.UID))
{
writer.WriteString(value.UID.PadLeft(20, '\0').ValiString(nameof(value.UID), 20));
}
}
}
}


+ 45
- 10
src/JT808.Protocol/MessageBody/JT808_0x0801.cs Просмотреть файл

@@ -45,6 +45,8 @@ namespace JT808.Protocol.MessageBody
/// 通道 ID
/// </summary>
public byte ChannelId { get; set; }

public bool PositionError { get; set; }
/// <summary>
/// 位置信息汇报(0x0200)消息体
/// 表示拍摄或录制的起始时刻的位置基本信息数据
@@ -73,12 +75,28 @@ namespace JT808.Protocol.MessageBody
writer.WriteNumber($"[{value.EventItemCoding.ReadNumber()}]事件项编码-{((JT808EventItemCoding)value.EventItemCoding).ToString()}", value.MultimediaCodingFormat);
value.ChannelId = reader.ReadByte();
writer.WriteNumber($"[{value.ChannelId.ReadNumber()}]通道ID", value.ChannelId);
JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28), reader.Version);
writer.WriteStartObject("位置基本信息");
config.GetAnalyze<JT808_0x0200>().Analyze(ref positionReader, writer, config);
writer.WriteEndObject();
value.MultimediaDataPackage = reader.ReadContent().ToArray();
writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString());
if (reader.ReadCurrentRemainContentLength() >= 28)
{
var tempData = reader.ReadVirtualArray(28);
try
{
JT808MessagePackReader positionReader = new JT808MessagePackReader(tempData, reader.Version);
writer.WriteStartObject("位置基本信息");
config.GetAnalyze<JT808_0x0200>().Analyze(ref positionReader, writer, config);
writer.WriteEndObject();
reader.Skip(28);
}
catch
{
PositionError = true;
}
value.MultimediaDataPackage = reader.ReadContent().ToArray();
writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString());
}
else {
value.MultimediaDataPackage = reader.ReadContent().ToArray();
writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString());
}
}
/// <summary>
///
@@ -94,9 +112,24 @@ namespace JT808.Protocol.MessageBody
value.MultimediaCodingFormat = reader.ReadByte();
value.EventItemCoding = reader.ReadByte();
value.ChannelId = reader.ReadByte();
JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28), reader.Version);
value.Position = config.GetMessagePackFormatter<JT808_0x0200>().Deserialize(ref positionReader, config);
value.MultimediaDataPackage = reader.ReadContent().ToArray();
if (reader.ReadCurrentRemainContentLength() >= 28)
{
var tempData = reader.ReadVirtualArray(28);
try
{
JT808MessagePackReader positionReader = new JT808MessagePackReader(tempData, reader.Version);
value.Position = config.GetMessagePackFormatter<JT808_0x0200>().Deserialize(ref positionReader, config);
reader.Skip(28);
}
catch
{
PositionError = true;
}
value.MultimediaDataPackage = reader.ReadContent().ToArray();
}
else {
value.MultimediaDataPackage = reader.ReadContent().ToArray();
}
return value;
}
/// <summary>
@@ -112,7 +145,9 @@ namespace JT808.Protocol.MessageBody
writer.WriteByte(value.MultimediaCodingFormat);
writer.WriteByte(value.EventItemCoding);
writer.WriteByte(value.ChannelId);
config.GetMessagePackFormatter<JT808_0x0200>().Serialize(ref writer, value.Position, config);
if (writer.Version != JT808Version.JTT2011) {
config.GetMessagePackFormatter<JT808_0x0200>().Serialize(ref writer, value.Position, config);
}
writer.WriteArray(value.MultimediaDataPackage);
}
}


+ 17
- 4
src/JT808.Protocol/MessageBody/JT808_0x0802.cs Просмотреть файл

@@ -55,8 +55,12 @@ namespace JT808.Protocol.MessageBody
{
writer.WriteStartObject();
JT808MultimediaSearchProperty jT808MultimediaSearchProperty = new JT808MultimediaSearchProperty();
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32();
writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaId.ReadNumber()}]多媒体ID", jT808MultimediaSearchProperty.MultimediaId);
if (reader.ReadCurrentRemainContentLength() == (value.MultimediaItemCount - i) * (4 + 1 + 1 + 1 + 28))
{
//2013 ,2019协议
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32();
writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaId.ReadNumber()}]多媒体ID", jT808MultimediaSearchProperty.MultimediaId);
}
jT808MultimediaSearchProperty.MultimediaType = reader.ReadByte();
writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaType.ReadNumber()}]多媒体类型-{((JT808MultimediaType)jT808MultimediaSearchProperty.MultimediaType).ToString()}", jT808MultimediaSearchProperty.MultimediaType);
jT808MultimediaSearchProperty.ChannelId = reader.ReadByte();
@@ -86,7 +90,12 @@ namespace JT808.Protocol.MessageBody
for (var i = 0; i < value.MultimediaItemCount; i++)
{
JT808MultimediaSearchProperty jT808MultimediaSearchProperty = new JT808MultimediaSearchProperty();
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32();
if (reader.ReadCurrentRemainContentLength() ==(value.MultimediaItemCount-i)*(4 + 1 + 1 + 1 + 28))
{
//2013 ,2019协议
jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32();

}
jT808MultimediaSearchProperty.MultimediaType = reader.ReadByte();
jT808MultimediaSearchProperty.ChannelId = reader.ReadByte();
jT808MultimediaSearchProperty.EventItemCoding = reader.ReadByte();
@@ -108,7 +117,11 @@ namespace JT808.Protocol.MessageBody
writer.WriteUInt16((ushort)value.MultimediaSearchItems.Count);
foreach (var item in value.MultimediaSearchItems)
{
writer.WriteUInt32(item.MultimediaId);
if (writer.Version != JT808Version.JTT2011)
{
writer.WriteUInt32(item.MultimediaId);

}
writer.WriteByte(item.MultimediaType);
writer.WriteByte(item.ChannelId);
writer.WriteByte(item.EventItemCoding);


+ 34
- 15
src/JT808.Protocol/MessageBody/JT808_0x8800.cs Просмотреть файл

@@ -44,8 +44,13 @@ namespace JT808.Protocol.MessageBody
{
JT808_0x8800 jT808_0X8800 = new JT808_0x8800();
jT808_0X8800.MultimediaId = reader.ReadUInt32();
jT808_0X8800.RetransmitPackageCount = reader.ReadByte();
jT808_0X8800.RetransmitPackageIds = reader.ReadArray(jT808_0X8800.RetransmitPackageCount * 2).ToArray();
if (reader.ReadCurrentRemainContentLength() > 0)
{
jT808_0X8800.RetransmitPackageCount = reader.ReadByte();//2011协议此处 为0
if (jT808_0X8800.RetransmitPackageCount > 0) {
jT808_0X8800.RetransmitPackageIds = reader.ReadArray(jT808_0X8800.RetransmitPackageCount * 2).ToArray();
}
}
return jT808_0X8800;
}
/// <summary>
@@ -57,8 +62,19 @@ namespace JT808.Protocol.MessageBody
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8800 value, IJT808Config config)
{
writer.WriteUInt32(value.MultimediaId);
writer.WriteByte((byte)(value.RetransmitPackageIds.Length / 2));
writer.WriteArray(value.RetransmitPackageIds);
if (writer.Version == Enums.JT808Version.JTT2011)
{
writer.WriteByte((byte)(value.RetransmitPackageIds.Length / 2));
if (value.RetransmitPackageIds.Length > 0) {
writer.WriteArray(value.RetransmitPackageIds);
}
}
else {
if (value.RetransmitPackageIds.Length > 0) {
writer.WriteByte((byte)(value.RetransmitPackageIds.Length / 2));
writer.WriteArray(value.RetransmitPackageIds);
}
}
}
/// <summary>
///
@@ -70,19 +86,22 @@ namespace JT808.Protocol.MessageBody
{
JT808_0x8800 value = new JT808_0x8800();
value.MultimediaId = reader.ReadUInt32();
value.RetransmitPackageCount = reader.ReadByte();
value.RetransmitPackageIds = reader.ReadArray(value.RetransmitPackageCount * 2).ToArray();

writer.WriteNumber($"[{ value.MultimediaId.ReadNumber()}]多媒体ID", value.MultimediaId);
writer.WriteNumber($"[{ value.RetransmitPackageCount.ReadNumber()}]重传包总数", value.RetransmitPackageCount);
writer.WriteString($"重传包", value.RetransmitPackageIds.ToHexString());
writer.WriteStartArray($"重传包ID列表");
ReadOnlySpan<byte> tmp = value.RetransmitPackageIds;
for(int i=0; i< value.RetransmitPackageCount; i++)
{
writer.WriteStringValue($"{tmp.Slice(i*2 , 2).ToArray().ToHexString()}");
if (reader.ReadCurrentRemainContentLength() > 0) {
value.RetransmitPackageCount = reader.ReadByte();
writer.WriteNumber($"[{ value.RetransmitPackageCount.ReadNumber()}]重传包总数", value.RetransmitPackageCount);
if (value.RetransmitPackageCount > 0) {
writer.WriteString($"重传包", value.RetransmitPackageIds.ToHexString());
writer.WriteStartArray($"重传包ID列表");
value.RetransmitPackageIds = reader.ReadArray(value.RetransmitPackageCount * 2).ToArray();
ReadOnlySpan<byte> tmp = value.RetransmitPackageIds;
for (int i = 0; i < value.RetransmitPackageCount; i++)
{
writer.WriteStringValue($"{tmp.Slice(i * 2, 2).ToArray().ToHexString()}");
}
writer.WriteEndArray();
}
}
writer.WriteEndArray();
}
}
}

Загрузка…
Отмена
Сохранить