Browse Source

兼容2011注册

tags/v2.4.2
waterliu99 3 years ago
parent
commit
284858cb43
6 changed files with 200 additions and 18 deletions
  1. +7
    -0
      README.md
  2. +53
    -0
      src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs
  3. +83
    -0
      src/JT808.Protocol.Test/Simples/Demo16.cs
  4. +5
    -1
      src/JT808.Protocol/Enums/JT808Version.cs
  5. +6
    -0
      src/JT808.Protocol/JT808.Protocol.xml
  6. +46
    -17
      src/JT808.Protocol/MessageBody/JT808_0x0100.cs

+ 7
- 0
README.md View File

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


+ 53
- 0
src/JT808.Protocol.Test/MessageBody/JT808_0x0100Test.cs View File

@@ -153,5 +153,58 @@ namespace JT808.Protocol.Test.MessageBody
byte[] bytes = "7e0100405401000000000222222222220001000000003030304b6f696b65303032303030303030303030303030303030303030303030304b6f696b65303032303030303030303030303030303030303030303030304b6f696b6530303202d4c1413132333436107e".ToHexBytes();
string json = JT808Serializer.Analyze<JT808Package>(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<JT808Package>(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<JT808Package>(bytes);
}
}
}

+ 83
- 0
src/JT808.Protocol.Test/Simples/Demo16.cs View File

@@ -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<IJT808Config>().GetSerializer();
}

[Fact]
public void Test1()
{
JT808Package jT808_0X0100 = new JT808Package
{
Header = new JT808Header
{
MsgId = Enums.JT808MsgId.终端注册.ToUInt16Value(),
ManualMsgNum = 10,
TerminalPhoneNo = "123456789",
},
Bodies = new JT808_0x0100
{
AreaID = 40,
CityOrCountyId = 50,
MakerId = "1234",
PlateColor = 1,
PlateNo = "粤A12345",
TerminalId = "CHI123",
TerminalModel = "tk12345"
}
};
var hex = JT808Serializer.Serialize(jT808_0X0100, JT808Version.JTT2011).ToHexString();
Assert.Equal("7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E", hex);
}

[Fact]
public void Test2()
{
var bytes = "7E01000021000123456789000A002800323132333400746B3132333435004348493132330001D4C1413132333435857E".ToHexBytes();
JT808Package jT808_0X0100 = JT808Serializer.Deserialize<JT808Package>(bytes);
// 采用2011协议 的终端注册消息解析
Assert.Equal(JT808MsgId.终端注册.ToUInt16Value(), jT808_0X0100.Header.MsgId);
Assert.Equal(1, jT808_0X0100.Header.ProtocolVersion);
Assert.Equal(10, jT808_0X0100.Header.MsgNum);
Assert.Equal("123456789", jT808_0X0100.Header.TerminalPhoneNo);

JT808_0x0100 JT808Bodies = (JT808_0x0100)jT808_0X0100.Bodies;
Assert.Equal(40, JT808Bodies.AreaID);
Assert.Equal(50, JT808Bodies.CityOrCountyId);
Assert.Equal("1234", JT808Bodies.MakerId);
Assert.Equal(1, JT808Bodies.PlateColor);
Assert.Equal("粤A12345", JT808Bodies.PlateNo);
Assert.Equal("CHI123", JT808Bodies.TerminalId);
Assert.Equal("tk12345", JT808Bodies.TerminalModel);
}
}
}

+ 5
- 1
src/JT808.Protocol/Enums/JT808Version.cs View File

@@ -9,10 +9,14 @@ namespace JT808.Protocol.Enums
/// </summary>
public enum JT808Version:byte
{
/// <summary>
/// 2011
/// </summary>
JTT2011 = 0,
/// <summary>
/// 2013
/// </summary>
JTT2013=1,
JTT2013 =1,
/// <summary>
/// 2019
/// </summary>


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

@@ -1596,6 +1596,11 @@
JT808版本号
</summary>
</member>
<member name="F:JT808.Protocol.Enums.JT808Version.JTT2011">
<summary>
2011
</summary>
</member>
<member name="F:JT808.Protocol.Enums.JT808Version.JTT2013">
<summary>
2013
@@ -8583,6 +8588,7 @@
<member name="P:JT808.Protocol.MessageBody.JT808_0x0100.TerminalModel">
<summary>
终端型号
2011版本 8个字节 ,此终端型号由制造商自行定义,位数不足时,后补空格
2013版本 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。
2019版本 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。
</summary>


+ 46
- 17
src/JT808.Protocol/MessageBody/JT808_0x0100.cs View File

@@ -47,6 +47,7 @@ namespace JT808.Protocol.MessageBody

/// <summary>
/// 终端型号
/// 2011版本 8个字节 ,此终端型号由制造商自行定义,位数不足时,后补空格
/// 2013版本 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。
/// 2019版本 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。
/// </summary>
@@ -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<byte> midSpan = reader.ReadVirtualArray(5);
jT808_0X0100.MakerId = reader.ReadString(5);
writer.WriteString($"[{midSpan.ToArray().ToHexString()}]制造商ID(5)", jT808_0X0100.MakerId);
ReadOnlySpan<byte> tmSpan = reader.ReadVirtualArray(20);
jT808_0X0100.TerminalModel = reader.ReadString(20);
writer.WriteString($"[{tmSpan.ToArray().ToHexString()}]终端型号(20)", jT808_0X0100.TerminalModel);
ReadOnlySpan<byte> 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<byte> midSpan = reader.ReadVirtualArray(5);
jT808_0X0100.MakerId = reader.ReadString(5);
writer.WriteString($"[{midSpan.ToArray().ToHexString()}]制造商ID(5)", jT808_0X0100.MakerId);
ReadOnlySpan<byte> tmSpan = reader.ReadVirtualArray(20);
jT808_0X0100.TerminalModel = reader.ReadString(20);
writer.WriteString($"[{tmSpan.ToArray().ToHexString()}]终端型号(20)", jT808_0X0100.TerminalModel);
ReadOnlySpan<byte> tidSpan = reader.ReadVirtualArray(7);
jT808_0X0100.TerminalId = reader.ReadString(7);
writer.WriteString($"[{tidSpan.ToArray().ToHexString()}]终端ID(7)", jT808_0X0100.TerminalId);
}
else {
ReadOnlySpan<byte> midSpan = reader.ReadVirtualArray(5);
jT808_0X0100.MakerId = reader.ReadString(5);
writer.WriteString($"[{midSpan.ToArray().ToHexString()}]制造商ID(5)", jT808_0X0100.MakerId);
ReadOnlySpan<byte> tmSpan = reader.ReadVirtualArray(8);
jT808_0X0100.TerminalModel = reader.ReadString(8);
writer.WriteString($"[{tmSpan.ToArray().ToHexString()}]终端型号(8)", jT808_0X0100.TerminalModel);
ReadOnlySpan<byte> 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);


Loading…
Cancel
Save