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

98 行
3.8 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Extensions;
  3. using JT808.Protocol.Formatters;
  4. using JT808.Protocol.Interfaces;
  5. using JT808.Protocol.MessagePack;
  6. using System.Collections.Generic;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.MessageBody
  9. {
  10. /// <summary>
  11. /// 车辆控制
  12. /// </summary>
  13. public class JT808_0x8500 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8500>, IJT808Analyze, IJT808_2019_Version
  14. {
  15. public override ushort MsgId { get; } = 0x8500;
  16. public override string Description => "车辆控制";
  17. /// <summary>
  18. /// 控制标志
  19. /// 控制指令标志位数据格式
  20. /// 0:车门解锁;1:车门加锁
  21. /// 1-7 保留
  22. /// </summary>
  23. public byte ControlFlag { get; set; }
  24. /// <summary>
  25. /// 控制类型数量
  26. /// </summary>
  27. public ushort ControlTypeCount { get; set; }
  28. /// <summary>
  29. /// 用于反序列化的时候,由于厂家自定义类型比较多,所以直接用byte数组存储
  30. /// </summary>
  31. public byte[] ControlTypeBuffer { get; set; }
  32. /// <summary>
  33. /// 用于序列化的时候,由于厂家自定义类型比较多,所以直接用JT808_0x8500_ControlType
  34. /// </summary>
  35. public List<JT808_0x8500_ControlType> ControlTypes { get; set; }
  36. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  37. {
  38. JT808_0x8500 value = new JT808_0x8500();
  39. if (reader.Version == JT808Version.JTT2019)
  40. {
  41. value.ControlTypeCount = reader.ReadUInt16();
  42. writer.WriteNumber($"[{ value.ControlTypeCount.ReadNumber()}]控制类型数量", value.ControlTypeCount);
  43. //todo:待完善
  44. value.ControlTypeBuffer = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
  45. writer.WriteString($"控制类型", value.ControlTypeBuffer.ToHexString());
  46. }
  47. else
  48. {
  49. value.ControlFlag = reader.ReadByte();
  50. writer.WriteNumber($"[{ value.ControlFlag.ReadNumber()}]控制标志", value.ControlFlag);
  51. }
  52. }
  53. public JT808_0x8500 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  54. {
  55. JT808_0x8500 value = new JT808_0x8500();
  56. if(reader.Version== JT808Version.JTT2019)
  57. {
  58. value.ControlTypeCount = reader.ReadUInt16();
  59. value.ControlTypeBuffer = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
  60. }
  61. else
  62. {
  63. value.ControlFlag = reader.ReadByte();
  64. }
  65. return value;
  66. }
  67. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8500 value, IJT808Config config)
  68. {
  69. if (writer.Version == JT808Version.JTT2019)
  70. {
  71. if(value.ControlTypes!=null && value.ControlTypes.Count > 0)
  72. {
  73. writer.WriteUInt16((ushort)value.ControlTypes.Count);
  74. foreach (var item in value.ControlTypes)
  75. {
  76. JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
  77. }
  78. }
  79. else
  80. {
  81. writer.WriteUInt16(value.ControlTypeCount);
  82. if(value.ControlTypeBuffer!=null && value.ControlTypeBuffer.Length > 0)
  83. {
  84. writer.WriteArray(value.ControlTypeBuffer);
  85. }
  86. }
  87. }
  88. else
  89. {
  90. writer.WriteByte(value.ControlFlag);
  91. }
  92. }
  93. }
  94. }