Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

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