using JT808.Protocol.Enums; using JT808.Protocol.Interfaces; using JT808.Protocol.MessageBody; using JT808.Protocol.Extensions; using System; using System.Collections.Generic; using System.Reflection; using System.Text; using Xunit; using JT808.Protocol.Formatters; using Microsoft.Extensions.DependencyInjection; using JT808.Protocol.MessagePack; using JT808.Protocol.Internal; namespace JT808.Protocol.Test.Simples { public class Demo6 { public JT808Serializer DT1JT808Serializer; public JT808Serializer DT2JT808Serializer; public class DT1Config : GlobalConfigBase { public override string ConfigId { get; protected set; } = "DT1"; } public class DT2Config : GlobalConfigBase { public override string ConfigId { get; protected set; } = "DT2"; } public Demo6() { IServiceCollection serviceDescriptors = new ServiceCollection(); //1 serviceDescriptors.AddJT808Configure() .AddJT808Configure(); //2 //serviceDescriptors.AddJT808Configure(new DT1Config()) // .AddJT808Configure(new DT2Config()); //注册工厂 serviceDescriptors.AddSingleton(factory => { Func accesor = type => { if (type == "DT1") { return factory.GetRequiredService(); } else if (type == "DT2") { return factory.GetRequiredService(); } else { throw new ArgumentException($"Not Support type : {type}"); } }; return accesor; }); IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); //使用实例的方式获取 IJT808Config DT1JT808Config = serviceProvider.GetRequiredService(); IJT808Config DT2JT808Config = serviceProvider.GetRequiredService(); //这边是因为程序集存在协议冲突的情况,所以不直接采用注册程序集的方式。 //根据不同的设备终端号,添加自定义消息Id DT1JT808Config.MsgIdFactory.SetMap(); DT1JT808Config.FormatterFactory.SetMap(); DT2JT808Config.MsgIdFactory.SetMap(); DT2JT808Config.FormatterFactory.SetMap(); Assert.Equal("DT1", DT1JT808Config.ConfigId); Assert.Equal("DT2", DT2JT808Config.ConfigId); DT1JT808Serializer = DT1JT808Config.GetSerializer(); DT2JT808Serializer = DT2JT808Config.GetSerializer(); Assert.Equal("DT1", DT1JT808Serializer.SerializerId); Assert.Equal("DT2", DT2JT808Serializer.SerializerId); //使用工厂的方式获取 Func factory = serviceProvider.GetRequiredService>(); IJT808Config DT1FactoryJT808Config = factory("DT1"); IJT808Config DT2FactoryJT808Config = factory("DT2"); Assert.Equal("DT1", DT1FactoryJT808Config.ConfigId); Assert.Equal("DT2", DT2FactoryJT808Config.ConfigId); } /// /// 处理多设备多协议消息Id冲突 /// [Fact] public void Test1() { JT808Package dt1Package = new JT808Package(); dt1Package.Header = new JT808Header { MsgId = 0x91, ManualMsgNum = 126, TerminalPhoneNo = "1234567891" }; DT1Demo6 dT1Demo6 = new DT1Demo6(); dT1Demo6.Age1 = 18; dT1Demo6.Sex1 = 2; dt1Package.Bodies = dT1Demo6; JT808Package dt2Package = new JT808Package(); dt2Package.Header = new JT808Header { MsgId = 0x91, ManualMsgNum = 126, TerminalPhoneNo = "1234567892" }; DT2Demo6 dT2Demo6 = new DT2Demo6(); dT2Demo6.Age2 = 18; dT2Demo6.Sex2 = 2; dt2Package.Bodies = dT2Demo6; byte[] dt1Data = DT1JT808Serializer.Serialize(dt1Package); var dt1Hex = dt1Data.ToHexString(); //7E00910003001234567891007D02020012657E byte[] dt2Data = DT2JT808Serializer.Serialize(dt2Package); var dt2Hex = dt2Data.ToHexString(); //7E00910003001234567892007D02020012667E Assert.Equal("7E00910003001234567891007D02020012657E", dt1Hex); Assert.Equal("7E00910003001234567892007D02020012667E", dt2Hex); JT808Package dt1Package1 = DT1JT808Serializer.Deserialize(dt1Data); Assert.Equal(0x91, dt1Package1.Header.MsgId); Assert.Equal(126, dt1Package1.Header.MsgNum); Assert.Equal("1234567891", dt1Package1.Header.TerminalPhoneNo); DT1Demo6 dt1Bodies = (DT1Demo6)dt1Package1.Bodies; Assert.Equal((ushort)18, dt1Bodies.Age1); Assert.Equal(2, dt1Bodies.Sex1); JT808Package dt2Package1 = DT2JT808Serializer.Deserialize(dt2Data); Assert.Equal(0x91, dt2Package1.Header.MsgId); Assert.Equal(126, dt2Package1.Header.MsgNum); Assert.Equal("1234567892", dt2Package1.Header.TerminalPhoneNo); DT2Demo6 dt2Bodies = (DT2Demo6)dt2Package1.Bodies; Assert.Equal((ushort)18, dt2Bodies.Age2); Assert.Equal(2, dt2Bodies.Sex2); } } public class DT1Demo6 : JT808MessagePackFormatter, JT808Bodies { public byte Sex1 { get; set; } public ushort Age1 { get; set; } public ushort MsgId => 0x91; public string Description =>"DT1Demo6"; public bool SkipSerialization => false; public override DT1Demo6 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { DT1Demo6 dT1Demo6 = new DT1Demo6(); dT1Demo6.Sex1 = reader.ReadByte(); dT1Demo6.Age1 = reader.ReadUInt16(); return dT1Demo6; } public override void Serialize(ref JT808MessagePackWriter writer, DT1Demo6 value, IJT808Config config) { writer.WriteByte(value.Sex1); writer.WriteUInt16(value.Age1); } } public class DT2Demo6 : JT808MessagePackFormatter,JT808Bodies { public ushort MsgId => 0x91; public bool SkipSerialization => false; public byte Sex2 { get; set; } public ushort Age2 { get; set; } public string Description => "DT2Demo6"; public override DT2Demo6 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { DT2Demo6 dT2Demo6 = new DT2Demo6(); dT2Demo6.Sex2 = reader.ReadByte(); dT2Demo6.Age2 = reader.ReadUInt16(); return dT2Demo6; } public override void Serialize(ref JT808MessagePackWriter writer, DT2Demo6 value, IJT808Config config) { writer.WriteByte(value.Sex2); writer.WriteUInt16(value.Age2); } } }