25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

77 satır
3.2 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.MessagePack;
  6. namespace JT809.Protocol.Extensions.JT1078.MessageBody
  7. {
  8. /// <summary>
  9. /// 从链路远程录像检索交互消息
  10. /// </summary>
  11. public class JT809_JT1078_0x9900 : JT809ExchangeMessageBodies, IJT809MessagePackFormatter<JT809_JT1078_0x9900>
  12. {
  13. public override ushort MsgId { get; } = JT809_JT1078_BusinessType.从链路远程录像检索业务类.ToUInt16Value();
  14. public override JT809_LinkType LinkType { get; } = JT809_LinkType.subordinate;
  15. public override string Description { get; } = "从链路远程录像检索交互消息";
  16. public JT809_JT1078_0x9900 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  17. {
  18. JT809_JT1078_0x9900 value = new JT809_JT1078_0x9900();
  19. value.VehicleNo = reader.ReadString(21);
  20. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  21. value.SubBusinessType = reader.ReadUInt16();
  22. value.DataLength = reader.ReadUInt32();
  23. try
  24. {
  25. if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
  26. {
  27. if (instance is JT809SubBodies subBodies)
  28. {
  29. if (!subBodies.SkipSerialization)
  30. {
  31. value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(
  32. instance,
  33. ref reader, config);
  34. }
  35. }
  36. }
  37. }
  38. catch
  39. {
  40. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  41. }
  42. return value;
  43. }
  44. public void Serialize(ref JT809MessagePackWriter writer, JT809_JT1078_0x9900 value, IJT809Config config)
  45. {
  46. writer.WriteStringPadRight(value.VehicleNo, 21);
  47. writer.WriteByte((byte)value.VehicleColor);
  48. writer.WriteUInt16(value.SubBusinessType);
  49. try
  50. {
  51. // 先写入内容,然后在根据内容反写内容长度
  52. writer.Skip(4, out int subContentLengthPosition);
  53. if (value.SubBodies != null)
  54. {
  55. if (!value.SubBodies.SkipSerialization)
  56. {
  57. JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
  58. value.SubBodies,
  59. ref writer, value.SubBodies,
  60. config);
  61. }
  62. }
  63. writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition);
  64. }
  65. catch
  66. {
  67. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  68. }
  69. }
  70. }
  71. }