No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

115 líneas
5.0 KiB

  1. using JT809.Protocol.Enums;
  2. using JT809.Protocol.Exceptions;
  3. using JT809.Protocol.Extensions.JT1078.Enums;
  4. using JT809.Protocol.Formatters;
  5. using JT809.Protocol.Interfaces;
  6. using JT809.Protocol.MessagePack;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using System.Text.Json;
  11. namespace JT809.Protocol.Extensions.JT1078.MessageBody
  12. {
  13. /// <summary>
  14. /// 主链路时效口令交互消息
  15. /// </summary>
  16. public class JT809_JT1078_0x1700 : JT809ExchangeMessageBodies,IJT809MessagePackFormatter<JT809_JT1078_0x1700>, IJT809Analyze
  17. {
  18. public override ushort MsgId { get; }=JT809_JT1078_BusinessType.主链路时效口令业务类.ToUInt16Value();
  19. public override JT809_LinkType LinkType { get; } = JT809_LinkType.main;
  20. public override string Description { get; }= "主链路时效口令交互消息";
  21. public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
  22. {
  23. JT809_JT1078_0x1700 value = new JT809_JT1078_0x1700();
  24. var virtualHex = reader.ReadVirtualArray(21);
  25. value.VehicleNo = reader.ReadString(21);
  26. writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车牌号", value.VehicleNo);
  27. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  28. writer.WriteString($"[{((byte)value.VehicleColor).ReadNumber()}]车牌颜色", value.VehicleColor.ToString());
  29. value.SubBusinessType = reader.ReadUInt16();
  30. writer.WriteString($"[{value.SubBusinessType.ReadNumber()}]子业务类型标识", ((JT809SubBusinessType)value.SubBusinessType).ToString());
  31. value.DataLength = reader.ReadUInt32();
  32. writer.WriteNumber($"[{value.DataLength.ReadNumber()}]后续数据长度", value.DataLength);
  33. try
  34. {
  35. if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
  36. {
  37. if (instance is JT809SubBodies subBodies)
  38. {
  39. if (!subBodies.SkipSerialization)
  40. {
  41. writer.WriteStartObject("子业务类型");
  42. instance.Analyze(ref reader, writer, config);
  43. writer.WriteEndObject();
  44. }
  45. }
  46. }
  47. }
  48. catch
  49. {
  50. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  51. }
  52. }
  53. public JT809_JT1078_0x1700 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  54. {
  55. JT809_JT1078_0x1700 value = new JT809_JT1078_0x1700();
  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_JT1078_0x1700 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. }