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.

110 lines
4.7 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>业务数据类型标识:UP_PLATFORM_MSG</para>
  16. /// <para>描述:下级平台向上级平台发送平台间交互信息</para>
  17. /// </summary>
  18. public class JT809_0x1300: JT809ExchangeMessageBodies, IJT809MessagePackFormatter<JT809_0x1300>, IJT809Analyze
  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_0x1300 value = new JT809_0x1300();
  26. value.SubBusinessType = reader.ReadUInt16();
  27. writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString());
  28. value.DataLength = reader.ReadUInt32();
  29. writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength);
  30. try
  31. {
  32. if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
  33. {
  34. if (instance is JT809SubBodies subBodies)
  35. {
  36. if (!subBodies.SkipSerialization)
  37. {
  38. writer.WriteStartObject("子业务类型");
  39. instance.Analyze(ref reader, writer, config);
  40. writer.WriteEndObject();
  41. }
  42. }
  43. }
  44. }
  45. catch
  46. {
  47. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  48. }
  49. }
  50. public JT809_0x1300 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  51. {
  52. JT809_0x1300 value = new JT809_0x1300();
  53. //value.VehicleNo = reader.ReadString(21);
  54. //value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  55. value.SubBusinessType = reader.ReadUInt16();
  56. value.DataLength = reader.ReadUInt32();
  57. try
  58. {
  59. if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
  60. {
  61. if (instance is JT809SubBodies subBodies)
  62. {
  63. if (!subBodies.SkipSerialization)
  64. {
  65. value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(
  66. instance,
  67. ref reader, config);
  68. }
  69. }
  70. }
  71. }
  72. catch
  73. {
  74. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  75. }
  76. return value;
  77. }
  78. public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1300 value, IJT809Config config)
  79. {
  80. //writer.WriteStringPadRight(value.VehicleNo, 21);
  81. //writer.WriteByte((byte)value.VehicleColor);
  82. writer.WriteUInt16(value.SubBusinessType);
  83. try
  84. {
  85. // 先写入内容,然后在根据内容反写内容长度
  86. writer.Skip(4, out int subContentLengthPosition);
  87. if (value.SubBodies != null)
  88. {
  89. if (!value.SubBodies.SkipSerialization)
  90. {
  91. JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
  92. value.SubBodies,
  93. ref writer, value.SubBodies,
  94. config);
  95. }
  96. }
  97. writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition);
  98. }
  99. catch (Exception ex)
  100. {
  101. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}", ex);
  102. }
  103. }
  104. }
  105. }