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ů.

191 řádky
8.3 KiB

  1. using JT809.Protocol.Enums;
  2. using JT809.Protocol.Formatters;
  3. using JT809.Protocol.MessagePack;
  4. using JT809.Protocol.Extensions;
  5. using System;
  6. using JT809.Protocol.Interfaces;
  7. using System.Text.Json;
  8. namespace JT809.Protocol.SubMessageBody
  9. {
  10. /// <summary>
  11. /// 上报报警信息消息
  12. /// <para>子业务类型标识:UP_WARN_MSG_ADPT_INFO</para>
  13. /// <para>2011 描述:下级平台向上级平台上报某车辆的报警信息</para>
  14. /// <para>2019 描述:下级平台向上级平台“上报报警信息”。</para>
  15. /// <para>本条消息上级平台无需应答</para>
  16. /// </summary>
  17. public class JT809_0x1400_0x1402:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1400_0x1402>, IJT809Analyze, IJT809_2019_Version
  18. {
  19. public override ushort SubMsgId => JT809SubBusinessType.上报报警信息消息.ToUInt16Value();
  20. public override string Description => "上报报警信息消息";
  21. /// <summary>
  22. /// 报警信息来源
  23. /// </summary>
  24. public JT809WarnSrc WarnSrc { get; set; }
  25. /// <summary>
  26. /// 发起报警平台唯一编码,由平台所在地行政区域代码和平台编号组成
  27. /// </summary>
  28. public string SourcePlatformId { get; set; }
  29. /// <summary>
  30. /// 报警类型
  31. /// </summary>
  32. public JT809WarnType WarnType { get; set; }
  33. /// <summary>
  34. /// 报警时间
  35. /// </summary>
  36. public DateTime WarnTime { get; set; }
  37. /// <summary>
  38. /// 事件开始时间 utc
  39. /// </summary>
  40. public DateTime StartTime { get; set; }
  41. /// <summary>
  42. /// 事件结束时间 utc
  43. /// </summary>
  44. public DateTime EndTime { get; set; }
  45. /// <summary>
  46. /// 车牌号码 非车辆相关报警全填0
  47. /// </summary>
  48. public string VehicleNo { get; set; }
  49. /// <summary>
  50. /// 车牌颜色 非车辆相关报警全填0
  51. /// </summary>
  52. public JT809VehicleColorType VehicleColor { get; set; }
  53. /// <summary>
  54. /// 被报警平台唯一编码,由平台所在地行政区划代码和平台编号组成。非平台相关报警全填0
  55. /// </summary>
  56. public string DestinationPlatformId { get; set; }
  57. /// <summary>
  58. /// 线路ID 808-2019中0x8606规定的报文中的线路ID
  59. /// </summary>
  60. public uint DRVLineId { get; set; }
  61. /// <summary>
  62. /// 信息ID
  63. /// </summary>
  64. public uint InfoID { get; set; }
  65. /// <summary>
  66. /// 数据长度
  67. /// </summary>
  68. public uint InfoLength { get; set; }
  69. /// <summary>
  70. /// 信息内容
  71. /// </summary>
  72. public string InfoContent { get; set; }
  73. public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config)
  74. {
  75. var value = new JT809_0x1400_0x1402();
  76. if (config.Version == JT809Version.JTT2011)
  77. {
  78. value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
  79. writer.WriteString($"[{value.WarnSrc.ToByteValue()}]报警信息来源", value.WarnSrc.ToString());
  80. }
  81. else
  82. {
  83. var virtualHex = reader.ReadVirtualArray(11);
  84. value.SourcePlatformId = reader.ReadString(11);
  85. writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发起报警平台唯一编码", value.SourcePlatformId);
  86. }
  87. value.WarnType = (JT809WarnType)reader.ReadUInt16();
  88. writer.WriteString($"[{value.WarnType.ToByteValue()}]报警类型", value.WarnType.ToString());
  89. var hex = reader.ReadVirtualArray(8);
  90. value.WarnTime = reader.ReadUTCDateTime();
  91. writer.WriteString($"[{hex.ToArray().ToHexString()}]报警时间", value.WarnTime);
  92. if (config.Version == JT809Version.JTT2011)
  93. {
  94. value.InfoID = reader.ReadUInt32();
  95. writer.WriteNumber($"[{value.InfoID.ReadNumber()}]信息ID", value.InfoID);
  96. }
  97. else
  98. {
  99. hex = reader.ReadVirtualArray(8);
  100. value.StartTime = reader.ReadUTCDateTime();
  101. writer.WriteString($"[{hex.ToArray().ToHexString()}]事件开始时间", value.StartTime);
  102. hex = reader.ReadVirtualArray(8);
  103. value.EndTime = reader.ReadUTCDateTime();
  104. writer.WriteString($"[{hex.ToArray().ToHexString()}]事件结束时间", value.EndTime);
  105. #warning 此处车牌号文档长度有误,使用旧版长度21
  106. hex = reader.ReadVirtualArray(21);
  107. value.VehicleNo = reader.ReadString(21);
  108. writer.WriteString($"[{hex.ToArray().ToHexString()}]车牌号码", value.VehicleNo);
  109. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  110. writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString());
  111. hex = reader.ReadVirtualArray(11);
  112. value.DestinationPlatformId = reader.ReadString(11);
  113. writer.WriteString($"[{hex.ToArray().ToHexString()}]被报警平台唯一编码", value.DestinationPlatformId);
  114. value.DRVLineId = reader.ReadUInt32();
  115. writer.WriteNumber($"[{value.DRVLineId.ReadNumber()}]线路ID", value.DRVLineId);
  116. }
  117. value.InfoLength = reader.ReadUInt32();
  118. writer.WriteNumber($"[{value.InfoLength.ReadNumber()}]数据长度", value.InfoLength);
  119. hex = reader.ReadVirtualArray((int)value.InfoLength);
  120. value.InfoContent = reader.ReadString((int)value.InfoLength);
  121. writer.WriteString($"[{hex.ToArray().ToHexString()}]信息内容", value.InfoContent);
  122. }
  123. public JT809_0x1400_0x1402 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  124. {
  125. var value = new JT809_0x1400_0x1402();
  126. if (config.Version == JT809Version.JTT2011)
  127. {
  128. value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
  129. }
  130. else
  131. {
  132. value.SourcePlatformId = reader.ReadString(11);
  133. }
  134. value.WarnType = (JT809WarnType)reader.ReadUInt16();
  135. value.WarnTime = reader.ReadUTCDateTime();
  136. if (config.Version == JT809Version.JTT2011)
  137. {
  138. value.InfoID = reader.ReadUInt32();
  139. }
  140. else
  141. {
  142. value.StartTime = reader.ReadUTCDateTime();
  143. value.EndTime = reader.ReadUTCDateTime();
  144. #warning 此处车牌号文档长度有误,使用旧版长度21
  145. value.VehicleNo = reader.ReadString(21);
  146. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  147. value.DestinationPlatformId = reader.ReadString(11);
  148. value.DRVLineId = reader.ReadUInt32();
  149. }
  150. value.InfoLength = reader.ReadUInt32();
  151. value.InfoContent = reader.ReadString((int)value.InfoLength);
  152. return value;
  153. }
  154. public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1400_0x1402 value, IJT809Config config)
  155. {
  156. if (config.Version == JT809Version.JTT2011)
  157. {
  158. writer.WriteByte((byte)value.WarnSrc);
  159. }
  160. else
  161. {
  162. writer.WriteStringPadRight(value.SourcePlatformId,11);
  163. }
  164. writer.WriteUInt16((ushort)value.WarnType);
  165. writer.WriteUTCDateTime(value.WarnTime);
  166. if (config.Version == JT809Version.JTT2011)
  167. {
  168. writer.WriteUInt32(value.InfoID);
  169. }
  170. else
  171. {
  172. writer.WriteUTCDateTime(value.StartTime);
  173. writer.WriteUTCDateTime(value.EndTime);
  174. writer.WriteStringPadRight(value.VehicleNo,21);
  175. writer.WriteByte((byte)value.VehicleColor);
  176. writer.WriteStringPadRight(value.DestinationPlatformId,11);
  177. writer.WriteUInt32(value.DRVLineId);
  178. }
  179. // 先计算内容长度(汉字为两个字节)
  180. writer.Skip(4, out int lengthPosition);
  181. writer.WriteString(value.InfoContent);
  182. writer.WriteInt32Return(writer.GetCurrentPosition() - lengthPosition - 4, lengthPosition);
  183. }
  184. }
  185. }