選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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