Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

125 строки
5.0 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. namespace JT809.Protocol.SubMessageBody
  8. {
  9. /// <summary>
  10. /// 报警预警2013
  11. /// 下发报警预警消息2019
  12. /// <para>子业务类型标识:DOWN_WARN_MSG_INFORM_TIPS</para>
  13. /// <para>描述:用于上级平台向车辆归属或车辆跨域下级平台下发相关车辆的报警顶警或运行提示信息</para>
  14. /// <para>本条消息下级平台无需应答</para>
  15. /// </summary>
  16. public class JT809_0x9400_0x9402:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9402>,IJT809_2019_Version
  17. {
  18. public override ushort SubMsgId => JT809SubBusinessType.报警预警2013_下发报警预警消息2019.ToUInt16Value();
  19. public override string Description => "报警预警2013_下发报警预警消息2019";
  20. /// <summary>
  21. /// 报警信息来源
  22. /// </summary>
  23. public JT809WarnSrc WarnSrc { get; set; }
  24. /// <summary>
  25. /// 发起报警平台唯一编码,由平台所在地行政区域代码和平台编号组成
  26. /// </summary>
  27. public string SourcePlatformId { get; set; }
  28. /// <summary>
  29. /// 报警类型
  30. /// </summary>
  31. public JT809WarnType WarnType { get; set; }
  32. /// <summary>
  33. /// 报警时间
  34. /// </summary>
  35. public DateTime WarnTime { get; set; }
  36. /// <summary>
  37. /// 事件开始时间 utc
  38. /// </summary>
  39. public DateTime StartTime { get; set; }
  40. /// <summary>
  41. /// 事件结束时间 utc
  42. /// </summary>
  43. public DateTime EndTime { get; set; }
  44. /// <summary>
  45. /// 车牌号码 非车辆相关报警全填0
  46. /// </summary>
  47. public string VehicleNo { get; set; }
  48. /// <summary>
  49. /// 车牌颜色 非车辆相关报警全填0
  50. /// </summary>
  51. public JT809VehicleColorType VehicleColor { get; set; }
  52. /// <summary>
  53. /// 被报警平台唯一编码,由平台所在地行政区划代码和平台编号组成。非平台相关报警全填0
  54. /// </summary>
  55. public string DestinationPlatformId { get; set; }
  56. /// <summary>
  57. /// 线路ID 808-2019中0x8606规定的报文中的线路ID
  58. /// </summary>
  59. public uint DRVLineId { get; set; }
  60. /// <summary>
  61. /// 数据长度
  62. /// </summary>
  63. public uint WarnLength { get; set; }
  64. /// <summary>
  65. /// 报警描述
  66. /// </summary>
  67. public string WarnContent { get; set; }
  68. public JT809_0x9400_0x9402 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  69. {
  70. var value = new JT809_0x9400_0x9402();
  71. if (config.Version == JT809Version.JTT2011)
  72. {
  73. value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
  74. }
  75. else
  76. {
  77. value.SourcePlatformId = reader.ReadBigNumber(11);
  78. }
  79. value.WarnType = (JT809WarnType)reader.ReadUInt16();
  80. value.WarnTime = reader.ReadUTCDateTime();
  81. if (config.Version == JT809Version.JTT2019) {
  82. value.StartTime = reader.ReadUTCDateTime();
  83. value.EndTime = reader.ReadUTCDateTime();
  84. #warning 此处车牌号文档长度有误,使用旧版长度21
  85. value.VehicleNo = reader.ReadString(21);
  86. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  87. value.DestinationPlatformId = reader.ReadBigNumber(11);
  88. value.DRVLineId = reader.ReadUInt32();
  89. }
  90. value.WarnLength = reader.ReadUInt32();
  91. value.WarnContent = reader.ReadString((int)value.WarnLength);
  92. return value;
  93. }
  94. public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9400_0x9402 value, IJT809Config config)
  95. {
  96. if (config.Version == JT809Version.JTT2011)
  97. {
  98. writer.WriteByte((byte)value.WarnSrc);
  99. }
  100. else
  101. {
  102. writer.WriteBigNumber(value.SourcePlatformId,11);
  103. }
  104. writer.WriteUInt16((ushort)value.WarnType);
  105. writer.WriteUTCDateTime(value.WarnTime);
  106. if (config.Version == JT809Version.JTT2019) {
  107. writer.WriteUTCDateTime(value.StartTime);
  108. writer.WriteUTCDateTime(value.EndTime);
  109. writer.WriteStringPadRight(value.VehicleNo, 21);
  110. writer.WriteByte((byte)value.VehicleColor);
  111. writer.WriteBigNumber(value.DestinationPlatformId,11);
  112. writer.WriteUInt32(value.DRVLineId);
  113. }
  114. // 先计算内容长度(汉字为两个字节)
  115. writer.Skip(4, out int lengthPosition);
  116. writer.WriteString(value.WarnContent);
  117. writer.WriteInt32Return(writer.GetCurrentPosition() - lengthPosition - 4, lengthPosition);
  118. }
  119. }
  120. }