Browse Source

增加2019版本808协议的查询区域或线路数据、查询区域或线路数据应答。

tags/v2.2.0
SmallChi(Koike) 5 years ago
parent
commit
c72c90f927
16 changed files with 363 additions and 38 deletions
  1. +8
    -6
      README.md
  2. BIN
      doc/JTT.808-2019.PDF
  3. +2
    -0
      src/JT808.Protocol.Test/JT808.Protocol.Test.csproj
  4. +38
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0608Test.cs
  5. +34
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs
  6. +6
    -6
      src/JT808.Protocol.Test/MessageBody/JT808_0x0705Test.cs
  7. +58
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x8608Test.cs
  8. +49
    -0
      src/JT808.Protocol/JT808.Protocol.xml
  9. +60
    -0
      src/JT808.Protocol/MessageBody/JT808_0x0608.cs
  10. +15
    -1
      src/JT808.Protocol/MessageBody/JT808_0x0702.cs
  11. +4
    -11
      src/JT808.Protocol/MessageBody/JT808_0x0705.cs
  12. +2
    -1
      src/JT808.Protocol/MessageBody/JT808_0x0801.cs
  13. +16
    -9
      src/JT808.Protocol/MessageBody/JT808_0x0805.cs
  14. +64
    -0
      src/JT808.Protocol/MessageBody/JT808_0x8608.cs
  15. +2
    -1
      src/JT808.Protocol/MessageBody/JT808_0x8801.cs
  16. +5
    -3
      src/JT808.Protocol/Metadata/JT808CanProperty.cs

+ 8
- 6
README.md View File

@@ -354,15 +354,15 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0
| 44 | 0x0700 | x | 不开发 | 行驶记录仪数据上传 |不开发 | 44 | 0x0700 | x | 不开发 | 行驶记录仪数据上传 |不开发
| 45 | 0x8701 | x | 不开发 | 行驶记录仪参数下传命令 |不开发 | 45 | 0x8701 | x | 不开发 | 行驶记录仪参数下传命令 |不开发
| 46 | 0x0701 | √ | √ | 电子运单上报 | | 46 | 0x0701 | √ | √ | 电子运单上报 |
| 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 |
| 47 | 0x0702 | √ | √ | 驾驶员身份信息采集上报 |修改|
| 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 | | 48 | 0x8702 | √ | 消息体为空| 上报驾驶员身份信息请求 |
| 49 | 0x0704 | √ | √ | 定位数据批量上传 |
| 50 | 0x0705 | √ | √ | CAN 总线数据上传 |
| 49 | 0x0704 | √ | √ | 定位数据批量上传 |修改|
| 50 | 0x0705 | √ | √ | CAN 总线数据上传 |修改|
| 51 | 0x0800 | √ | √ | 多媒体事件信息上传 | | 51 | 0x0800 | √ | √ | 多媒体事件信息上传 |
| 52 | 0x0801 | √ | √ | 多媒体数据上传 |
| 52 | 0x0801 | √ | √ | 多媒体数据上传 |修改|
| 53 | 0x8800 | √ | √ | 多媒体数据上传应答 | | 53 | 0x8800 | √ | √ | 多媒体数据上传应答 |
| 54 | 0x8801 | √ | √ | 摄像头立即拍摄命令 |
| 55 | 0x0805 | √ | √ | 摄像头立即拍摄命令应答 |
| 54 | 0x8801 | √ | √ | 摄像头立即拍摄命令 |修改|
| 55 | 0x0805 | √ | √ | 摄像头立即拍摄命令应答 |修改|
| 56 | 0x8802 | √ | √ | 存储多媒体数据检索 | | 56 | 0x8802 | √ | √ | 存储多媒体数据检索 |
| 57 | 0x0802 | √ | √ | 存储多媒体数据检索应答 | | 57 | 0x0802 | √ | √ | 存储多媒体数据检索应答 |
| 58 | 0x8803 | √ | √ | 存储多媒体数据上传 | | 58 | 0x8803 | √ | √ | 存储多媒体数据上传 |
@@ -379,3 +379,5 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0
| 69 | 0x8004 | √ | √ | 查询服务器时间应答 |新增| | 69 | 0x8004 | √ | √ | 查询服务器时间应答 |新增|
| 70 | 0x0005 | √ | √ | 终端补传分包请求 |新增| | 70 | 0x0005 | √ | √ | 终端补传分包请求 |新增|
| 71 | 0x8204 | √ | √ | 链路检测 |新增| | 71 | 0x8204 | √ | √ | 链路检测 |新增|
| 72 | 0x8608 | √ | √ | 查询区域或线路数据 |新增|
| 73 | 0x0608 | √ | √ | 查询区域或线路数据应答 |新增|

BIN
doc/JTT.808-2019.PDF View File


+ 2
- 0
src/JT808.Protocol.Test/JT808.Protocol.Test.csproj View File

@@ -82,6 +82,8 @@
<Compile Include="MessageBody\JT808_0x8603Test.cs" /> <Compile Include="MessageBody\JT808_0x8603Test.cs" />
<Compile Include="MessageBody\JT808_0x8604Test.cs" /> <Compile Include="MessageBody\JT808_0x8604Test.cs" />
<Compile Include="MessageBody\JT808_0x8605Test.cs" /> <Compile Include="MessageBody\JT808_0x8605Test.cs" />
<Compile Include="MessageBody\JT808_0x0608Test.cs" />
<Compile Include="MessageBody\JT808_0x8608Test.cs" />
<Compile Include="MessageBody\JT808_0x8606Test.cs" /> <Compile Include="MessageBody\JT808_0x8606Test.cs" />
<Compile Include="MessageBody\JT808_0x8800Test.cs" /> <Compile Include="MessageBody\JT808_0x8800Test.cs" />
<Compile Include="MessageBody\JT808_0x8801Test.cs" /> <Compile Include="MessageBody\JT808_0x8801Test.cs" />


+ 38
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x0608Test.cs View File

@@ -0,0 +1,38 @@
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using System;
using System.Collections.Generic;
using Xunit;
using JT808.Protocol.Metadata;

namespace JT808.Protocol.Test.MessageBody
{
public class JT808_0x0608Test
{
JT808Serializer JT808Serializer = new JT808Serializer();

[Fact]
public void Test1()
{
JT808_0x0608 value = new JT808_0x0608
{
QueryType=1,
Ids=new List<uint>() { 1,2,3}
};
var hex = JT808Serializer.Serialize(value).ToHexString();
Assert.Equal("0100000003000000010000000200000003", hex);
}

[Fact]
public void Test2()
{
byte[] bytes = "0100000003000000010000000200000003".ToHexBytes();
JT808_0x0608 value = JT808Serializer.Deserialize<JT808_0x0608>(bytes);
Assert.Equal(1, value.QueryType);
Assert.Equal(3u, value.Count);
Assert.Equal(1u, value.Ids[0]);
Assert.Equal(2u, value.Ids[1]);
Assert.Equal(3u, value.Ids[2]);
}
}
}

+ 34
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs View File

@@ -84,5 +84,39 @@ namespace JT808.Protocol.Test.MessageBody
Assert.Equal("qwertx", jT808_0X0702.LicenseIssuing); Assert.Equal("qwertx", jT808_0X0702.LicenseIssuing);
Assert.Equal(DateTime.Parse("2018-08-16"), jT808_0X0702.CertificateExpiresDate); Assert.Equal(DateTime.Parse("2018-08-16"), jT808_0X0702.CertificateExpiresDate);
} }

[Fact]
public void Test_2019_1()
{
JT808_0x0702 jT808_0X0702 = new JT808_0x0702
{
IC_Card_Status = JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班,
IC_Card_PlugDateTime = DateTime.Parse("2019-12-01 11:11:11"),
IC_Card_ReadResult = JT808ICCardReadResult.IC卡读卡成功,
DriverUserName = "koike",
QualificationCode = "qwe123456aaa",
LicenseIssuing = "qwertx",
CertificateExpiresDate = DateTime.Parse("2019-12-01"),
DriverIdentityCard="12345678901234567"
};
var hex = JT808Serializer.Serialize(jT808_0X0702, JT808Version.JTT2019).ToHexString();
Assert.Equal("0119120111111100056B6F696B6571776531323334353661616130303030303030300671776572747807E312013132333435363738393031323334353637303030", hex);
}

[Fact]
public void Test_2019_2()
{
byte[] bytes = "0119120111111100056B6F696B6571776531323334353661616130303030303030300671776572747807E312013132333435363738393031323334353637303030".ToHexBytes();
JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes, JT808Version.JTT2019);
Assert.Equal(JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班, jT808_0X0702.IC_Card_Status);
Assert.Equal(DateTime.Parse("2019-12-01 11:11:11"), jT808_0X0702.IC_Card_PlugDateTime);
Assert.Equal(JT808ICCardReadResult.IC卡读卡成功, jT808_0X0702.IC_Card_ReadResult);
Assert.Equal("koike", jT808_0X0702.DriverUserName);
Assert.Equal("qwe123456aaa00000000", jT808_0X0702.QualificationCode);
Assert.Equal("qwertx", jT808_0X0702.LicenseIssuing);
Assert.Equal(DateTime.Parse("2019-12-01"), jT808_0X0702.CertificateExpiresDate);
Assert.Equal("12345678901234567000", jT808_0X0702.DriverIdentityCard);
}
} }
} }

+ 6
- 6
src/JT808.Protocol.Test/MessageBody/JT808_0x0705Test.cs View File

@@ -20,32 +20,32 @@ namespace JT808.Protocol.Test.MessageBody
}; };
jT808_0X0705.CanItems.Add(new JT808CanProperty() jT808_0X0705.CanItems.Add(new JT808CanProperty()
{ {
CanId = new byte[] { 0x01, 0x02, 0x03, 0x04 },
CanId = 0x0120304,
CanData = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 }, CanData = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 },
}); });
jT808_0X0705.CanItems.Add(new JT808CanProperty() jT808_0X0705.CanItems.Add(new JT808CanProperty()
{ {
CanId = new byte[] { 0x05, 0x06, 0x07, 0x08 },
CanId = 0x05060708,
CanData = new byte[] { 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01 }, CanData = new byte[] { 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01 },
}); });
var hex = JT808Serializer.Serialize(jT808_0X0705).ToHexString(); var hex = JT808Serializer.Serialize(jT808_0X0705).ToHexString();
Assert.Equal("0002200005015E010203040102030401020304050607080103040506070801", hex);
Assert.Equal("0002200005015E001203040102030401020304050607080103040506070801", hex);
} }


[Fact] [Fact]
public void Test2() public void Test2()
{ {
byte[] bytes = "0002200005015E010203040102030401020304050607080103040506070801".ToHexBytes();
byte[] bytes = "0002200005015E001203040102030401020304050607080103040506070801".ToHexBytes();
JT808_0x0705 jT808_0X0705 = JT808Serializer.Deserialize<JT808_0x0705>(bytes); JT808_0x0705 jT808_0X0705 = JT808Serializer.Deserialize<JT808_0x0705>(bytes);


Assert.Equal(2, jT808_0X0705.CanItemCount); Assert.Equal(2, jT808_0X0705.CanItemCount);


Assert.Equal(DateTime.Parse("20:00:05.350"), jT808_0X0705.FirstCanReceiveTime); Assert.Equal(DateTime.Parse("20:00:05.350"), jT808_0X0705.FirstCanReceiveTime);


Assert.Equal(new byte[] { 0x01, 0x02, 0x03, 0x04 }, jT808_0X0705.CanItems[0].CanId);
Assert.Equal(0x0120304u, jT808_0X0705.CanItems[0].CanId);
Assert.Equal(new byte[] { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 }, jT808_0X0705.CanItems[0].CanData); Assert.Equal(new byte[] { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 }, jT808_0X0705.CanItems[0].CanData);


Assert.Equal(new byte[] { 0x05, 0x06, 0x07, 0x08 }, jT808_0X0705.CanItems[1].CanId);
Assert.Equal(0x05060708u , jT808_0X0705.CanItems[1].CanId);
Assert.Equal(new byte[] { 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01 }, jT808_0X0705.CanItems[1].CanData); Assert.Equal(new byte[] { 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01 }, jT808_0X0705.CanItems[1].CanData);
} }
} }


+ 58
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x8608Test.cs View File

@@ -0,0 +1,58 @@
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using System;
using System.Collections.Generic;
using Xunit;
using JT808.Protocol.Metadata;

namespace JT808.Protocol.Test.MessageBody
{
public class JT808_0x8608Test
{
JT808Serializer JT808Serializer = new JT808Serializer();

[Fact]
public void Test1()
{
JT808_0x8608 value = new JT808_0x8608
{
QueryType=0,
Ids=new List<uint>() { 1,2,3}
};
var hex = JT808Serializer.Serialize(value).ToHexString();
Assert.Equal("0000000003000000010000000200000003", hex);
}

[Fact]
public void Test2()
{
byte[] bytes = "0000000003000000010000000200000003".ToHexBytes();
JT808_0x8608 value = JT808Serializer.Deserialize<JT808_0x8608>(bytes);
Assert.Equal(0, value.QueryType);
Assert.Equal(3u, value.Count);
Assert.Equal(1u, value.Ids[0]);
Assert.Equal(2u, value.Ids[1]);
Assert.Equal(3u, value.Ids[2]);
}

[Fact]
public void Test3()
{
JT808_0x8608 value = new JT808_0x8608
{
QueryType = 1
};
var hex = JT808Serializer.Serialize(value).ToHexString();
Assert.Equal("0100000000", hex);
}

[Fact]
public void Test4()
{
byte[] bytes = "0100000000".ToHexBytes();
JT808_0x8608 value = JT808Serializer.Deserialize<JT808_0x8608>(bytes);
Assert.Equal(1, value.QueryType);
Assert.Equal(0u, value.Count);
}
}
}

+ 49
- 0
src/JT808.Protocol/JT808.Protocol.xml View File

@@ -2944,6 +2944,26 @@
位置信息汇报消息体 位置信息汇报消息体
</summary> </summary>
</member> </member>
<member name="T:JT808.Protocol.MessageBody.JT808_0x0608">
<summary>
查询区域或线路数据应答
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0608.QueryType">
<summary>
查询类型
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0608.Count">
<summary>
查询的区域或线路的ID数量
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0608.Ids">
<summary>
查询的区域或线路的ID
</summary>
</member>
<member name="T:JT808.Protocol.MessageBody.JT808_0x0701"> <member name="T:JT808.Protocol.MessageBody.JT808_0x0701">
<summary> <summary>
电子运单上报 电子运单上报
@@ -3028,6 +3048,12 @@
证件有效期 BCD[4] 证件有效期 BCD[4]
</summary> </summary>
</member> </member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0702.DriverIdentityCard">
<summary>
驾驶员身份证号 长度20 不足补0
2019版本
</summary>
</member>
<member name="T:JT808.Protocol.MessageBody.JT808_0x0704"> <member name="T:JT808.Protocol.MessageBody.JT808_0x0704">
<summary> <summary>
定位数据批量上传 定位数据批量上传
@@ -5391,6 +5417,29 @@
区域ID集合 区域ID集合
</summary> </summary>
</member> </member>
<member name="T:JT808.Protocol.MessageBody.JT808_0x8608">
<summary>
查询区域或线路数据
0x8608
2019版本
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8608.QueryType">
<summary>
查询类型
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8608.Count">
<summary>
查询的区域或线路的ID数量
0表示查询所有区域或线路数据,大于0表示后面跟随要查询的区域或线路的ID数量
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x8608.Ids">
<summary>
查询的区域或线路的ID
</summary>
</member>
<member name="T:JT808.Protocol.MessageBody.JT808_0x8702"> <member name="T:JT808.Protocol.MessageBody.JT808_0x8702">
<summary> <summary>
上报驾驶员身份信息请求 上报驾驶员身份信息请求


+ 60
- 0
src/JT808.Protocol/MessageBody/JT808_0x0608.cs View File

@@ -0,0 +1,60 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System.Collections.Generic;

namespace JT808.Protocol.MessageBody
{
/// <summary>
/// 查询区域或线路数据应答
/// </summary>
public class JT808_0x0608 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0608>, IJT808_2019_Version
{
public override ushort MsgId { get; } = 0x0608;
/// <summary>
/// 查询类型
/// </summary>
public byte QueryType { get; set; }
/// <summary>
/// 查询的区域或线路的ID数量
/// </summary>
public uint Count { get; set; }

/// <summary>
/// 查询的区域或线路的ID
/// </summary>
public List<uint> Ids { get; set; }
public JT808_0x0608 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0608 value = new JT808_0x0608();
value.QueryType = reader.ReadByte();
value.Count = reader.ReadUInt32();
if (value.Count > 0)
{
value.Ids = new List<uint>();
for (int i = 0; i < value.Count; i++)
{
value.Ids.Add(reader.ReadUInt32());
}
}
return value;
}

public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0608 value, IJT808Config config)
{
writer.WriteByte(value.QueryType);
if (value.Ids != null && value.Ids.Count > 0)
{
writer.WriteUInt32((uint)value.Ids.Count);
foreach (var item in value.Ids)
{
writer.WriteUInt32(item);
}
}
else
{
writer.WriteUInt32(0);
}
}
}
}

+ 15
- 1
src/JT808.Protocol/MessageBody/JT808_0x0702.cs View File

@@ -1,5 +1,6 @@
using JT808.Protocol.Enums; using JT808.Protocol.Enums;
using JT808.Protocol.Formatters; using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack; using JT808.Protocol.MessagePack;
using System; using System;


@@ -8,7 +9,7 @@ namespace JT808.Protocol.MessageBody
/// <summary> /// <summary>
/// 驾驶员身份信息采集上报 /// 驾驶员身份信息采集上报
/// </summary> /// </summary>
public class JT808_0x0702 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0702>
public class JT808_0x0702 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0702>, IJT808_2019_Version
{ {
public override ushort MsgId { get; } = 0x0702; public override ushort MsgId { get; } = 0x0702;
/// <summary> /// <summary>
@@ -58,6 +59,11 @@ namespace JT808.Protocol.MessageBody
/// 证件有效期 BCD[4] /// 证件有效期 BCD[4]
/// </summary> /// </summary>
public DateTime CertificateExpiresDate { get; set; } public DateTime CertificateExpiresDate { get; set; }
/// <summary>
/// 驾驶员身份证号 长度20 不足补0
/// 2019版本
/// </summary>
public string DriverIdentityCard { get; set; }
public JT808_0x0702 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) public JT808_0x0702 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{ {
JT808_0x0702 jT808_0X0702 = new JT808_0x0702(); JT808_0x0702 jT808_0X0702 = new JT808_0x0702();
@@ -74,6 +80,10 @@ namespace JT808.Protocol.MessageBody
jT808_0X0702.LicenseIssuingLength = reader.ReadByte(); jT808_0X0702.LicenseIssuingLength = reader.ReadByte();
jT808_0X0702.LicenseIssuing = reader.ReadString(jT808_0X0702.LicenseIssuingLength); jT808_0X0702.LicenseIssuing = reader.ReadString(jT808_0X0702.LicenseIssuingLength);
jT808_0X0702.CertificateExpiresDate = reader.ReadDateTime4(); jT808_0X0702.CertificateExpiresDate = reader.ReadDateTime4();
if(reader.Version== JT808Version.JTT2019)
{
jT808_0X0702.DriverIdentityCard = reader.ReadString(20);
}
} }
} }
return jT808_0X0702; return jT808_0X0702;
@@ -94,6 +104,10 @@ namespace JT808.Protocol.MessageBody
writer.WriteByte((byte)value.LicenseIssuing.Length); writer.WriteByte((byte)value.LicenseIssuing.Length);
writer.WriteString(value.LicenseIssuing); writer.WriteString(value.LicenseIssuing);
writer.WriteDateTime4(value.CertificateExpiresDate); writer.WriteDateTime4(value.CertificateExpiresDate);
if (writer.Version == JT808Version.JTT2019)
{
writer.WriteString(value.DriverIdentityCard.PadRight(20,'0'));
}
} }
} }
} }


+ 4
- 11
src/JT808.Protocol/MessageBody/JT808_0x0705.cs View File

@@ -1,5 +1,6 @@
using JT808.Protocol.Exceptions; using JT808.Protocol.Exceptions;
using JT808.Protocol.Formatters; using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack; using JT808.Protocol.MessagePack;
using JT808.Protocol.Metadata; using JT808.Protocol.Metadata;
using System; using System;
@@ -11,7 +12,7 @@ namespace JT808.Protocol.MessageBody
/// CAN 总线数据上传 /// CAN 总线数据上传
/// 0x0705 /// 0x0705
/// </summary> /// </summary>
public class JT808_0x0705 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0705>
public class JT808_0x0705 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0705>,IJT808_2019_Version
{ {
public override ushort MsgId { get; } = 0x0705; public override ushort MsgId { get; } = 0x0705;
/// <summary> /// <summary>
@@ -38,11 +39,7 @@ namespace JT808.Protocol.MessageBody
for (var i = 0; i < jT808_0X0705.CanItemCount; i++) for (var i = 0; i < jT808_0X0705.CanItemCount; i++)
{ {
JT808CanProperty jT808CanProperty = new JT808CanProperty(); JT808CanProperty jT808CanProperty = new JT808CanProperty();
jT808CanProperty.CanId = reader.ReadArray(4).ToArray();
if (jT808CanProperty.CanId.Length != 4)
{
throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(jT808CanProperty.CanId)}->4");
}
jT808CanProperty.CanId = reader.ReadUInt32();
jT808CanProperty.CanData = reader.ReadArray(8).ToArray(); jT808CanProperty.CanData = reader.ReadArray(8).ToArray();
if (jT808CanProperty.CanData.Length != 8) if (jT808CanProperty.CanData.Length != 8)
{ {
@@ -61,11 +58,7 @@ namespace JT808.Protocol.MessageBody
writer.WriteDateTime5(value.FirstCanReceiveTime); writer.WriteDateTime5(value.FirstCanReceiveTime);
foreach (var item in value.CanItems) foreach (var item in value.CanItems)
{ {
if (item.CanId.Length != 4)
{
throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(item.CanId)}->4");
}
writer.WriteArray(item.CanId);
writer.WriteUInt32(item.CanId);
if (item.CanData.Length != 8) if (item.CanData.Length != 8)
{ {
throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(item.CanData)}->8"); throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(item.CanData)}->8");


+ 2
- 1
src/JT808.Protocol/MessageBody/JT808_0x0801.cs View File

@@ -1,5 +1,6 @@
using JT808.Protocol.Attributes; using JT808.Protocol.Attributes;
using JT808.Protocol.Formatters; using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack; using JT808.Protocol.MessagePack;


namespace JT808.Protocol.MessageBody namespace JT808.Protocol.MessageBody
@@ -8,7 +9,7 @@ namespace JT808.Protocol.MessageBody
/// 多媒体数据上传 /// 多媒体数据上传
/// 0x0801 /// 0x0801
/// </summary> /// </summary>
public class JT808_0x0801 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0801>
public class JT808_0x0801 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0801>, IJT808_2019_Version
{ {
public override ushort MsgId { get; } = 0x0801; public override ushort MsgId { get; } = 0x0801;
/// <summary> /// <summary>


+ 16
- 9
src/JT808.Protocol/MessageBody/JT808_0x0805.cs View File

@@ -1,4 +1,5 @@
using JT808.Protocol.Formatters; using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack; using JT808.Protocol.MessagePack;
using System.Collections.Generic; using System.Collections.Generic;


@@ -8,7 +9,7 @@ namespace JT808.Protocol.MessageBody
/// 摄像头立即拍摄命令应答 /// 摄像头立即拍摄命令应答
/// 0x0805 /// 0x0805
/// </summary> /// </summary>
public class JT808_0x0805 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0805>
public class JT808_0x0805 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0805>, IJT808_2019_Version
{ {
public override ushort MsgId { get; } = 0x0805; public override ushort MsgId { get; } = 0x0805;
/// <summary> /// <summary>
@@ -36,12 +37,15 @@ namespace JT808.Protocol.MessageBody
JT808_0x0805 jT808_0X0805 = new JT808_0x0805(); JT808_0x0805 jT808_0X0805 = new JT808_0x0805();
jT808_0X0805.ReplyMsgNum = reader.ReadUInt16(); jT808_0X0805.ReplyMsgNum = reader.ReadUInt16();
jT808_0X0805.Result = reader.ReadByte(); jT808_0X0805.Result = reader.ReadByte();
jT808_0X0805.MultimediaIdCount = reader.ReadUInt16();
jT808_0X0805.MultimediaIds = new List<uint>();
for (var i = 0; i < jT808_0X0805.MultimediaIdCount; i++)
if (jT808_0X0805.Result == 0)
{ {
uint id = reader.ReadUInt32();
jT808_0X0805.MultimediaIds.Add(id);
jT808_0X0805.MultimediaIdCount = reader.ReadUInt16();
jT808_0X0805.MultimediaIds = new List<uint>();
for (var i = 0; i < jT808_0X0805.MultimediaIdCount; i++)
{
uint id = reader.ReadUInt32();
jT808_0X0805.MultimediaIds.Add(id);
}
} }
return jT808_0X0805; return jT808_0X0805;
} }
@@ -50,10 +54,13 @@ namespace JT808.Protocol.MessageBody
{ {
writer.WriteUInt16(value.ReplyMsgNum); writer.WriteUInt16(value.ReplyMsgNum);
writer.WriteByte(value.Result); writer.WriteByte(value.Result);
writer.WriteUInt16((ushort)value.MultimediaIds.Count);
foreach (var item in value.MultimediaIds)
if (value.Result == 0)
{ {
writer.WriteUInt32(item);
writer.WriteUInt16((ushort)value.MultimediaIds.Count);
foreach (var item in value.MultimediaIds)
{
writer.WriteUInt32(item);
}
} }
} }
} }


+ 64
- 0
src/JT808.Protocol/MessageBody/JT808_0x8608.cs View File

@@ -0,0 +1,64 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System.Collections.Generic;

namespace JT808.Protocol.MessageBody
{
/// <summary>
/// 查询区域或线路数据
/// 0x8608
/// 2019版本
/// </summary>
public class JT808_0x8608 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8608>, IJT808_2019_Version
{
public override ushort MsgId { get; } = 0x8608;
/// <summary>
/// 查询类型
/// </summary>
public byte QueryType { get; set; }
/// <summary>
/// 查询的区域或线路的ID数量
/// 0表示查询所有区域或线路数据,大于0表示后面跟随要查询的区域或线路的ID数量
/// </summary>
public uint Count { get; set; }

/// <summary>
/// 查询的区域或线路的ID
/// </summary>
public List<uint> Ids { get; set; }

public JT808_0x8608 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8608 value = new JT808_0x8608();
value.QueryType = reader.ReadByte();
value.Count = reader.ReadUInt32();
if (value.Count > 0)
{
value.Ids = new List<uint>();
for(int i = 0; i < value.Count; i++)
{
value.Ids.Add(reader.ReadUInt32());
}
}
return value;
}

public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8608 value, IJT808Config config)
{
writer.WriteByte(value.QueryType);
if(value.Ids!=null && value.Ids.Count > 0)
{
writer.WriteUInt32((uint)value.Ids.Count);
foreach(var item in value.Ids)
{
writer.WriteUInt32(item);
}
}
else
{
writer.WriteUInt32(0);
}
}
}
}

+ 2
- 1
src/JT808.Protocol/MessageBody/JT808_0x8801.cs View File

@@ -1,4 +1,5 @@
using JT808.Protocol.Formatters; using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack; using JT808.Protocol.MessagePack;


namespace JT808.Protocol.MessageBody namespace JT808.Protocol.MessageBody
@@ -7,7 +8,7 @@ namespace JT808.Protocol.MessageBody
/// 摄像头立即拍摄命令 /// 摄像头立即拍摄命令
/// 0x8801 /// 0x8801
/// </summary> /// </summary>
public class JT808_0x8801 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8801>
public class JT808_0x8801 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8801>, IJT808_2019_Version
{ {
public override ushort MsgId { get; } = 0x8801; public override ushort MsgId { get; } = 0x8801;
/// <summary> /// <summary>


+ 5
- 3
src/JT808.Protocol/Metadata/JT808CanProperty.cs View File

@@ -1,15 +1,17 @@
namespace JT808.Protocol.Metadata
using JT808.Protocol.Interfaces;

namespace JT808.Protocol.Metadata
{ {
/// <summary> /// <summary>
/// Can属性 /// Can属性
/// </summary> /// </summary>
public struct JT808CanProperty
public struct JT808CanProperty: IJT808_2019_Version
{ {
/// <summary> /// <summary>
/// CAN ID /// CAN ID
/// 4 /// 4
/// </summary> /// </summary>
public byte[] CanId { get; set; }
public uint CanId { get; set; }
/// <summary> /// <summary>
/// CAN 数据 /// CAN 数据
/// 8 /// 8


Loading…
Cancel
Save