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.

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