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

114 行
4.9 KiB

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