From 284858cb4307ee41b0637c6e44bacf503b38227d Mon Sep 17 00:00:00 2001 From: waterliu99 Date: Tue, 20 Jul 2021 22:44:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B92011=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++ .../MessageBody/JT808_0x0100Test.cs | 53 ++++++++++++ src/JT808.Protocol.Test/Simples/Demo16.cs | 83 +++++++++++++++++++ src/JT808.Protocol/Enums/JT808Version.cs | 6 +- src/JT808.Protocol/JT808.Protocol.xml | 6 ++ .../MessageBody/JT808_0x0100.cs | 63 ++++++++++---- 6 files changed, 200 insertions(+), 18 deletions(-) create mode 100644 src/JT808.Protocol.Test/Simples/Demo16.cs diff --git a/README.md b/README.md index 1f8c83f..3fa766c 100644 --- a/README.md +++ b/README.md @@ -334,6 +334,13 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); [可以参考Simples的Demo15](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo15.cs) +### 举个栗子16 + +场景: +兼容2011协议的注册消息 + +[可以参考Simples的Demo15](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo16.cs) + ## NuGet安装 | Package Name| Version| Preview Version |Downloads|Remark| diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs index affce6f..d492903 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs @@ -153,5 +153,58 @@ namespace JT808.Protocol.Test.MessageBody byte[] bytes = "7e0100405401000000000222222222220001000000003030304b6f696b65303032303030303030303030303030303030303030303030304b6f696b65303032303030303030303030303030303030303030303030304b6f696b6530303202d4c1413132333436107e".ToHexBytes(); string json = JT808Serializer.Analyze(bytes); } + + [Fact] + public void Test2011_1() + { + JT808Package jT808_0X0100 = new JT808Package + { + Header = new JT808Header + { + MsgId = Enums.JT808MsgId.终端注册.ToUInt16Value(), + ManualMsgNum = 10, + TerminalPhoneNo = "123456789", + }, + Bodies = new JT808_0x0100 + { + AreaID = 40, + CityOrCountyId = 50, + MakerId = "1234", + PlateColor = 1, + PlateNo = "粤A12345", + TerminalId = "CHI123", + TerminalModel = "tk12345" + } + }; + var hex = JT808Serializer.Serialize(jT808_0X0100, JT808Version.JTT2011).ToHexString(); + Assert.Equal("7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E", hex); + } + + [Fact] + public void Test2011_2() + { + byte[] bytes = "7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E".ToHexBytes(); + JT808Package jT808_0X0100 = JT808Serializer.Deserialize(bytes); + Assert.Equal(JT808MsgId.终端注册.ToUInt16Value(), jT808_0X0100.Header.MsgId); + Assert.Equal(1, jT808_0X0100.Header.ProtocolVersion); + Assert.Equal(10, jT808_0X0100.Header.MsgNum); + Assert.Equal("123456789", jT808_0X0100.Header.TerminalPhoneNo); + + JT808_0x0100 JT808Bodies = (JT808_0x0100)jT808_0X0100.Bodies; + Assert.Equal(40, JT808Bodies.AreaID); + Assert.Equal(50, JT808Bodies.CityOrCountyId); + Assert.Equal("1234", JT808Bodies.MakerId); + Assert.Equal(1, JT808Bodies.PlateColor); + Assert.Equal("粤A12345", JT808Bodies.PlateNo); + Assert.Equal("CHI123", JT808Bodies.TerminalId); + Assert.Equal("tk12345", JT808Bodies.TerminalModel); + } + + [Fact] + public void Test2011_3() + { + byte[] bytes = "7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E".ToHexBytes(); + string json = JT808Serializer.Analyze(bytes); + } } } diff --git a/src/JT808.Protocol.Test/Simples/Demo16.cs b/src/JT808.Protocol.Test/Simples/Demo16.cs new file mode 100644 index 0000000..6087ce5 --- /dev/null +++ b/src/JT808.Protocol.Test/Simples/Demo16.cs @@ -0,0 +1,83 @@ +using JT808.Protocol.Enums; +using JT808.Protocol.Interfaces; +using JT808.Protocol.Internal; +using JT808.Protocol.Extensions; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JT808.Protocol.MessageBody; +using JT808.Protocol.Formatters; +using JT808.Protocol.MessagePack; +using System.Text.Json; +using JT808.Protocol.MessageBody.CarDVR; +using System.Linq; +using JT808.Protocol.Test.JT808LocationAttach; +using static JT808.Protocol.MessageBody.JT808_0x8105; +using System.Buffers.Binary; +using Newtonsoft.Json; + +namespace JT808.Protocol.Test.Simples +{ + public class Demo16 + { + JT808Serializer JT808Serializer; + + public Demo16() + { + IServiceCollection serviceDescriptors = new ServiceCollection(); + serviceDescriptors.AddJT808Configure(); + //通常在startup中使用app的Use进行扩展 + IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); + JT808Serializer = serviceProvider.GetRequiredService().GetSerializer(); + } + + [Fact] + public void Test1() + { + JT808Package jT808_0X0100 = new JT808Package + { + Header = new JT808Header + { + MsgId = Enums.JT808MsgId.终端注册.ToUInt16Value(), + ManualMsgNum = 10, + TerminalPhoneNo = "123456789", + }, + Bodies = new JT808_0x0100 + { + AreaID = 40, + CityOrCountyId = 50, + MakerId = "1234", + PlateColor = 1, + PlateNo = "粤A12345", + TerminalId = "CHI123", + TerminalModel = "tk12345" + } + }; + var hex = JT808Serializer.Serialize(jT808_0X0100, JT808Version.JTT2011).ToHexString(); + Assert.Equal("7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E", hex); + } + + [Fact] + public void Test2() + { + var bytes = "7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E".ToHexBytes(); + JT808Package jT808_0X0100 = JT808Serializer.Deserialize(bytes); + // 采用2011协议 的终端注册消息解析 + Assert.Equal(JT808MsgId.终端注册.ToUInt16Value(), jT808_0X0100.Header.MsgId); + Assert.Equal(1, jT808_0X0100.Header.ProtocolVersion); + Assert.Equal(10, jT808_0X0100.Header.MsgNum); + Assert.Equal("123456789", jT808_0X0100.Header.TerminalPhoneNo); + + JT808_0x0100 JT808Bodies = (JT808_0x0100)jT808_0X0100.Bodies; + Assert.Equal(40, JT808Bodies.AreaID); + Assert.Equal(50, JT808Bodies.CityOrCountyId); + Assert.Equal("1234", JT808Bodies.MakerId); + Assert.Equal(1, JT808Bodies.PlateColor); + Assert.Equal("粤A12345", JT808Bodies.PlateNo); + Assert.Equal("CHI123", JT808Bodies.TerminalId); + Assert.Equal("tk12345", JT808Bodies.TerminalModel); + } + } +} diff --git a/src/JT808.Protocol/Enums/JT808Version.cs b/src/JT808.Protocol/Enums/JT808Version.cs index 77b341b..fe7730c 100644 --- a/src/JT808.Protocol/Enums/JT808Version.cs +++ b/src/JT808.Protocol/Enums/JT808Version.cs @@ -9,10 +9,14 @@ namespace JT808.Protocol.Enums /// public enum JT808Version:byte { + /// + /// 2011 + /// + JTT2011 = 0, /// /// 2013 /// - JTT2013=1, + JTT2013 =1, /// /// 2019 /// diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index ba6685a..754eb13 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -1596,6 +1596,11 @@ JT808版本号 + + + 2011 + + 2013 @@ -8583,6 +8588,7 @@ 终端型号 + 2011版本 8个字节 ,此终端型号由制造商自行定义,位数不足时,后补空格 2013版本 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 2019版本 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0100.cs b/src/JT808.Protocol/MessageBody/JT808_0x0100.cs index 791a452..46e1644 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0100.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0100.cs @@ -47,6 +47,7 @@ namespace JT808.Protocol.MessageBody /// /// 终端型号 + /// 2011版本 8个字节 ,此终端型号由制造商自行定义,位数不足时,后补空格 /// 2013版本 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 /// 2019版本 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 /// @@ -83,17 +84,25 @@ namespace JT808.Protocol.MessageBody JT808_0x0100 jT808_0X0100 = new JT808_0x0100(); jT808_0X0100.AreaID = reader.ReadUInt16(); jT808_0X0100.CityOrCountyId = reader.ReadUInt16(); - if(reader.Version== JT808Version.JTT2019) + if (reader.Version == JT808Version.JTT2019) { jT808_0X0100.MakerId = reader.ReadString(11); jT808_0X0100.TerminalModel = reader.ReadString(30); jT808_0X0100.TerminalId = reader.ReadString(30); } - else + else if (reader.Version == JT808Version.JTT2013) { - jT808_0X0100.MakerId = reader.ReadString(5); - jT808_0X0100.TerminalModel = reader.ReadString(20); - jT808_0X0100.TerminalId = reader.ReadString(7); + if (reader.ReadCurrentRemainContentLength() > 33) + { + jT808_0X0100.MakerId = reader.ReadString(5); + jT808_0X0100.TerminalModel = reader.ReadString(20); + jT808_0X0100.TerminalId = reader.ReadString(7); + } + else { + jT808_0X0100.MakerId = reader.ReadString(5); + jT808_0X0100.TerminalModel = reader.ReadString(8); + jT808_0X0100.TerminalId = reader.ReadString(7); + } } jT808_0X0100.PlateColor = reader.ReadByte(); jT808_0X0100.PlateNo = reader.ReadRemainStringContent(); @@ -111,16 +120,21 @@ namespace JT808.Protocol.MessageBody writer.WriteUInt16(value.CityOrCountyId); if (writer.Version == JT808Version.JTT2019) { - writer.WriteString(value.MakerId.PadRight(11, '\0').ValiString(nameof(value.MakerId),11)); + writer.WriteString(value.MakerId.PadRight(11, '\0').ValiString(nameof(value.MakerId), 11)); writer.WriteString(value.TerminalModel.PadRight(30, '\0').ValiString(nameof(value.TerminalModel), 30)); writer.WriteString(value.TerminalId.PadRight(30, '\0').ValiString(nameof(value.TerminalId), 30)); } - else + else if (writer.Version == JT808Version.JTT2013) { writer.WriteString(value.MakerId.PadRight(5, '\0').ValiString(nameof(value.MakerId), 5)); writer.WriteString(value.TerminalModel.PadRight(20, '\0').ValiString(nameof(value.TerminalModel), 20)); writer.WriteString(value.TerminalId.PadRight(7, '\0').ValiString(nameof(value.TerminalId), 7)); } + else { + writer.WriteString(value.MakerId.PadRight(5, '\0').ValiString(nameof(value.MakerId), 5)); + writer.WriteString(value.TerminalModel.PadRight(8, '\0').ValiString(nameof(value.TerminalModel), 8)); + writer.WriteString(value.TerminalId.PadRight(7, '\0').ValiString(nameof(value.TerminalId), 7)); + } writer.WriteByte(value.PlateColor); writer.WriteString(value.PlateNo); } @@ -149,17 +163,32 @@ namespace JT808.Protocol.MessageBody jT808_0X0100.TerminalId = reader.ReadString(30); writer.WriteString($"[{tidSpan.ToArray().ToHexString()}]终端ID(30)", jT808_0X0100.TerminalId); } - else + else if (reader.Version == JT808Version.JTT2013) { - ReadOnlySpan midSpan = reader.ReadVirtualArray(5); - jT808_0X0100.MakerId = reader.ReadString(5); - writer.WriteString($"[{midSpan.ToArray().ToHexString()}]制造商ID(5)", jT808_0X0100.MakerId); - ReadOnlySpan tmSpan = reader.ReadVirtualArray(20); - jT808_0X0100.TerminalModel = reader.ReadString(20); - writer.WriteString($"[{tmSpan.ToArray().ToHexString()}]终端型号(20)", jT808_0X0100.TerminalModel); - ReadOnlySpan tidSpan = reader.ReadVirtualArray(7); - jT808_0X0100.TerminalId = reader.ReadString(7); - writer.WriteString($"[{tidSpan.ToArray().ToHexString()}]终端ID(7)", jT808_0X0100.TerminalId); + var length = reader.ReadCurrentRemainContentLength(); + if (length > 33) + { + ReadOnlySpan midSpan = reader.ReadVirtualArray(5); + jT808_0X0100.MakerId = reader.ReadString(5); + writer.WriteString($"[{midSpan.ToArray().ToHexString()}]制造商ID(5)", jT808_0X0100.MakerId); + ReadOnlySpan tmSpan = reader.ReadVirtualArray(20); + jT808_0X0100.TerminalModel = reader.ReadString(20); + writer.WriteString($"[{tmSpan.ToArray().ToHexString()}]终端型号(20)", jT808_0X0100.TerminalModel); + ReadOnlySpan tidSpan = reader.ReadVirtualArray(7); + jT808_0X0100.TerminalId = reader.ReadString(7); + writer.WriteString($"[{tidSpan.ToArray().ToHexString()}]终端ID(7)", jT808_0X0100.TerminalId); + } + else { + ReadOnlySpan midSpan = reader.ReadVirtualArray(5); + jT808_0X0100.MakerId = reader.ReadString(5); + writer.WriteString($"[{midSpan.ToArray().ToHexString()}]制造商ID(5)", jT808_0X0100.MakerId); + ReadOnlySpan tmSpan = reader.ReadVirtualArray(8); + jT808_0X0100.TerminalModel = reader.ReadString(8); + writer.WriteString($"[{tmSpan.ToArray().ToHexString()}]终端型号(8)", jT808_0X0100.TerminalModel); + ReadOnlySpan tidSpan = reader.ReadVirtualArray(7); + jT808_0X0100.TerminalId = reader.ReadString(7); + writer.WriteString($"[{tidSpan.ToArray().ToHexString()}]终端ID(7)", jT808_0X0100.TerminalId); + } } jT808_0X0100.PlateColor = reader.ReadByte(); writer.WriteNumber($"[{jT808_0X0100.PlateColor.ReadNumber()}]车牌颜色", jT808_0X0100.PlateColor);