Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

190 рядки
10 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 JT808.Protocol.Metadata;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text.Json;
  10. namespace JT808.Protocol.MessageBody
  11. {
  12. /// <summary>
  13. /// 设置矩形区域
  14. /// 0x8602
  15. /// </summary>
  16. public class JT808_0x8602 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8602>, IJT808Analyze, IJT808_2019_Version
  17. {
  18. public override ushort MsgId { get; } = 0x8602;
  19. public override string Description => "设置矩形区域";
  20. /// <summary>
  21. /// 设置属性
  22. /// <see cref="JT808.Protocol.Enums.JT808SettingProperty"/>
  23. /// </summary>
  24. public byte SettingAreaProperty { get; set; }
  25. /// <summary>
  26. /// 区域总数
  27. /// </summary>
  28. public byte AreaCount { get; set; }
  29. /// <summary>
  30. /// 区域项
  31. /// </summary>
  32. public List<JT808RectangleAreaProperty> AreaItems { get; set; }
  33. public JT808_0x8602 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  34. {
  35. JT808_0x8602 jT808_0X8602 = new JT808_0x8602();
  36. jT808_0X8602.SettingAreaProperty = reader.ReadByte();
  37. jT808_0X8602.AreaCount = reader.ReadByte();
  38. jT808_0X8602.AreaItems = new List<JT808RectangleAreaProperty>();
  39. for (var i = 0; i < jT808_0X8602.AreaCount; i++)
  40. {
  41. JT808RectangleAreaProperty areaProperty = new JT808RectangleAreaProperty();
  42. areaProperty.AreaId = reader.ReadUInt32();
  43. areaProperty.AreaProperty = reader.ReadUInt16();
  44. areaProperty.UpLeftPointLat = reader.ReadUInt32();
  45. areaProperty.UpLeftPointLng = reader.ReadUInt32();
  46. areaProperty.LowRightPointLat = reader.ReadUInt32();
  47. areaProperty.LowRightPointLng = reader.ReadUInt32();
  48. ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(areaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan();
  49. bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
  50. if (!bit0Flag)
  51. {
  52. areaProperty.StartTime = reader.ReadDateTime6();
  53. areaProperty.EndTime = reader.ReadDateTime6();
  54. }
  55. bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
  56. if (!bit1Flag)
  57. {
  58. areaProperty.HighestSpeed = reader.ReadUInt16();
  59. areaProperty.OverspeedDuration = reader.ReadByte();
  60. if (reader.Version == JT808Version.JTT2019)
  61. {
  62. areaProperty.NightMaximumSpeed = reader.ReadUInt16();
  63. }
  64. }
  65. if (reader.Version == JT808Version.JTT2019)
  66. {
  67. areaProperty.NameLength = reader.ReadUInt16();
  68. areaProperty.AreaName = reader.ReadString(areaProperty.NameLength);
  69. }
  70. jT808_0X8602.AreaItems.Add(areaProperty);
  71. }
  72. return jT808_0X8602;
  73. }
  74. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8602 value, IJT808Config config)
  75. {
  76. writer.WriteByte(value.SettingAreaProperty);
  77. if (value.AreaItems != null)
  78. {
  79. writer.WriteByte((byte)value.AreaItems.Count);
  80. foreach (var item in value.AreaItems)
  81. {
  82. writer.WriteUInt32(item.AreaId);
  83. writer.WriteUInt16(item.AreaProperty);
  84. writer.WriteUInt32(item.UpLeftPointLat);
  85. writer.WriteUInt32(item.UpLeftPointLng);
  86. writer.WriteUInt32(item.LowRightPointLat);
  87. writer.WriteUInt32(item.LowRightPointLng);
  88. ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(item.AreaProperty, 2).PadLeft(16, '0').AsSpan();
  89. bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
  90. if (!bit0Flag)
  91. {
  92. if (item.StartTime.HasValue)
  93. {
  94. writer.WriteDateTime6(item.StartTime.Value);
  95. }
  96. if (item.EndTime.HasValue)
  97. {
  98. writer.WriteDateTime6(item.EndTime.Value);
  99. }
  100. }
  101. bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
  102. if (!bit1Flag)
  103. {
  104. if (item.HighestSpeed.HasValue)
  105. {
  106. writer.WriteUInt16(item.HighestSpeed.Value);
  107. }
  108. if (item.OverspeedDuration.HasValue)
  109. {
  110. writer.WriteByte(item.OverspeedDuration.Value);
  111. }
  112. if (writer.Version == JT808Version.JTT2019)
  113. {
  114. writer.WriteUInt16(item.NightMaximumSpeed);
  115. }
  116. }
  117. if (writer.Version == JT808Version.JTT2019)
  118. {
  119. writer.Skip(2, out int AreaNameLengthPosition);
  120. writer.WriteString(item.AreaName);
  121. writer.WriteUInt16Return((ushort)(writer.GetCurrentPosition() - AreaNameLengthPosition - 2), AreaNameLengthPosition);
  122. }
  123. }
  124. }
  125. }
  126. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  127. {
  128. JT808_0x8602 value = new JT808_0x8602();
  129. value.SettingAreaProperty = reader.ReadByte();
  130. writer.WriteNumber($"[{ value.SettingAreaProperty.ReadNumber()}]设置属性", value.SettingAreaProperty);
  131. value.AreaCount = reader.ReadByte();
  132. writer.WriteNumber($"[{ value.AreaCount.ReadNumber()}]区域总数", value.AreaCount);
  133. writer.WriteStartArray("区域项");
  134. for (var i = 0; i < value.AreaCount; i++)
  135. {
  136. writer.WriteStartObject();
  137. JT808RectangleAreaProperty areaProperty = new JT808RectangleAreaProperty();
  138. areaProperty.AreaId = reader.ReadUInt32();
  139. writer.WriteNumber($"[{areaProperty.AreaId.ReadNumber()}]区域ID", areaProperty.AreaId);
  140. areaProperty.AreaProperty = reader.ReadUInt16();
  141. writer.WriteNumber($"[{areaProperty.AreaProperty.ReadNumber()}]区域属性", areaProperty.AreaProperty);
  142. areaProperty.UpLeftPointLat = reader.ReadUInt32();
  143. writer.WriteNumber($"[{areaProperty.UpLeftPointLat.ReadNumber()}]左上点纬度", areaProperty.UpLeftPointLat);
  144. areaProperty.UpLeftPointLng = reader.ReadUInt32();
  145. writer.WriteNumber($"[{areaProperty.UpLeftPointLng.ReadNumber()}]左上点经度", areaProperty.UpLeftPointLng);
  146. areaProperty.LowRightPointLat = reader.ReadUInt32();
  147. writer.WriteNumber($"[{areaProperty.LowRightPointLat.ReadNumber()}]右下点纬度", areaProperty.LowRightPointLat);
  148. areaProperty.LowRightPointLng = reader.ReadUInt32();
  149. writer.WriteNumber($"[{areaProperty.LowRightPointLng.ReadNumber()}]右下点经度", areaProperty.LowRightPointLng);
  150. ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(areaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan();
  151. bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
  152. if (!bit0Flag)
  153. {
  154. areaProperty.StartTime = reader.ReadDateTime6();
  155. writer.WriteString($"[{ areaProperty.StartTime.Value.ToString("yyMMddHHmmss")}]起始时间", areaProperty.StartTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  156. areaProperty.EndTime = reader.ReadDateTime6();
  157. writer.WriteString($"[{ areaProperty.EndTime.Value.ToString("yyMMddHHmmss")}]起始时间", areaProperty.EndTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  158. }
  159. bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
  160. if (!bit1Flag)
  161. {
  162. areaProperty.HighestSpeed = reader.ReadUInt16();
  163. writer.WriteNumber($"[{areaProperty.HighestSpeed.Value.ReadNumber()}]最高速度", areaProperty.HighestSpeed.Value);
  164. areaProperty.OverspeedDuration = reader.ReadByte();
  165. writer.WriteNumber($"[{areaProperty.OverspeedDuration.Value.ReadNumber()}]超速持续时间", areaProperty.OverspeedDuration.Value);
  166. if (reader.Version == JT808Version.JTT2019)
  167. {
  168. areaProperty.NightMaximumSpeed = reader.ReadUInt16();
  169. writer.WriteNumber($"[{areaProperty.NightMaximumSpeed.ReadNumber()}]夜间最高速度", areaProperty.NightMaximumSpeed);
  170. }
  171. }
  172. if (reader.Version == JT808Version.JTT2019)
  173. {
  174. areaProperty.NameLength = reader.ReadUInt16();
  175. writer.WriteNumber($"[{areaProperty.NameLength.ReadNumber()}]夜间最高速度", areaProperty.NameLength);
  176. var areaNameBuffer = reader.ReadVirtualArray(areaProperty.NameLength);
  177. areaProperty.AreaName = reader.ReadString(areaProperty.NameLength);
  178. writer.WriteString($"[{ areaNameBuffer.ToArray().ToHexString()}]区域名称", areaProperty.AreaName);
  179. }
  180. writer.WriteEndObject();
  181. }
  182. writer.WriteEndArray();
  183. }
  184. }
  185. }