Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

117 rader
4.9 KiB

  1. using JT808.Protocol.Extensions;
  2. using JT808.Protocol.Formatters;
  3. using JT808.Protocol.Interfaces;
  4. using JT808.Protocol.MessagePack;
  5. using JT808.Protocol.Metadata;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Text.Json;
  9. namespace JT808.Protocol.MessageBody
  10. {
  11. /// <summary>
  12. /// 事件设置
  13. /// 0x8301
  14. /// 2019版本已作删除
  15. /// </summary>
  16. public class JT808_0x8301 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8301>, IJT808Analyze, IJT808_2019_Version
  17. {
  18. /// <summary>
  19. /// 0x8301
  20. /// </summary>
  21. public override ushort MsgId { get; } = 0x8301;
  22. /// <summary>
  23. /// 事件设置
  24. /// </summary>
  25. public override string Description => "事件设置";
  26. /// <summary>
  27. /// 设置类型
  28. /// <see cref="JT808.Protocol.Enums.JT808EventSettingType"/>
  29. /// </summary>
  30. public byte SettingType { get; set; }
  31. /// <summary>
  32. /// 设置总数
  33. /// </summary>
  34. public byte SettingCount { get; set; }
  35. /// <summary>
  36. /// 事件项
  37. /// </summary>
  38. public List<JT808EventProperty> EventItems { get; set; }
  39. /// <summary>
  40. ///
  41. /// </summary>
  42. /// <param name="reader"></param>
  43. /// <param name="config"></param>
  44. /// <returns></returns>
  45. public JT808_0x8301 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  46. {
  47. JT808_0x8301 jT808_0X8301 = new JT808_0x8301();
  48. jT808_0X8301.SettingType = reader.ReadByte();
  49. jT808_0X8301.SettingCount = reader.ReadByte();
  50. jT808_0X8301.EventItems = new List<JT808EventProperty>();
  51. for (var i = 0; i < jT808_0X8301.SettingCount; i++)
  52. {
  53. JT808EventProperty jT808EventProperty = new JT808EventProperty();
  54. jT808EventProperty.EventId = reader.ReadByte();
  55. jT808EventProperty.EventContentLength = reader.ReadByte();
  56. jT808EventProperty.EventContent = reader.ReadString(jT808EventProperty.EventContentLength);
  57. jT808_0X8301.EventItems.Add(jT808EventProperty);
  58. }
  59. return jT808_0X8301;
  60. }
  61. /// <summary>
  62. ///
  63. /// </summary>
  64. /// <param name="writer"></param>
  65. /// <param name="value"></param>
  66. /// <param name="config"></param>
  67. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8301 value, IJT808Config config)
  68. {
  69. writer.WriteByte(value.SettingType);
  70. if (value.EventItems != null && value.EventItems.Count > 0)
  71. {
  72. writer.WriteByte((byte)value.EventItems.Count);
  73. foreach (var item in value.EventItems)
  74. {
  75. writer.WriteByte(item.EventId);
  76. // 先计算内容长度(汉字为两个字节)
  77. writer.Skip(1, out int eventPosition);
  78. writer.WriteString(item.EventContent);
  79. byte eventLength = (byte)(writer.GetCurrentPosition() - eventPosition - 1);
  80. writer.WriteByteReturn(eventLength, eventPosition);
  81. }
  82. }
  83. }
  84. /// <summary>
  85. ///
  86. /// </summary>
  87. /// <param name="reader"></param>
  88. /// <param name="writer"></param>
  89. /// <param name="config"></param>
  90. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  91. {
  92. JT808_0x8301 value = new JT808_0x8301();
  93. value.SettingType = reader.ReadByte();
  94. writer.WriteNumber($"[{value.SettingType.ReadNumber()}]设置类型", value.SettingType);
  95. value.SettingCount = reader.ReadByte();
  96. writer.WriteNumber($"[{value.SettingCount.ReadNumber()}]设置总数", value.SettingCount);
  97. writer.WriteStartArray("事件项");
  98. for (var i = 0; i < value.SettingCount; i++)
  99. {
  100. writer.WriteStartObject();
  101. JT808EventProperty jT808EventProperty = new JT808EventProperty();
  102. jT808EventProperty.EventId = reader.ReadByte();
  103. writer.WriteNumber($"[{jT808EventProperty.EventId.ReadNumber()}]事件ID ", jT808EventProperty.EventId);
  104. jT808EventProperty.EventContentLength = reader.ReadByte();
  105. writer.WriteNumber($"[{jT808EventProperty.EventContentLength.ReadNumber()}]事件内容长度", jT808EventProperty.EventContentLength);
  106. var eventContenBuffer = reader.ReadVirtualArray(jT808EventProperty.EventContentLength).ToArray();
  107. jT808EventProperty.EventContent = reader.ReadString(jT808EventProperty.EventContentLength);
  108. writer.WriteString($"[{eventContenBuffer.ToHexString()}]事件内容", jT808EventProperty.EventContent);
  109. writer.WriteEndObject();
  110. }
  111. writer.WriteEndArray();
  112. }
  113. }
  114. }