You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 regels
7.3 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.MessageBody;
  4. using JT808.Protocol.Extensions;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Reflection;
  8. using System.Text;
  9. using Xunit;
  10. using JT808.Protocol.Formatters;
  11. using Microsoft.Extensions.DependencyInjection;
  12. using JT808.Protocol.MessagePack;
  13. using JT808.Protocol.Internal;
  14. namespace JT808.Protocol.Test.Simples
  15. {
  16. public class Demo6
  17. {
  18. public JT808Serializer DT1JT808Serializer;
  19. public JT808Serializer DT2JT808Serializer;
  20. public class DT1Config : GlobalConfigBase
  21. {
  22. public override string ConfigId { get; protected set; } = "DT1";
  23. }
  24. public class DT2Config : GlobalConfigBase
  25. {
  26. public override string ConfigId { get; protected set; } = "DT2";
  27. }
  28. public Demo6()
  29. {
  30. IServiceCollection serviceDescriptors = new ServiceCollection();
  31. //1
  32. serviceDescriptors.AddJT808Configure<DT1Config>()
  33. .AddJT808Configure<DT2Config>();
  34. //2
  35. //serviceDescriptors.AddJT808Configure(new DT1Config())
  36. // .AddJT808Configure(new DT2Config());
  37. //注册工厂
  38. serviceDescriptors.AddSingleton(factory =>
  39. {
  40. Func<string, IJT808Config> accesor = type =>
  41. {
  42. if (type == "DT1")
  43. {
  44. return factory.GetRequiredService<DT1Config>();
  45. }
  46. else if (type == "DT2")
  47. {
  48. return factory.GetRequiredService<DT2Config>();
  49. }
  50. else
  51. {
  52. throw new ArgumentException($"Not Support type : {type}");
  53. }
  54. };
  55. return accesor;
  56. });
  57. IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
  58. //使用实例的方式获取
  59. IJT808Config DT1JT808Config = serviceProvider.GetRequiredService<DT1Config>();
  60. IJT808Config DT2JT808Config = serviceProvider.GetRequiredService<DT2Config>();
  61. //这边是因为程序集存在协议冲突的情况,所以不直接采用注册程序集的方式。
  62. //根据不同的设备终端号,添加自定义消息Id
  63. DT1JT808Config.MsgIdFactory.SetMap<DT1Demo6>();
  64. DT1JT808Config.FormatterFactory.SetMap<DT1Demo6>();
  65. DT2JT808Config.MsgIdFactory.SetMap<DT2Demo6>();
  66. DT2JT808Config.FormatterFactory.SetMap<DT2Demo6>();
  67. Assert.Equal("DT1", DT1JT808Config.ConfigId);
  68. Assert.Equal("DT2", DT2JT808Config.ConfigId);
  69. DT1JT808Serializer = DT1JT808Config.GetSerializer();
  70. DT2JT808Serializer = DT2JT808Config.GetSerializer();
  71. Assert.Equal("DT1", DT1JT808Serializer.SerializerId);
  72. Assert.Equal("DT2", DT2JT808Serializer.SerializerId);
  73. //使用工厂的方式获取
  74. Func<string, IJT808Config> factory = serviceProvider.GetRequiredService<Func<string, IJT808Config>>();
  75. IJT808Config DT1FactoryJT808Config = factory("DT1");
  76. IJT808Config DT2FactoryJT808Config = factory("DT2");
  77. Assert.Equal("DT1", DT1FactoryJT808Config.ConfigId);
  78. Assert.Equal("DT2", DT2FactoryJT808Config.ConfigId);
  79. }
  80. /// <summary>
  81. /// 处理多设备多协议消息Id冲突
  82. /// </summary>
  83. [Fact]
  84. public void Test1()
  85. {
  86. JT808Package dt1Package = new JT808Package();
  87. dt1Package.Header = new JT808Header
  88. {
  89. MsgId = 0x91,
  90. ManualMsgNum = 126,
  91. TerminalPhoneNo = "1234567891"
  92. };
  93. DT1Demo6 dT1Demo6 = new DT1Demo6();
  94. dT1Demo6.Age1 = 18;
  95. dT1Demo6.Sex1 = 2;
  96. dt1Package.Bodies = dT1Demo6;
  97. JT808Package dt2Package = new JT808Package();
  98. dt2Package.Header = new JT808Header
  99. {
  100. MsgId = 0x91,
  101. ManualMsgNum = 126,
  102. TerminalPhoneNo = "1234567892"
  103. };
  104. DT2Demo6 dT2Demo6 = new DT2Demo6();
  105. dT2Demo6.Age2 = 18;
  106. dT2Demo6.Sex2 = 2;
  107. dt2Package.Bodies = dT2Demo6;
  108. byte[] dt1Data = DT1JT808Serializer.Serialize(dt1Package);
  109. var dt1Hex = dt1Data.ToHexString();
  110. //7E00910003001234567891007D02020012657E
  111. byte[] dt2Data = DT2JT808Serializer.Serialize(dt2Package);
  112. var dt2Hex = dt2Data.ToHexString();
  113. //7E00910003001234567892007D02020012667E
  114. Assert.Equal("7E00910003001234567891007D02020012657E", dt1Hex);
  115. Assert.Equal("7E00910003001234567892007D02020012667E", dt2Hex);
  116. JT808Package dt1Package1 = DT1JT808Serializer.Deserialize(dt1Data);
  117. Assert.Equal(0x91, dt1Package1.Header.MsgId);
  118. Assert.Equal(126, dt1Package1.Header.MsgNum);
  119. Assert.Equal("1234567891", dt1Package1.Header.TerminalPhoneNo);
  120. DT1Demo6 dt1Bodies = (DT1Demo6)dt1Package1.Bodies;
  121. Assert.Equal((ushort)18, dt1Bodies.Age1);
  122. Assert.Equal(2, dt1Bodies.Sex1);
  123. JT808Package dt2Package1 = DT2JT808Serializer.Deserialize(dt2Data);
  124. Assert.Equal(0x91, dt2Package1.Header.MsgId);
  125. Assert.Equal(126, dt2Package1.Header.MsgNum);
  126. Assert.Equal("1234567892", dt2Package1.Header.TerminalPhoneNo);
  127. DT2Demo6 dt2Bodies = (DT2Demo6)dt2Package1.Bodies;
  128. Assert.Equal((ushort)18, dt2Bodies.Age2);
  129. Assert.Equal(2, dt2Bodies.Sex2);
  130. }
  131. }
  132. public class DT1Demo6 : JT808MessagePackFormatter<DT1Demo6>, JT808Bodies
  133. {
  134. public byte Sex1 { get; set; }
  135. public ushort Age1 { get; set; }
  136. public ushort MsgId => 0x91;
  137. public string Description =>"DT1Demo6";
  138. public bool SkipSerialization => false;
  139. public override DT1Demo6 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  140. {
  141. DT1Demo6 dT1Demo6 = new DT1Demo6();
  142. dT1Demo6.Sex1 = reader.ReadByte();
  143. dT1Demo6.Age1 = reader.ReadUInt16();
  144. return dT1Demo6;
  145. }
  146. public override void Serialize(ref JT808MessagePackWriter writer, DT1Demo6 value, IJT808Config config)
  147. {
  148. writer.WriteByte(value.Sex1);
  149. writer.WriteUInt16(value.Age1);
  150. }
  151. }
  152. public class DT2Demo6 : JT808MessagePackFormatter<DT2Demo6>,JT808Bodies
  153. {
  154. public ushort MsgId => 0x91;
  155. public bool SkipSerialization => false;
  156. public byte Sex2 { get; set; }
  157. public ushort Age2 { get; set; }
  158. public string Description => "DT2Demo6";
  159. public override DT2Demo6 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  160. {
  161. DT2Demo6 dT2Demo6 = new DT2Demo6();
  162. dT2Demo6.Sex2 = reader.ReadByte();
  163. dT2Demo6.Age2 = reader.ReadUInt16();
  164. return dT2Demo6;
  165. }
  166. public override void Serialize(ref JT808MessagePackWriter writer, DT2Demo6 value, IJT808Config config)
  167. {
  168. writer.WriteByte(value.Sex2);
  169. writer.WriteUInt16(value.Age2);
  170. }
  171. }
  172. }