您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

157 行
7.5 KiB

  1. using JT808.Protocol.Extensions.JTActiveSafety.Metadata;
  2. using JT808.Protocol.Formatters;
  3. using JT808.Protocol.Interfaces;
  4. using JT808.Protocol.MessagePack;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Text;
  8. using System.Text.Json;
  9. namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody
  10. {
  11. /// <summary>
  12. /// 报警附件信息消息
  13. /// </summary>
  14. public class JT808_0x1210: JT808Bodies, IJT808MessagePackFormatter<JT808_0x1210>, IJT808Analyze
  15. {
  16. /// <summary>
  17. /// 制造商Id
  18. /// 7 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00”
  19. /// </summary>
  20. public string MakerID { get; set; }
  21. /// <summary>
  22. /// 报警标识号
  23. /// </summary>
  24. public AlarmIdentificationProperty AlarmIdentification { get; set; }
  25. /// <summary>
  26. /// 平台给报警分配的唯一编号
  27. /// 32
  28. /// </summary>
  29. public string AlarmId { get; set; }
  30. /// <summary>
  31. /// 信息类型
  32. /// 0x00:正常报警文件信息
  33. /// 0x01:补传报警文件信息
  34. /// </summary>
  35. public byte InfoType { get; set; }
  36. /// <summary>
  37. /// 附件数量
  38. /// </summary>
  39. public byte AttachCount { get; set; }
  40. /// <summary>
  41. /// 附件信息列表
  42. /// </summary>
  43. public List<AttachProperty> AttachInfos { get; set; }
  44. public override ushort MsgId => 0x1210;
  45. public override string Description => "报警附件信息消息";
  46. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  47. {
  48. JT808_0x1210 value = new JT808_0x1210();
  49. string makerIdHex=reader.ReadVirtualArray(7).ToArray().ToHexString();
  50. value.MakerID = reader.ReadString(7);
  51. writer.WriteString($"[{makerIdHex}]制造商Id", value.MakerID);
  52. value.AlarmIdentification = new AlarmIdentificationProperty();
  53. string terminalIDHex = reader.ReadVirtualArray(7).ToArray().ToHexString();
  54. value.AlarmIdentification.TerminalID = reader.ReadString(7);
  55. value.AlarmIdentification.Time = reader.ReadDateTime6();
  56. value.AlarmIdentification.SN = reader.ReadByte();
  57. value.AlarmIdentification.AttachCount = reader.ReadByte();
  58. value.AlarmIdentification.Retain = reader.ReadByte();
  59. writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalID);
  60. writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
  61. writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
  62. writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
  63. writer.WriteNumber($"[{value.AlarmIdentification.Retain.ReadNumber()}]预留", value.AlarmIdentification.Retain);
  64. string alarmIdHex = reader.ReadVirtualArray(32).ToArray().ToHexString();
  65. value.AlarmId = reader.ReadString(32);
  66. writer.WriteString($"[{alarmIdHex}]平台给报警分配的唯一编号", value.AlarmId);
  67. value.InfoType = reader.ReadByte();
  68. writer.WriteNumber($"[{value.InfoType.ReadNumber()}]信息类型", value.InfoType);
  69. value.AttachCount = reader.ReadByte();
  70. writer.WriteNumber($"[{value.AttachCount.ReadNumber()}]附件数量", value.AttachCount);
  71. if (value.AttachCount > 0)
  72. {
  73. writer.WriteStartArray("附件信息列表");
  74. for (int i = 0; i < value.AttachCount; i++)
  75. {
  76. writer.WriteStartObject();
  77. AttachProperty attachProperty = new AttachProperty();
  78. attachProperty.FileNameLength = reader.ReadByte();
  79. writer.WriteNumber($"[{attachProperty.FileNameLength.ReadNumber()}]文件名称长度", attachProperty.FileNameLength);
  80. string fileNameHex = reader.ReadVirtualArray(attachProperty.FileNameLength).ToArray().ToHexString();
  81. attachProperty.FileName = reader.ReadString(attachProperty.FileNameLength);
  82. writer.WriteString($"[{fileNameHex}]文件名称", attachProperty.FileName);
  83. attachProperty.FileSize = reader.ReadUInt32();
  84. writer.WriteNumber($"[{ attachProperty.FileSize.ReadNumber()}]文件大小", attachProperty.FileSize);
  85. writer.WriteEndObject();
  86. }
  87. writer.WriteEndArray();
  88. }
  89. }
  90. public JT808_0x1210 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  91. {
  92. JT808_0x1210 value = new JT808_0x1210();
  93. value.MakerID = reader.ReadString(7);
  94. value.AlarmIdentification = new AlarmIdentificationProperty
  95. {
  96. TerminalID = reader.ReadString(7),
  97. Time = reader.ReadDateTime6(),
  98. SN = reader.ReadByte(),
  99. AttachCount = reader.ReadByte(),
  100. Retain = reader.ReadByte()
  101. };
  102. value.AlarmId = reader.ReadString(32);
  103. value.InfoType = reader.ReadByte();
  104. value.AttachCount = reader.ReadByte();
  105. if (value.AttachCount > 0)
  106. {
  107. value.AttachInfos = new List<AttachProperty>();
  108. for (int i = 0; i < value.AttachCount; i++)
  109. {
  110. AttachProperty attachProperty = new AttachProperty();
  111. attachProperty.FileNameLength = reader.ReadByte();
  112. attachProperty.FileName = reader.ReadString(attachProperty.FileNameLength);
  113. attachProperty.FileSize = reader.ReadUInt32();
  114. value.AttachInfos.Add(attachProperty);
  115. }
  116. }
  117. return value;
  118. }
  119. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1210 value, IJT808Config config)
  120. {
  121. writer.WriteString(value.MakerID.PadRight(7, '0'));
  122. if (value.AlarmIdentification == null)
  123. {
  124. throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
  125. }
  126. writer.WriteString(value.AlarmIdentification.TerminalID);
  127. writer.WriteDateTime6(value.AlarmIdentification.Time);
  128. writer.WriteByte(value.AlarmIdentification.SN);
  129. writer.WriteByte(value.AlarmIdentification.AttachCount);
  130. writer.WriteByte(value.AlarmIdentification.Retain);
  131. writer.WriteString(value.AlarmId);
  132. writer.WriteByte(value.InfoType);
  133. if (value.AttachInfos != null && value.AttachInfos.Count > 0)
  134. {
  135. writer.WriteByte((byte)value.AttachInfos.Count);
  136. foreach (var item in value.AttachInfos)
  137. {
  138. writer.Skip(1, out int FileNameLengthPosition);
  139. writer.WriteString(item.FileName);
  140. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition);
  141. writer.WriteUInt32(item.FileSize);
  142. }
  143. }
  144. else
  145. {
  146. writer.WriteByte(0);
  147. }
  148. }
  149. }
  150. }