@@ -12,7 +12,7 @@ jobs: | |||||
- name: Setup .NET Core | - name: Setup .NET Core | ||||
uses: actions/setup-dotnet@master | uses: actions/setup-dotnet@master | ||||
with: | with: | ||||
dotnet-version: 3.1.101 | |||||
dotnet-version: 3.1.302 | |||||
- name: dotnet info | - name: dotnet info | ||||
run: dotnet --info | run: dotnet --info | ||||
- name: dotnet restore | - name: dotnet restore | ||||
@@ -12,10 +12,10 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="JT808" Version="2.2.10" /> | <PackageReference Include="JT808" Version="2.2.10" /> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.4" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.6" /> | |||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" /> | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" /> | ||||
<PackageReference Include="xunit" Version="2.4.1" /> | <PackageReference Include="xunit" Version="2.4.1" /> | ||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | |||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2"> | |||||
<PrivateAssets>all</PrivateAssets> | <PrivateAssets>all</PrivateAssets> | ||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> | <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> | ||||
</PackageReference> | </PackageReference> | ||||
@@ -0,0 +1,45 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using Xunit; | |||||
using JT809.Protocol; | |||||
using JT809.Protocol.Extensions; | |||||
using JT809.Protocol.MessageBody; | |||||
using JT809.Protocol.Exceptions; | |||||
using JT809.Protocol.SubMessageBody; | |||||
using JT809.Protocol.Enums; | |||||
using JT809.Protocol.Internal; | |||||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||||
{ | |||||
public class JT809_0x1200_0x1205Test | |||||
{ | |||||
private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 }); | |||||
/// <summary> | |||||
/// 1078qq群808432702:大兄弟提供的 | |||||
/// </summary> | |||||
[Fact] | |||||
public void Test1() | |||||
{ | |||||
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD43131313100000000000000000000000000041205040000000400000000001B735D".ToHexBytes(); | |||||
JT809Package jT809Package = JT809_2019_Serializer.Deserialize(bytes); | |||||
var body = jT809Package.Bodies as JT809_0x1200; | |||||
var subBody = body.SubBodies as JT809_0x1200_0x1205; | |||||
Assert.NotNull(body); | |||||
Assert.NotNull(subBody); | |||||
Assert.Equal("测试1111", body.VehicleNo); | |||||
Assert.Equal(JT809VehicleColorType.白色, body.VehicleColor); | |||||
Assert.Equal(1024u, subBody.SourceDataType); | |||||
Assert.Equal(1024u, subBody.SourceMsgSN); | |||||
Assert.Equal(0u, subBody.DataLength); | |||||
} | |||||
[Fact] | |||||
public void Test2() | |||||
{ | |||||
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD43131313100000000000000000000000000041205040000000400000000001B735D".ToHexBytes(); | |||||
string json = JT809_2019_Serializer.Analyze(bytes); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,45 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using Xunit; | |||||
using JT809.Protocol; | |||||
using JT809.Protocol.Extensions; | |||||
using JT809.Protocol.MessageBody; | |||||
using JT809.Protocol.Exceptions; | |||||
using JT809.Protocol.SubMessageBody; | |||||
using JT809.Protocol.Enums; | |||||
using JT809.Protocol.Internal; | |||||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||||
{ | |||||
public class JT809_0x1200_0x1206Test | |||||
{ | |||||
private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 }); | |||||
/// <summary> | |||||
/// 1078qq群808432702:大兄弟提供的 | |||||
/// </summary> | |||||
[Fact] | |||||
public void Test1() | |||||
{ | |||||
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD431313131000000000000000000000000000412060400000004000000000063895D".ToHexBytes(); | |||||
JT809Package jT809Package = JT809_2019_Serializer.Deserialize(bytes); | |||||
var body = jT809Package.Bodies as JT809_0x1200; | |||||
var subBody = body.SubBodies as JT809_0x1200_0x1206; | |||||
Assert.NotNull(body); | |||||
Assert.NotNull(subBody); | |||||
Assert.Equal("测试1111", body.VehicleNo); | |||||
Assert.Equal(JT809VehicleColorType.白色, body.VehicleColor); | |||||
Assert.Equal(1024u, subBody.SourceDataType); | |||||
Assert.Equal(1024u, subBody.SourceMsgSN); | |||||
Assert.Equal(0u, subBody.DataLength); | |||||
} | |||||
[Fact] | |||||
public void Test2() | |||||
{ | |||||
var bytes = "5B00000044000004571200000004570101010000000000000000004EBC924FB2E2CAD431313131000000000000000000000000000412060400000004000000000063895D".ToHexBytes(); | |||||
string json = JT809_2019_Serializer.Analyze(bytes); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,49 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using Xunit; | |||||
using JT809.Protocol; | |||||
using JT809.Protocol.Extensions; | |||||
using JT809.Protocol.MessageBody; | |||||
using JT809.Protocol.Exceptions; | |||||
using JT809.Protocol.SubMessageBody; | |||||
using JT809.Protocol.Enums; | |||||
using JT809.Protocol.Internal; | |||||
namespace JT809.Protocol.Test.JT809SubMessageBody | |||||
{ | |||||
public class JT809_0x9200_0x9201Test | |||||
{ | |||||
private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 }); | |||||
/// <summary> | |||||
/// 1078qq群808432702:大兄弟提供的 | |||||
/// 由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过 | |||||
/// </summary> | |||||
[Fact] | |||||
public void Test1() | |||||
{ | |||||
var bytes = "5B0000002F000004579200000004570101010000000000000000004EBC924F9201000000070400000004000189DA5D".ToHexBytes(); | |||||
JT809Package jT809_0X9200_0X9201 = JT809_2019_Serializer.Deserialize(bytes); | |||||
var body = jT809_0X9200_0X9201.Bodies as JT809_0x9200; | |||||
var subBody = body.SubBodies as JT809_0x9200_0x9201; | |||||
Assert.NotNull(body); | |||||
Assert.NotNull(subBody); | |||||
Assert.Equal(JT809VehicleColorType.其他, body.VehicleColor); | |||||
Assert.Equal(JT809_0x9201_Result.审核通过_完成注册, subBody.Result); | |||||
Assert.Equal(1024u, subBody.MsgSn); | |||||
Assert.Equal(1024u, subBody.DataType); | |||||
} | |||||
/// <summary> | |||||
/// 1078qq群808432702:大兄弟提供的 | |||||
/// 由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过 | |||||
/// </summary> | |||||
[Fact] | |||||
public void Test2() | |||||
{ | |||||
var bytes = "5B0000002F000004579200000004570101010000000000000000004EBC924F9201000000070400000004000189DA5D".ToHexBytes(); | |||||
string json = JT809_2019_Serializer.Analyze(bytes); | |||||
} | |||||
} | |||||
} |
@@ -15,6 +15,7 @@ namespace JT809.Protocol.Enums | |||||
BodiesParseError=1007, | BodiesParseError=1007, | ||||
SubBodiesParseError = 1008, | SubBodiesParseError = 1008, | ||||
GetAttributeError=1009, | GetAttributeError=1009, | ||||
ReaderRemainContentLengthError = 1010, | |||||
NotGlobalRegisterFormatterAssembly=1011, | NotGlobalRegisterFormatterAssembly=1011, | ||||
} | } | ||||
} | } |
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT809</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT809</PackageProjectUrl> | ||||
<license>https://github.com/SmallChi/JT809/blob/master/LICENSE</license> | <license>https://github.com/SmallChi/JT809/blob/master/LICENSE</license> | ||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>2.1.4-preview4</Version> | |||||
<Version>2.1.4-preview5</Version> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | <PackageLicenseFile>LICENSE</PackageLicenseFile> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
@@ -112,7 +112,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> | <PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> | ||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.7.1" /> | <PackageReference Include="System.Text.Encoding.CodePages" Version="4.7.1" /> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.4" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.6" /> | |||||
<PackageReference Include="System.Text.Json" Version="4.7.2" /> | <PackageReference Include="System.Text.Json" Version="4.7.2" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
@@ -1333,6 +1333,12 @@ | |||||
当数据体为空的时候,使用null作为空包感觉不适合,所以就算使用空包也需要new一下来表达意思。 | 当数据体为空的时候,使用null作为空包感觉不适合,所以就算使用空包也需要new一下来表达意思。 | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT809.Protocol.JT809SubBodies.SkipDataLength"> | |||||
<summary> | |||||
2019文档导致需要兼容 | |||||
是否跳过后续的长度 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT809.Protocol.JT809SubBodies.ReplaceInternalSubMsgId"> | <member name="P:JT809.Protocol.JT809SubBodies.ReplaceInternalSubMsgId"> | ||||
<summary> | <summary> | ||||
当外部注册的扩展809的消息Id跟国标的消息Id冲突时可以使用该字段替换国标的消息Id | 当外部注册的扩展809的消息Id跟国标的消息Id冲突时可以使用该字段替换国标的消息Id | ||||
@@ -1663,6 +1669,11 @@ | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT809.Protocol.MessageBody.JT809_0x9007.ErrorCode"> | <member name="P:JT809.Protocol.MessageBody.JT809_0x9007.ErrorCode"> | ||||
<summary> | |||||
错误代码 2019版本 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT809.Protocol.MessageBody.JT809_0x9007.ReasonCode"> | |||||
<summary> | <summary> | ||||
错误代码 | 错误代码 | ||||
</summary> | </summary> | ||||
@@ -1680,11 +1691,11 @@ | |||||
</member> | </member> | ||||
<member name="T:JT809.Protocol.MessageBody.JT809_0x9101"> | <member name="T:JT809.Protocol.MessageBody.JT809_0x9101"> | ||||
<summary> | <summary> | ||||
接收车辆定位信息数量通知消息 | |||||
<para>链路类型:从链路</para> | |||||
发送车辆定位信息数量通知信息 | |||||
<para>链路类型:主链路</para> | |||||
<para>消息方向:上级平台往下级平台</para> | <para>消息方向:上级平台往下级平台</para> | ||||
<para>业务类型标识: DOWN_TOTAL_RECV_BACK_MSG</para> | |||||
<para>描述:上级平台向下级平台定星通知已经收到下级平台上传的车辆定位信息数量(如:每收到10,000 条车辆定位信息通知一次)</para> | |||||
<para>业务类型标识: UP_MANAGE_TOTAL_RECV_BACK_MSG</para> | |||||
<para>描述:下级平台向上级平台定量通知已经上传的车辆定位信息数量(如:每收到10,000 条车辆定位信息通知一次)</para> | |||||
<para>本条消息不需下级平台应答。</para> | <para>本条消息不需下级平台应答。</para> | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
@@ -2220,12 +2231,17 @@ | |||||
<para>描述:本条消息是下级平台对上级平台下发的 DOWN_EXG_MSG_RETURN_STARTUP 消息的应答消息</para> | <para>描述:本条消息是下级平台对上级平台下发的 DOWN_EXG_MSG_RETURN_STARTUP 消息的应答消息</para> | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205.DataType"> | |||||
<summary> | |||||
子业务类型标识 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205.SourceDataType"> | <member name="P:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205.SourceDataType"> | ||||
<summary> | <summary> | ||||
对应启动车辆定位信息交换请求消息源子业务类型标识 | 对应启动车辆定位信息交换请求消息源子业务类型标识 | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205.SourceMsgSn"> | |||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1205.SourceMsgSN"> | |||||
<summary> | <summary> | ||||
对应启动车辆定位信息交换请求消息源报文序列号 | 对应启动车辆定位信息交换请求消息源报文序列号 | ||||
</summary> | </summary> | ||||
@@ -2247,7 +2263,7 @@ | |||||
对应结束车辆定位信息交换请求消息源子业务类型标识 | 对应结束车辆定位信息交换请求消息源子业务类型标识 | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1206.SourceMsgSn"> | |||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1206.SourceMsgSN"> | |||||
<summary> | <summary> | ||||
对应结束车辆定位信息交换请求消息源报文序列号 | 对应结束车辆定位信息交换请求消息源报文序列号 | ||||
</summary> | </summary> | ||||
@@ -2971,6 +2987,11 @@ | |||||
<para>描述:上级平台在收到下级平台上报的车辆注册信息后,向下级平台发送车辆注册应答消息</para> | <para>描述:上级平台在收到下级平台上报的车辆注册信息后,向下级平台发送车辆注册应答消息</para> | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x9200_0x9201.DataType"> | |||||
<summary> | |||||
车辆注册醒醒消息源子业务类型标识 | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT809.Protocol.SubMessageBody.JT809_0x9200_0x9201.MsgSn"> | <member name="P:JT809.Protocol.SubMessageBody.JT809_0x9200_0x9201.MsgSn"> | ||||
<summary> | <summary> | ||||
车辆注册信息消息源报文序号 | 车辆注册信息消息源报文序号 | ||||
@@ -13,6 +13,11 @@ namespace JT809.Protocol | |||||
/// 当数据体为空的时候,使用null作为空包感觉不适合,所以就算使用空包也需要new一下来表达意思。 | /// 当数据体为空的时候,使用null作为空包感觉不适合,所以就算使用空包也需要new一下来表达意思。 | ||||
/// </summary> | /// </summary> | ||||
public virtual bool SkipSerialization { get; set; } = false; | public virtual bool SkipSerialization { get; set; } = false; | ||||
/// <summary> | |||||
/// 2019文档导致需要兼容 | |||||
/// 是否跳过后续的长度 | |||||
/// </summary> | |||||
public virtual bool SkipDataLength { get; set; } = false; | |||||
public abstract ushort SubMsgId { get; } | public abstract ushort SubMsgId { get; } | ||||
@@ -5,6 +5,7 @@ using JT809.Protocol.Formatters; | |||||
using JT809.Protocol.Interfaces; | using JT809.Protocol.Interfaces; | ||||
using JT809.Protocol.MessagePack; | using JT809.Protocol.MessagePack; | ||||
using System; | using System; | ||||
using System.Collections.Generic; | |||||
using System.Text.Json; | using System.Text.Json; | ||||
namespace JT809.Protocol.MessageBody | namespace JT809.Protocol.MessageBody | ||||
@@ -32,14 +33,17 @@ namespace JT809.Protocol.MessageBody | |||||
writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); | writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); | ||||
value.SubBusinessType = reader.ReadUInt16(); | value.SubBusinessType = reader.ReadUInt16(); | ||||
writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); | writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); | ||||
value.DataLength = reader.ReadUInt32(); | |||||
writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); | |||||
try | try | ||||
{ | { | ||||
if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) | if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) | ||||
{ | { | ||||
if (instance is JT809SubBodies subBodies) | if (instance is JT809SubBodies subBodies) | ||||
{ | { | ||||
if (!subBodies.SkipDataLength) | |||||
{ | |||||
value.DataLength = reader.ReadUInt32(); | |||||
writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength); | |||||
} | |||||
if (!subBodies.SkipSerialization) | if (!subBodies.SkipSerialization) | ||||
{ | { | ||||
writer.WriteStartObject("子业务类型"); | writer.WriteStartObject("子业务类型"); | ||||
@@ -61,13 +65,16 @@ namespace JT809.Protocol.MessageBody | |||||
value.VehicleNo = reader.ReadString(21); | value.VehicleNo = reader.ReadString(21); | ||||
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | ||||
value.SubBusinessType = reader.ReadUInt16(); | value.SubBusinessType = reader.ReadUInt16(); | ||||
value.DataLength = reader.ReadUInt32(); | |||||
try | try | ||||
{ | { | ||||
if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) | if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance)) | ||||
{ | { | ||||
if (instance is JT809SubBodies subBodies) | if (instance is JT809SubBodies subBodies) | ||||
{ | { | ||||
if (!subBodies.SkipDataLength) | |||||
{ | |||||
value.DataLength = reader.ReadUInt32(); | |||||
} | |||||
if (!subBodies.SkipSerialization) | if (!subBodies.SkipSerialization) | ||||
{ | { | ||||
value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( | value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( | ||||
@@ -91,19 +98,35 @@ namespace JT809.Protocol.MessageBody | |||||
writer.WriteUInt16(value.SubBusinessType); | writer.WriteUInt16(value.SubBusinessType); | ||||
try | try | ||||
{ | { | ||||
// 先写入内容,然后在根据内容反写内容长度 | |||||
writer.Skip(4, out int subContentLengthPosition); | |||||
if (value.SubBodies != null) | |||||
if (value.SubBodies.SkipDataLength) | |||||
{ | |||||
if (value.SubBodies != null) | |||||
{ | |||||
if (!value.SubBodies.SkipSerialization) | |||||
{ | |||||
JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( | |||||
value.SubBodies, | |||||
ref writer, value.SubBodies, | |||||
config); | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | { | ||||
if (!value.SubBodies.SkipSerialization) | |||||
// 先写入内容,然后在根据内容反写内容长度 | |||||
writer.Skip(4, out int subContentLengthPosition); | |||||
if (value.SubBodies != null) | |||||
{ | { | ||||
JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( | |||||
value.SubBodies, | |||||
ref writer, value.SubBodies, | |||||
config); | |||||
if (!value.SubBodies.SkipSerialization) | |||||
{ | |||||
JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize( | |||||
value.SubBodies, | |||||
ref writer, value.SubBodies, | |||||
config); | |||||
} | |||||
} | } | ||||
writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); | |||||
} | } | ||||
writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition); | |||||
} | } | ||||
catch(Exception ex) | catch(Exception ex) | ||||
{ | { | ||||
@@ -24,11 +24,28 @@ namespace JT809.Protocol.MessageBody | |||||
public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) | public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) | ||||
{ | { | ||||
JT809_0x9200 value = new JT809_0x9200(); | JT809_0x9200 value = new JT809_0x9200(); | ||||
var virtualHex = reader.ReadVirtualArray(21); | |||||
value.VehicleNo = reader.ReadString(21); | |||||
writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); | |||||
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | |||||
writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); | |||||
//1078qq群808432702:大兄弟提供的 | |||||
//由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过 | |||||
if (config.Version == JT809Version.JTT2019) | |||||
{ | |||||
var subBusinessType = reader.ReadVirtualUInt16(); | |||||
if (subBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value()) | |||||
{ | |||||
var virtualHex = reader.ReadVirtualArray(21); | |||||
value.VehicleNo = reader.ReadString(21); | |||||
writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); | |||||
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | |||||
writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
var virtualHex = reader.ReadVirtualArray(21); | |||||
value.VehicleNo = reader.ReadString(21); | |||||
writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo); | |||||
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | |||||
writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); | |||||
} | |||||
value.SubBusinessType = reader.ReadUInt16(); | value.SubBusinessType = reader.ReadUInt16(); | ||||
writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); | writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString()); | ||||
value.DataLength = reader.ReadUInt32(); | value.DataLength = reader.ReadUInt32(); | ||||
@@ -57,8 +74,22 @@ namespace JT809.Protocol.MessageBody | |||||
public JT809_0x9200 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | public JT809_0x9200 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | ||||
{ | { | ||||
JT809_0x9200 value = new JT809_0x9200(); | JT809_0x9200 value = new JT809_0x9200(); | ||||
value.VehicleNo = reader.ReadString(21); | |||||
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | |||||
//1078qq群808432702:大兄弟提供的 | |||||
//由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过 | |||||
if(config.Version== JT809Version.JTT2019) | |||||
{ | |||||
var subBusinessType = reader.ReadVirtualUInt16(); | |||||
if (subBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value()) | |||||
{ | |||||
value.VehicleNo = reader.ReadString(21); | |||||
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
value.VehicleNo = reader.ReadString(21); | |||||
value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); | |||||
} | |||||
value.SubBusinessType = reader.ReadUInt16(); | value.SubBusinessType = reader.ReadUInt16(); | ||||
value.DataLength = reader.ReadUInt32(); | value.DataLength = reader.ReadUInt32(); | ||||
try | try | ||||
@@ -85,8 +116,21 @@ namespace JT809.Protocol.MessageBody | |||||
public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200 value, IJT809Config config) | public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200 value, IJT809Config config) | ||||
{ | { | ||||
writer.WriteStringPadRight(value.VehicleNo, 21); | |||||
writer.WriteByte((byte)value.VehicleColor); | |||||
//1078qq群808432702:大兄弟提供的 | |||||
//由于车辆注册信息应答消息0x9201子业务不存在车牌号和颜色需要跳过 | |||||
if (config.Version == JT809Version.JTT2019) | |||||
{ | |||||
if (value.SubBusinessType != JT809SubBusinessType.车辆注册信息应答消息.ToUInt16Value()) | |||||
{ | |||||
writer.WriteStringPadRight(value.VehicleNo, 21); | |||||
writer.WriteByte((byte)value.VehicleColor); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
writer.WriteStringPadRight(value.VehicleNo, 21); | |||||
writer.WriteByte((byte)value.VehicleColor); | |||||
} | |||||
writer.WriteUInt16(value.SubBusinessType); | writer.WriteUInt16(value.SubBusinessType); | ||||
try | try | ||||
{ | { | ||||
@@ -1,4 +1,5 @@ | |||||
using JT809.Protocol.Buffers; | using JT809.Protocol.Buffers; | ||||
using JT809.Protocol.Exceptions; | |||||
using JT809.Protocol.Extensions; | using JT809.Protocol.Extensions; | ||||
using System; | using System; | ||||
using System.Buffers; | using System.Buffers; | ||||
@@ -445,15 +446,18 @@ namespace JT809.Protocol.MessagePack | |||||
} | } | ||||
public int ReadCurrentRemainContentLength() | public int ReadCurrentRemainContentLength() | ||||
{ | { | ||||
int len = 0; | |||||
if (_decoded) | if (_decoded) | ||||
{ | { | ||||
len = Reader.Length - ReaderCount - 3; | |||||
//内容长度=总长度-读取的长度-3(校验码2位+终止符1位) | //内容长度=总长度-读取的长度-3(校验码2位+终止符1位) | ||||
return Reader.Length - ReaderCount - 3; | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
return Reader.Length - ReaderCount; | |||||
len= Reader.Length - ReaderCount; | |||||
} | } | ||||
if (len < 0) throw new JT809Exception(Enums.JT809ErrorCode.ReaderRemainContentLengthError); | |||||
return len; | |||||
} | } | ||||
public void Skip(int count=1) | public void Skip(int count=1) | ||||
{ | { | ||||
@@ -22,6 +22,11 @@ namespace JT809.Protocol.SubMessageBody | |||||
public override string Description => "启动车辆定位信息交换应答消息"; | public override string Description => "启动车辆定位信息交换应答消息"; | ||||
public override bool SkipSerialization => false; | public override bool SkipSerialization => false; | ||||
public override bool SkipDataLength => true; | |||||
/// <summary> | |||||
/// 子业务类型标识 | |||||
/// </summary> | |||||
public ushort DataType { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 对应启动车辆定位信息交换请求消息源子业务类型标识 | /// 对应启动车辆定位信息交换请求消息源子业务类型标识 | ||||
/// </summary> | /// </summary> | ||||
@@ -29,7 +34,7 @@ namespace JT809.Protocol.SubMessageBody | |||||
/// <summary> | /// <summary> | ||||
/// 对应启动车辆定位信息交换请求消息源报文序列号 | /// 对应启动车辆定位信息交换请求消息源报文序列号 | ||||
/// </summary> | /// </summary> | ||||
public uint SourceMsgSn { get; set; } | |||||
public uint SourceMsgSN { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 后续数据长度 值为0x00 | /// 后续数据长度 值为0x00 | ||||
/// </summary> | /// </summary> | ||||
@@ -42,8 +47,8 @@ namespace JT809.Protocol.SubMessageBody | |||||
{ | { | ||||
value.SourceDataType = reader.ReadUInt16(); | value.SourceDataType = reader.ReadUInt16(); | ||||
writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); | writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); | ||||
value.SourceMsgSn = reader.ReadUInt32(); | |||||
writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); | |||||
value.SourceMsgSN = reader.ReadUInt32(); | |||||
writer.WriteNumber($"[{value.SourceMsgSN.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSN); | |||||
value.DataLength = reader.ReadUInt32(); | value.DataLength = reader.ReadUInt32(); | ||||
writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength); | writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength); | ||||
} | } | ||||
@@ -52,9 +57,10 @@ namespace JT809.Protocol.SubMessageBody | |||||
public JT809_0x1200_0x1205 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | public JT809_0x1200_0x1205 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | ||||
{ | { | ||||
var value = new JT809_0x1200_0x1205(); | var value = new JT809_0x1200_0x1205(); | ||||
if (config.Version == JT809Version.JTT2019) { | |||||
if (config.Version == JT809Version.JTT2019) | |||||
{ | |||||
value.SourceDataType = reader.ReadUInt16(); | value.SourceDataType = reader.ReadUInt16(); | ||||
value.SourceMsgSn = reader.ReadUInt32(); | |||||
value.SourceMsgSN = reader.ReadUInt32(); | |||||
value.DataLength = reader.ReadUInt32(); | value.DataLength = reader.ReadUInt32(); | ||||
} | } | ||||
return value; | return value; | ||||
@@ -62,9 +68,10 @@ namespace JT809.Protocol.SubMessageBody | |||||
public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1205 value, IJT809Config config) | public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1205 value, IJT809Config config) | ||||
{ | { | ||||
if (config.Version == JT809Version.JTT2019) { | |||||
if (config.Version == JT809Version.JTT2019) | |||||
{ | |||||
writer.WriteUInt16(value.SourceDataType); | writer.WriteUInt16(value.SourceDataType); | ||||
writer.WriteUInt32(value.SourceMsgSn); | |||||
writer.WriteUInt32(value.SourceMsgSN); | |||||
writer.WriteUInt32(value.DataLength); | writer.WriteUInt32(value.DataLength); | ||||
} | } | ||||
} | } | ||||
@@ -20,7 +20,7 @@ namespace JT809.Protocol.SubMessageBody | |||||
public override ushort SubMsgId => JT809SubBusinessType.结束车辆定位信息交换应答消息.ToUInt16Value(); | public override ushort SubMsgId => JT809SubBusinessType.结束车辆定位信息交换应答消息.ToUInt16Value(); | ||||
public override string Description => "结束车辆定位信息交换应答消息"; | public override string Description => "结束车辆定位信息交换应答消息"; | ||||
public override bool SkipDataLength => true; | |||||
public override bool SkipSerialization => false; | public override bool SkipSerialization => false; | ||||
/// <summary> | /// <summary> | ||||
/// 对应结束车辆定位信息交换请求消息源子业务类型标识 | /// 对应结束车辆定位信息交换请求消息源子业务类型标识 | ||||
@@ -29,7 +29,7 @@ namespace JT809.Protocol.SubMessageBody | |||||
/// <summary> | /// <summary> | ||||
/// 对应结束车辆定位信息交换请求消息源报文序列号 | /// 对应结束车辆定位信息交换请求消息源报文序列号 | ||||
/// </summary> | /// </summary> | ||||
public uint SourceMsgSn { get; set; } | |||||
public uint SourceMsgSN { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 后续数据长度 值为0x00 | /// 后续数据长度 值为0x00 | ||||
/// </summary> | /// </summary> | ||||
@@ -41,9 +41,9 @@ namespace JT809.Protocol.SubMessageBody | |||||
if (config.Version == JT809Version.JTT2019) | if (config.Version == JT809Version.JTT2019) | ||||
{ | { | ||||
value.SourceDataType = reader.ReadUInt16(); | value.SourceDataType = reader.ReadUInt16(); | ||||
writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); | |||||
value.SourceMsgSn = reader.ReadUInt32(); | |||||
writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); | |||||
writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应结束车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); | |||||
value.SourceMsgSN = reader.ReadUInt32(); | |||||
writer.WriteNumber($"[{value.SourceMsgSN.ReadNumber()}对应结束车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSN); | |||||
value.DataLength = reader.ReadUInt32(); | value.DataLength = reader.ReadUInt32(); | ||||
writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength); | writer.WriteNumber($"[{value.DataLength.ReadNumber()}后续数据长度]", value.DataLength); | ||||
} | } | ||||
@@ -55,7 +55,7 @@ namespace JT809.Protocol.SubMessageBody | |||||
if (config.Version == JT809Version.JTT2019) | if (config.Version == JT809Version.JTT2019) | ||||
{ | { | ||||
value.SourceDataType = reader.ReadUInt16(); | value.SourceDataType = reader.ReadUInt16(); | ||||
value.SourceMsgSn = reader.ReadUInt32(); | |||||
value.SourceMsgSN = reader.ReadUInt32(); | |||||
value.DataLength = reader.ReadUInt32(); | value.DataLength = reader.ReadUInt32(); | ||||
} | } | ||||
return value; | return value; | ||||
@@ -66,7 +66,7 @@ namespace JT809.Protocol.SubMessageBody | |||||
if (config.Version == JT809Version.JTT2019) | if (config.Version == JT809Version.JTT2019) | ||||
{ | { | ||||
writer.WriteUInt16(value.SourceDataType); | writer.WriteUInt16(value.SourceDataType); | ||||
writer.WriteUInt32(value.SourceMsgSn); | |||||
writer.WriteUInt32(value.SourceMsgSN); | |||||
writer.WriteUInt32(value.DataLength); | writer.WriteUInt32(value.DataLength); | ||||
} | } | ||||
} | } | ||||
@@ -18,6 +18,10 @@ namespace JT809.Protocol.SubMessageBody | |||||
public override string Description => "车辆注册信息应答消息"; | public override string Description => "车辆注册信息应答消息"; | ||||
/// <summary> | /// <summary> | ||||
/// 车辆注册醒醒消息源子业务类型标识 | |||||
/// </summary> | |||||
public ushort DataType { get; set; } | |||||
/// <summary> | |||||
/// 车辆注册信息消息源报文序号 | /// 车辆注册信息消息源报文序号 | ||||
/// </summary> | /// </summary> | ||||
public uint MsgSn { get; set; } | public uint MsgSn { get; set; } | ||||
@@ -26,9 +30,12 @@ namespace JT809.Protocol.SubMessageBody | |||||
/// </summary> | /// </summary> | ||||
public JT809_0x9201_Result Result { get; set; } | public JT809_0x9201_Result Result { get; set; } | ||||
public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) | public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) | ||||
{ | { | ||||
var value = new JT809_0x9200_0x9201(); | var value = new JT809_0x9200_0x9201(); | ||||
value.DataType = reader.ReadUInt16(); | |||||
writer.WriteNumber($"[{value.DataType.ReadNumber()}]车辆注册醒醒消息源子业务类型标识", value.DataType); | |||||
value.MsgSn = reader.ReadUInt32(); | value.MsgSn = reader.ReadUInt32(); | ||||
writer.WriteNumber($"[{value.MsgSn.ReadNumber()}]车辆注册信息消息源报文序号", value.MsgSn); | writer.WriteNumber($"[{value.MsgSn.ReadNumber()}]车辆注册信息消息源报文序号", value.MsgSn); | ||||
value.Result = (JT809_0x9201_Result)reader.ReadByte(); | value.Result = (JT809_0x9201_Result)reader.ReadByte(); | ||||
@@ -38,6 +45,7 @@ namespace JT809.Protocol.SubMessageBody | |||||
public JT809_0x9200_0x9201 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | public JT809_0x9200_0x9201 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | ||||
{ | { | ||||
var value = new JT809_0x9200_0x9201(); | var value = new JT809_0x9200_0x9201(); | ||||
value.DataType = reader.ReadUInt16(); | |||||
value.MsgSn = reader.ReadUInt32(); | value.MsgSn = reader.ReadUInt32(); | ||||
value.Result = (JT809_0x9201_Result)reader.ReadByte(); | value.Result = (JT809_0x9201_Result)reader.ReadByte(); | ||||
return value; | return value; | ||||
@@ -45,6 +53,7 @@ namespace JT809.Protocol.SubMessageBody | |||||
public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9201 value, IJT809Config config) | public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9201 value, IJT809Config config) | ||||
{ | { | ||||
writer.WriteUInt16(value.DataType); | |||||
writer.WriteUInt32(value.MsgSn); | writer.WriteUInt32(value.MsgSn); | ||||
writer.WriteByte((byte)value.Result); | writer.WriteByte((byte)value.Result); | ||||
} | } | ||||