Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

122 Zeilen
5.2 KiB

  1. using JT809.Protocol.Enums;
  2. using JT809.Protocol.Exceptions;
  3. using JT809.Protocol.Extensions;
  4. using JT809.Protocol.Formatters;
  5. using JT809.Protocol.Interfaces;
  6. using JT809.Protocol.MessagePack;
  7. using System.Text.Json;
  8. namespace JT809.Protocol.MessageBody
  9. {
  10. /// <summary>
  11. /// 从链路报警信息交互消息
  12. /// <para>链路类型:从链路</para>
  13. /// <para>消息方向:上级平台往下级平台</para>
  14. /// <para>业务数据类型标识:DOWN_WARN_MSG</para>
  15. /// <para>描述:上级平台向下级平台发送报瞥信息业务</para>
  16. /// </summary>
  17. public class JT809_0x9400: JT809ExchangeMessageBodies, IJT809MessagePackFormatter<JT809_0x9400>, IJT809Analyze, IJT809_2019_Version
  18. {
  19. public override ushort MsgId => JT809BusinessType.从链路报警信息交互消息.ToUInt16Value();
  20. public override string Description => "从链路报警信息交互消息";
  21. public override JT809_LinkType LinkType => JT809_LinkType.subordinate;
  22. public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
  23. {
  24. JT809_0x9400 value = new JT809_0x9400();
  25. if (config.Version == JT809Version.JTT2011)
  26. {
  27. var virtualHex = reader.ReadVirtualArray(21);
  28. value.VehicleNo = reader.ReadString(21);
  29. writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo);
  30. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  31. writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString());
  32. }
  33. value.SubBusinessType = reader.ReadUInt16();
  34. writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString());
  35. value.DataLength = reader.ReadUInt32();
  36. writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength);
  37. try
  38. {
  39. if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
  40. {
  41. if (instance is JT809SubBodies subBodies)
  42. {
  43. if (!subBodies.SkipSerialization)
  44. {
  45. instance.Analyze(ref reader, writer, config);
  46. }
  47. }
  48. }
  49. }
  50. catch
  51. {
  52. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  53. }
  54. }
  55. public JT809_0x9400 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  56. {
  57. JT809_0x9400 value = new JT809_0x9400();
  58. if (config.Version == JT809Version.JTT2011)
  59. {
  60. value.VehicleNo = reader.ReadString(21);
  61. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  62. }
  63. value.SubBusinessType = reader.ReadUInt16();
  64. value.DataLength = reader.ReadUInt32();
  65. try
  66. {
  67. if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
  68. {
  69. if (instance is JT809SubBodies subBodies)
  70. {
  71. if (!subBodies.SkipSerialization)
  72. {
  73. value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(
  74. instance,
  75. ref reader, config);
  76. }
  77. }
  78. }
  79. }
  80. catch
  81. {
  82. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  83. }
  84. return value;
  85. }
  86. public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9400 value, IJT809Config config)
  87. {
  88. if (config.Version == JT809Version.JTT2011)
  89. {
  90. writer.WriteStringPadRight(value.VehicleNo, 21);
  91. writer.WriteByte((byte)value.VehicleColor);
  92. }
  93. writer.WriteUInt16(value.SubBusinessType);
  94. try
  95. {
  96. // 先写入内容,然后在根据内容反写内容长度
  97. writer.Skip(4, out int subContentLengthPosition);
  98. if (value.SubBodies != null)
  99. {
  100. if (!value.SubBodies.SkipSerialization)
  101. {
  102. JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
  103. value.SubBodies,
  104. ref writer, value.SubBodies,
  105. config);
  106. }
  107. }
  108. writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition);
  109. }
  110. catch
  111. {
  112. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  113. }
  114. }
  115. }
  116. }