Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

222 řádky
14 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.Linq;
  10. using System.Text.Json;
  11. namespace JT808.Protocol.MessageBody
  12. {
  13. /// <summary>
  14. /// 设置圆形区域
  15. /// 0x8600
  16. /// 注:本条消息协议支持周期时间范围,如要限制每天的8:30-18:00,起始/结束时间设为:00-00-00-08-30-00/00-00-00-18-00-00,其他以此类推
  17. /// </summary>
  18. public class JT808_0x8600 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8600>, IJT808Analyze, IJT808_2019_Version
  19. {
  20. public override ushort MsgId { get; } = 0x8600;
  21. public override string Description => "设置圆形区域";
  22. /// <summary>
  23. /// 设置属性
  24. /// <see cref="JT808.Protocol.Enums.JT808SettingProperty"/>
  25. /// </summary>
  26. public byte SettingAreaProperty { get; set; }
  27. /// <summary>
  28. /// 区域总数
  29. /// </summary>
  30. public byte AreaCount { get; set; }
  31. /// <summary>
  32. /// 区域项
  33. /// </summary>
  34. public List<JT808CircleAreaProperty> AreaItems { get; set; }
  35. public JT808_0x8600 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  36. {
  37. JT808_0x8600 jT808_0X8600 = new JT808_0x8600();
  38. jT808_0X8600.SettingAreaProperty = reader.ReadByte();
  39. jT808_0X8600.AreaCount = reader.ReadByte();
  40. jT808_0X8600.AreaItems = new List<JT808CircleAreaProperty>();
  41. for (var i = 0; i < jT808_0X8600.AreaCount; i++)
  42. {
  43. JT808CircleAreaProperty jT808CircleAreaProperty = new JT808CircleAreaProperty();
  44. jT808CircleAreaProperty.AreaId = reader.ReadUInt32();
  45. jT808CircleAreaProperty.AreaProperty = reader.ReadUInt16();
  46. jT808CircleAreaProperty.CenterPointLat = reader.ReadUInt32();
  47. jT808CircleAreaProperty.CenterPointLng = reader.ReadUInt32();
  48. jT808CircleAreaProperty.Radius = reader.ReadUInt32();
  49. ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(jT808CircleAreaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan();
  50. bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
  51. if (!bit0Flag)
  52. {
  53. jT808CircleAreaProperty.StartTime = reader.ReadDateTime6();
  54. jT808CircleAreaProperty.EndTime = reader.ReadDateTime6();
  55. }
  56. bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
  57. if (!bit1Flag)
  58. {
  59. jT808CircleAreaProperty.HighestSpeed = reader.ReadUInt16();
  60. jT808CircleAreaProperty.OverspeedDuration = reader.ReadByte();
  61. if (reader.Version == JT808Version.JTT2019)
  62. {
  63. jT808CircleAreaProperty.NightMaximumSpeed = reader.ReadUInt16();
  64. }
  65. }
  66. if(reader.Version== JT808Version.JTT2019)
  67. {
  68. jT808CircleAreaProperty.NameLength = reader.ReadUInt16();
  69. jT808CircleAreaProperty.AreaName = reader.ReadString(jT808CircleAreaProperty.NameLength);
  70. }
  71. jT808_0X8600.AreaItems.Add(jT808CircleAreaProperty);
  72. }
  73. return jT808_0X8600;
  74. }
  75. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8600 value, IJT808Config config)
  76. {
  77. writer.WriteByte(value.SettingAreaProperty);
  78. if (value.AreaItems != null)
  79. {
  80. writer.WriteByte((byte)value.AreaItems.Count);
  81. foreach (var item in value.AreaItems)
  82. {
  83. writer.WriteUInt32(item.AreaId);
  84. writer.WriteUInt16(item.AreaProperty);
  85. writer.WriteUInt32(item.CenterPointLat);
  86. writer.WriteUInt32(item.CenterPointLng);
  87. writer.WriteUInt32(item.Radius);
  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_0x8600 value = new JT808_0x8600();
  129. value.SettingAreaProperty = reader.ReadByte();
  130. JT808SettingProperty jT808SettingProperty = (JT808SettingProperty)value.SettingAreaProperty;
  131. writer.WriteNumber($"[{ value.SettingAreaProperty.ReadNumber()}]设置属性-{jT808SettingProperty.ToString()}", value.SettingAreaProperty);
  132. value.AreaCount = reader.ReadByte();
  133. writer.WriteNumber($"[{ value.AreaCount.ReadNumber()}]区域总数", value.AreaCount);
  134. writer.WriteStartArray("区域项");
  135. for (var i = 0; i < value.AreaCount; i++)
  136. {
  137. writer.WriteStartObject();
  138. JT808CircleAreaProperty jT808CircleAreaProperty = new JT808CircleAreaProperty();
  139. jT808CircleAreaProperty.AreaId = reader.ReadUInt32();
  140. writer.WriteNumber($"[{ jT808CircleAreaProperty.AreaId.ReadNumber()}]区域ID", jT808CircleAreaProperty.AreaId);
  141. jT808CircleAreaProperty.AreaProperty = reader.ReadUInt16();
  142. writer.WriteNumber($"[{ jT808CircleAreaProperty.AreaProperty.ReadNumber()}]区域属性", jT808CircleAreaProperty.AreaProperty);
  143. ReadOnlySpan<char> areaPropertyBits =string.Join("", Convert.ToString(jT808CircleAreaProperty.AreaProperty, 2).PadLeft(16, '0').Reverse()).AsSpan();
  144. writer.WriteStartObject($"区域属性对象[{areaPropertyBits.ToString()}]");
  145. if (reader.Version == JT808Version.JTT2019)
  146. {
  147. writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15]=='0'?"进区域不采集GNSS详细定位数据":"进区域采集GNSS详细定位数据");
  148. writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14]=='0'?"进区域开启通信模块":"进区域关闭通信模块");
  149. writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9,5));
  150. writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门");
  151. writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经");
  152. writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬");
  153. writer.WriteString($"[bit5]出区域是否报警给平台-{areaPropertyBits[5]}", areaPropertyBits[5] == '0' ? "否" : "是");
  154. writer.WriteString($"[bit4]出区域是否报警给平驾驶员-{areaPropertyBits[4]}", areaPropertyBits[4] == '0' ? "否" : "是");
  155. writer.WriteString($"[bit3]进区域是否报警给平台-{areaPropertyBits[3]}", areaPropertyBits[3] == '0' ? "否" : "是");
  156. writer.WriteString($"[bit2]进区域是否报警给驾驶员-{areaPropertyBits[2]}", areaPropertyBits[2] == '0' ? "否" : "是");
  157. writer.WriteString($"[bit1]是否启用最高速度、超速持续时间和夜间最高速度的判断规则-{areaPropertyBits[1]}", areaPropertyBits[1] == '0' ? "否" : "是");
  158. writer.WriteString($"[bit0]是否启用起始时间与结束时间的判断规则-{areaPropertyBits[0]}", areaPropertyBits[0] == '0' ? "否" : "是");
  159. }
  160. else
  161. {
  162. writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15] == '0' ? "进区域不采集GNSS详细定位数据" : "进区域采集GNSS详细定位数据");
  163. writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14] == '0' ? "进区域开启通信模块" : "进区域关闭通信模块");
  164. writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9, 5));
  165. writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门");
  166. writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经");
  167. writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬");
  168. writer.WriteString($"[bit5]{areaPropertyBits[5]}", areaPropertyBits[5] == '1' ? "出区域报警给平台" : "无");
  169. writer.WriteString($"[bit4]{areaPropertyBits[4]}", areaPropertyBits[4] == '1' ? "出区域报警给驾驶员" : "无");
  170. writer.WriteString($"[bit3]{areaPropertyBits[3]}", areaPropertyBits[3] == '1' ? "进区域报警给平台" : "无");
  171. writer.WriteString($"[bit2]{areaPropertyBits[2]}", areaPropertyBits[2] == '1' ? "进区域报警给驾驶员" : "无");
  172. writer.WriteString($"[bit1]{areaPropertyBits[1]}", areaPropertyBits[1] == '1' ? "限速" : "无");
  173. writer.WriteString($"[bit0]{areaPropertyBits[0]}", areaPropertyBits[0] == '1' ? "根据时间" : "无");
  174. }
  175. writer.WriteEndObject();
  176. jT808CircleAreaProperty.CenterPointLat = reader.ReadUInt32();
  177. writer.WriteNumber($"[{ jT808CircleAreaProperty.CenterPointLat.ReadNumber()}]中心点纬度", jT808CircleAreaProperty.CenterPointLat);
  178. jT808CircleAreaProperty.CenterPointLng = reader.ReadUInt32();
  179. writer.WriteNumber($"[{ jT808CircleAreaProperty.CenterPointLng.ReadNumber()}]中心点经度", jT808CircleAreaProperty.CenterPointLng);
  180. jT808CircleAreaProperty.Radius = reader.ReadUInt32();
  181. writer.WriteNumber($"[{ jT808CircleAreaProperty.Radius.ReadNumber()}]半径", jT808CircleAreaProperty.Radius);
  182. ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(jT808CircleAreaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan();
  183. bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
  184. if (!bit0Flag)
  185. {
  186. jT808CircleAreaProperty.StartTime = reader.ReadDateTime6();
  187. writer.WriteString($"[{ jT808CircleAreaProperty.StartTime.Value.ToString("yyMMddHHmmss")}]起始时间", jT808CircleAreaProperty.StartTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  188. jT808CircleAreaProperty.EndTime = reader.ReadDateTime6();
  189. writer.WriteString($"[{ jT808CircleAreaProperty.EndTime.Value.ToString("yyMMddHHmmss")}]结束时间", jT808CircleAreaProperty.EndTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  190. }
  191. bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
  192. if (!bit1Flag)
  193. {
  194. jT808CircleAreaProperty.HighestSpeed = reader.ReadUInt16();
  195. writer.WriteNumber($"[{ jT808CircleAreaProperty.HighestSpeed.Value.ReadNumber()}]最高速度", jT808CircleAreaProperty.HighestSpeed.Value);
  196. jT808CircleAreaProperty.OverspeedDuration = reader.ReadByte();
  197. writer.WriteNumber($"[{ jT808CircleAreaProperty.OverspeedDuration.Value.ReadNumber()}]超速持续时间", jT808CircleAreaProperty.OverspeedDuration.Value);
  198. if (reader.Version == JT808Version.JTT2019)
  199. {
  200. jT808CircleAreaProperty.NightMaximumSpeed = reader.ReadUInt16();
  201. writer.WriteNumber($"[{ jT808CircleAreaProperty.NightMaximumSpeed.ReadNumber()}]夜间最高速度", jT808CircleAreaProperty.NightMaximumSpeed);
  202. }
  203. }
  204. if (reader.Version == JT808Version.JTT2019)
  205. {
  206. jT808CircleAreaProperty.NameLength = reader.ReadUInt16();
  207. writer.WriteNumber($"[{ jT808CircleAreaProperty.NameLength.ReadNumber()}]名称长度", jT808CircleAreaProperty.NameLength);
  208. var areaNameBuffer = reader.ReadVirtualArray(jT808CircleAreaProperty.NameLength);
  209. jT808CircleAreaProperty.AreaName = reader.ReadString(jT808CircleAreaProperty.NameLength);
  210. writer.WriteString($"[{ areaNameBuffer.ToArray().ToHexString()}]区域名称", jT808CircleAreaProperty.AreaName);
  211. }
  212. writer.WriteEndObject();
  213. }
  214. writer.WriteEndArray();
  215. }
  216. }
  217. }