You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 regels
4.9 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. /// 实时交换报警信息
  11. /// <para>子业务类型标识:DOWN_WARN_MSG_EXG_INFORM</para>
  12. /// <para>描述:用于上级平台向车辆跨域目的地下级平台下发相关车辆的当前报警情况</para>
  13. /// <para>本条消息下级平台无需应答</para>
  14. /// </summary>
  15. public class JT809_0x9400_0x9403:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9400_0x9403>,IJT809_2019_Version
  16. {
  17. public override ushort SubMsgId => JT809SubBusinessType.实时交换报警信息.ToUInt16Value();
  18. public override string Description => "实时交换报警信息";
  19. /// <summary>
  20. /// 报警信息来源
  21. /// </summary>
  22. public JT809WarnSrc WarnSrc { get; set; }
  23. /// <summary>
  24. /// 发起报警平台唯一编码,由平台所在地行政区域代码和平台编号组成
  25. /// </summary>
  26. public string SourcePlatformId { get; set; }
  27. /// <summary>
  28. /// 报警类型
  29. /// </summary>
  30. public JT809WarnType WarnType { get; set; }
  31. /// <summary>
  32. /// 报警时间
  33. /// </summary>
  34. public DateTime WarnTime { get; set; }
  35. /// <summary>
  36. /// 事件开始时间 utc
  37. /// </summary>
  38. public DateTime StartTime { get; set; }
  39. /// <summary>
  40. /// 事件结束时间 utc
  41. /// </summary>
  42. public DateTime EndTime { get; set; }
  43. /// <summary>
  44. /// 车牌号码 非车辆相关报警全填0
  45. /// </summary>
  46. public string VehicleNo { get; set; }
  47. /// <summary>
  48. /// 车牌颜色 非车辆相关报警全填0
  49. /// </summary>
  50. public JT809VehicleColorType VehicleColor { get; set; }
  51. /// <summary>
  52. /// 被报警平台唯一编码,由平台所在地行政区划代码和平台编号组成。非平台相关报警全填0
  53. /// </summary>
  54. public string DestinationPlatformId { get; set; }
  55. /// <summary>
  56. /// 线路ID 808-2019中0x8606规定的报文中的线路ID
  57. /// </summary>
  58. public uint DRVLineId { get; set; }
  59. /// <summary>
  60. /// 数据长度
  61. /// </summary>
  62. public uint WarnLength { get; set; }
  63. /// <summary>
  64. /// 报警描述
  65. /// </summary>
  66. public string WarnContent { get; set; }
  67. public JT809_0x9400_0x9403 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  68. {
  69. var value = new JT809_0x9400_0x9403();
  70. if (config.Version == JT809Version.JTT2011)
  71. {
  72. value.WarnSrc = (JT809WarnSrc)reader.ReadByte();
  73. }
  74. else
  75. {
  76. value.SourcePlatformId = reader.ReadBigNumber(11);
  77. }
  78. value.WarnType = (JT809WarnType)reader.ReadUInt16();
  79. value.WarnTime = reader.ReadUTCDateTime();
  80. if (config.Version == JT809Version.JTT2019)
  81. {
  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_0x9403 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. {
  108. writer.WriteUTCDateTime(value.StartTime);
  109. writer.WriteUTCDateTime(value.EndTime);
  110. writer.WriteStringPadRight(value.VehicleNo, 21);
  111. writer.WriteByte((byte)value.VehicleColor);
  112. writer.WriteBigNumber(value.DestinationPlatformId,11);
  113. writer.WriteUInt32(value.DRVLineId);
  114. }
  115. // 先计算内容长度(汉字为两个字节)
  116. writer.Skip(4, out int lengthPosition);
  117. writer.WriteString(value.WarnContent);
  118. writer.WriteInt32Return(writer.GetCurrentPosition() - lengthPosition - 4, lengthPosition);
  119. }
  120. }
  121. }