您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

167 行
6.4 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.Internal;
  4. using JT808.Protocol.Extensions;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Text;
  9. using Xunit;
  10. using JT808.Protocol.MessageBody;
  11. using JT808.Protocol.Formatters;
  12. using JT808.Protocol.MessagePack;
  13. using System.Text.Json;
  14. using JT808.Protocol.MessageBody.CarDVR;
  15. using System.Linq;
  16. using JT808.Protocol.Test.JT808LocationAttach;
  17. using static JT808.Protocol.MessageBody.JT808_0x8105;
  18. using System.Buffers.Binary;
  19. using Newtonsoft.Json;
  20. namespace JT808.Protocol.Test.Simples
  21. {
  22. public class Demo13
  23. {
  24. JT808Serializer JT808Serializer;
  25. public Demo13()
  26. {
  27. IServiceCollection serviceDescriptors = new ServiceCollection();
  28. serviceDescriptors.AddJT808Configure(new DefaultGlobalConfig("replace"));
  29. //通常在startup中使用app的Use进行扩展
  30. //The Use of the app is typically extended in startup
  31. IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
  32. Use(serviceProvider);
  33. }
  34. void Use(IServiceProvider serviceProvider)
  35. {
  36. IJT808Config jT808Config = serviceProvider.GetRequiredService<DefaultGlobalConfig>();
  37. //替换原有消息存在的BUG
  38. //Replace the bugs in the original message
  39. jT808Config.ReplaceMsgId<JT808_0x0001, JT808_0x0001_Replace>();
  40. JT808Serializer = jT808Config.GetSerializer();
  41. }
  42. [Fact]
  43. public void Test1()
  44. {
  45. JT808Package jT808Package = new JT808Package
  46. {
  47. Header = new JT808Header
  48. {
  49. MsgId = Enums.JT808MsgId._0x0001.ToUInt16Value(),
  50. ManualMsgNum = 1203,
  51. TerminalPhoneNo = "012345678900",
  52. },
  53. Bodies = new JT808_0x0001_Replace
  54. {
  55. ReplyMsgId = Enums.JT808MsgId._0x0002.ToUInt16Value(),
  56. ReplyMsgNum = 1000,
  57. TerminalResult = Enums.JT808TerminalResult.Success,
  58. Test=168
  59. }
  60. };
  61. var hex = JT808Serializer.Serialize(jT808Package).ToHexString();
  62. Assert.Equal("7E0001000701234567890004B303E800020000A8797E", hex);
  63. }
  64. [Fact]
  65. public void Test2()
  66. {
  67. var bytes = "7E0001000701234567890004B303E800020000A8797E".ToHexBytes();
  68. JT808Package jT808Package = JT808Serializer.Deserialize<JT808Package>(bytes);
  69. Assert.Equal(Enums.JT808MsgId._0x0001.ToValue(), jT808Package.Header.MsgId);
  70. Assert.Equal(1203, jT808Package.Header.MsgNum);
  71. JT808_0x0001_Replace JT808Bodies = (JT808_0x0001_Replace)jT808Package.Bodies;
  72. Assert.Equal(Enums.JT808MsgId._0x0002.ToUInt16Value(), JT808Bodies.ReplyMsgId);
  73. Assert.Equal(1000, JT808Bodies.ReplyMsgNum);
  74. Assert.Equal(Enums.JT808TerminalResult.Success, JT808Bodies.TerminalResult);
  75. Assert.Equal(168u, JT808Bodies.Test);
  76. }
  77. }
  78. /// <summary>
  79. /// 终端通用应答_替换原有的消息,来解决库现有的bug
  80. /// The terminal general answer _ replaces the original message to solve the existing library bug
  81. /// </summary>
  82. public class JT808_0x0001_Replace : JT808MessagePackFormatter<JT808_0x0001_Replace>, JT808Bodies, IJT808Analyze
  83. {
  84. /// <summary>
  85. /// 0x0001
  86. /// </summary>
  87. public ushort MsgId => 0x0001;
  88. public bool SkipSerialization => false;
  89. /// <summary>
  90. /// 终端通用应答
  91. /// </summary>
  92. public string Description => "终端通用应答";
  93. /// <summary>
  94. /// 应答流水号
  95. /// 对应的平台消息的流水号
  96. /// </summary>
  97. public ushort ReplyMsgNum { get; set; }
  98. /// <summary>
  99. /// 应答 ID
  100. /// 对应的平台消息的 ID
  101. /// <see cref="JT808.Protocol.Enums.JT808MsgId"/>
  102. /// </summary>
  103. public ushort ReplyMsgId { get; set; }
  104. /// <summary>
  105. /// 结果
  106. /// 0:成功/确认;1:失败;2:消息有误;3:不支持
  107. /// </summary>
  108. public JT808TerminalResult TerminalResult { get; set; }
  109. /// <summary>
  110. /// 测试
  111. /// </summary>
  112. public ushort Test { get; set; }
  113. /// <summary>
  114. ///
  115. /// </summary>
  116. /// <param name="reader"></param>
  117. /// <param name="config"></param>
  118. /// <returns></returns>
  119. public override JT808_0x0001_Replace Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  120. {
  121. JT808_0x0001_Replace jT808_0X0001 = new JT808_0x0001_Replace();
  122. jT808_0X0001.ReplyMsgNum = reader.ReadUInt16();
  123. jT808_0X0001.ReplyMsgId = reader.ReadUInt16();
  124. jT808_0X0001.TerminalResult = (JT808TerminalResult)reader.ReadByte();
  125. jT808_0X0001.Test = reader.ReadUInt16();
  126. return jT808_0X0001;
  127. }
  128. /// <summary>
  129. ///
  130. /// </summary>
  131. /// <param name="writer"></param>
  132. /// <param name="value"></param>
  133. /// <param name="config"></param>
  134. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x0001_Replace value, IJT808Config config)
  135. {
  136. writer.WriteUInt16(value.ReplyMsgNum);
  137. writer.WriteUInt16(value.ReplyMsgId);
  138. writer.WriteByte((byte)value.TerminalResult);
  139. writer.WriteUInt16(value.Test);
  140. }
  141. /// <summary>
  142. ///
  143. /// </summary>
  144. /// <param name="reader"></param>
  145. /// <param name="writer"></param>
  146. /// <param name="config"></param>
  147. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  148. {
  149. var replyMsgNum = reader.ReadUInt16();
  150. var replyMsgId = reader.ReadUInt16();
  151. var terminalResult = reader.ReadByte();
  152. var test = reader.ReadUInt16();
  153. writer.WriteNumber($"[{replyMsgNum.ReadNumber()}]应答流水号", replyMsgNum);
  154. writer.WriteNumber($"[{replyMsgId.ReadNumber()}]应答消息Id", replyMsgId);
  155. writer.WriteString($"[{terminalResult.ReadNumber()}]结果", ((JT808TerminalResult)terminalResult).ToString());
  156. writer.WriteNumber($"[{test.ReadNumber()}]测试", test);
  157. }
  158. }
  159. }