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 Demo13 { JT808Serializer JT808Serializer; public Demo13() { IServiceCollection serviceDescriptors = new ServiceCollection(); serviceDescriptors.AddJT808Configure(new DefaultGlobalConfig("replace")); //通常在startup中使用app的Use进行扩展 //The Use of the app is typically extended in startup IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); Use(serviceProvider); } void Use(IServiceProvider serviceProvider) { IJT808Config jT808Config = serviceProvider.GetRequiredService(); //替换原有消息存在的BUG //Replace the bugs in the original message jT808Config.ReplaceMsgId(); JT808Serializer = jT808Config.GetSerializer(); } [Fact] public void Test1() { JT808Package jT808Package = new JT808Package { Header = new JT808Header { MsgId = Enums.JT808MsgId._0x0001.ToUInt16Value(), ManualMsgNum = 1203, TerminalPhoneNo = "012345678900", }, Bodies = new JT808_0x0001_Replace { ReplyMsgId = Enums.JT808MsgId._0x0002.ToUInt16Value(), ReplyMsgNum = 1000, TerminalResult = Enums.JT808TerminalResult.Success, Test=168 } }; var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); Assert.Equal("7E0001000701234567890004B303E800020000A8797E", hex); } [Fact] public void Test2() { var bytes = "7E0001000701234567890004B303E800020000A8797E".ToHexBytes(); JT808Package jT808Package = JT808Serializer.Deserialize(bytes); Assert.Equal(Enums.JT808MsgId._0x0001.ToValue(), jT808Package.Header.MsgId); Assert.Equal(1203, jT808Package.Header.MsgNum); JT808_0x0001_Replace JT808Bodies = (JT808_0x0001_Replace)jT808Package.Bodies; Assert.Equal(Enums.JT808MsgId._0x0002.ToUInt16Value(), JT808Bodies.ReplyMsgId); Assert.Equal(1000, JT808Bodies.ReplyMsgNum); Assert.Equal(Enums.JT808TerminalResult.Success, JT808Bodies.TerminalResult); Assert.Equal(168u, JT808Bodies.Test); } } /// /// 终端通用应答_替换原有的消息,来解决库现有的bug /// The terminal general answer _ replaces the original message to solve the existing library bug /// public class JT808_0x0001_Replace : JT808MessagePackFormatter, JT808Bodies, IJT808Analyze { /// /// 0x0001 /// public ushort MsgId => 0x0001; public bool SkipSerialization => false; /// /// 终端通用应答 /// public string Description => "终端通用应答"; /// /// 应答流水号 /// 对应的平台消息的流水号 /// public ushort ReplyMsgNum { get; set; } /// /// 应答 ID /// 对应的平台消息的 ID /// /// public ushort ReplyMsgId { get; set; } /// /// 结果 /// 0:成功/确认;1:失败;2:消息有误;3:不支持 /// public JT808TerminalResult TerminalResult { get; set; } /// /// 测试 /// public ushort Test { get; set; } /// /// /// /// /// /// public override JT808_0x0001_Replace Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0001_Replace jT808_0X0001 = new JT808_0x0001_Replace(); jT808_0X0001.ReplyMsgNum = reader.ReadUInt16(); jT808_0X0001.ReplyMsgId = reader.ReadUInt16(); jT808_0X0001.TerminalResult = (JT808TerminalResult)reader.ReadByte(); jT808_0X0001.Test = reader.ReadUInt16(); return jT808_0X0001; } /// /// /// /// /// /// public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x0001_Replace value, IJT808Config config) { writer.WriteUInt16(value.ReplyMsgNum); writer.WriteUInt16(value.ReplyMsgId); writer.WriteByte((byte)value.TerminalResult); writer.WriteUInt16(value.Test); } /// /// /// /// /// /// public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { var replyMsgNum = reader.ReadUInt16(); var replyMsgId = reader.ReadUInt16(); var terminalResult = reader.ReadByte(); var test = reader.ReadUInt16(); writer.WriteNumber($"[{replyMsgNum.ReadNumber()}]应答流水号", replyMsgNum); writer.WriteNumber($"[{replyMsgId.ReadNumber()}]应答消息Id", replyMsgId); writer.WriteString($"[{terminalResult.ReadNumber()}]结果", ((JT808TerminalResult)terminalResult).ToString()); writer.WriteNumber($"[{test.ReadNumber()}]测试", test); } } }