@@ -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| | |||
@@ -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); | |||
} | |||
} | |||
} |
@@ -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); | |||
} | |||
} | |||
} |
@@ -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> | |||
@@ -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> | |||
@@ -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); | |||