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

137 行
6.6 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.Collections.Generic;
  8. using System.Text.Json;
  9. namespace JT808.Protocol.MessageBody
  10. {
  11. /// <summary>
  12. /// 存储多媒体数据检索应答
  13. /// 0x0802
  14. /// </summary>
  15. public class JT808_0x0802 : JT808MessagePackFormatter<JT808_0x0802>, JT808Bodies, IJT808Analyze, IJT808_2019_Version
  16. {
  17. /// <summary>
  18. /// 0x0802
  19. /// </summary>
  20. public ushort MsgId => 0x0802;
  21. /// <summary>
  22. ///
  23. /// </summary>
  24. public bool SkipSerialization => false;
  25. /// <summary>
  26. /// 存储多媒体数据检索应答
  27. /// </summary>
  28. public string Description => "存储多媒体数据检索应答";
  29. /// <summary>
  30. /// 应答流水号
  31. /// 对应的多媒体数据检索消息的流水号
  32. /// </summary>
  33. public ushort MsgNum { get; set; }
  34. /// <summary>
  35. /// 多媒体数据总项数
  36. /// 满足检索条件的多媒体数据总项数
  37. /// </summary>
  38. public ushort MultimediaItemCount { get; set; }
  39. /// <summary>
  40. /// 检索项集合
  41. /// </summary>
  42. public List<JT808MultimediaSearchProperty> MultimediaSearchItems { get; set; }
  43. /// <summary>
  44. ///
  45. /// </summary>
  46. /// <param name="reader"></param>
  47. /// <param name="writer"></param>
  48. /// <param name="config"></param>
  49. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  50. {
  51. JT808_0x0802 value = new JT808_0x0802();
  52. value.MsgNum = reader.ReadUInt16();
  53. writer.WriteNumber($"[{value.MsgNum.ReadNumber()}]应答流水号", value.MsgNum);
  54. value.MultimediaItemCount = reader.ReadUInt16();
  55. writer.WriteNumber($"[{value.MultimediaItemCount.ReadNumber()}]多媒体数据总项数", value.MultimediaItemCount);
  56. writer.WriteStartArray("多媒体数据集合");
  57. for (var i = 0; i < value.MultimediaItemCount; i++)
  58. {
  59. writer.WriteStartObject();
  60. JT808MultimediaSearchProperty jT808MultimediaSearchProperty = new JT808MultimediaSearchProperty();
  61. if (reader.ReadCurrentRemainContentLength() == (value.MultimediaItemCount - i) * (4 + 1 + 1 + 1 + 28))
  62. {
  63. //2013 ,2019协议
  64. jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32();
  65. writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaId.ReadNumber()}]多媒体ID", jT808MultimediaSearchProperty.MultimediaId);
  66. }
  67. jT808MultimediaSearchProperty.MultimediaType = reader.ReadByte();
  68. writer.WriteNumber($"[{jT808MultimediaSearchProperty.MultimediaType.ReadNumber()}]多媒体类型-{((JT808MultimediaType)jT808MultimediaSearchProperty.MultimediaType).ToString()}", jT808MultimediaSearchProperty.MultimediaType);
  69. jT808MultimediaSearchProperty.ChannelId = reader.ReadByte();
  70. writer.WriteNumber($"[{jT808MultimediaSearchProperty.ChannelId.ReadNumber()}]通道ID", jT808MultimediaSearchProperty.ChannelId);
  71. jT808MultimediaSearchProperty.EventItemCoding = reader.ReadByte();
  72. writer.WriteNumber($"[{jT808MultimediaSearchProperty.EventItemCoding.ReadNumber()}]事件项编码-{((JT808EventItemCoding)jT808MultimediaSearchProperty.EventItemCoding).ToString()}", jT808MultimediaSearchProperty.EventItemCoding);
  73. JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28), reader.Version);
  74. writer.WriteStartObject($"位置基本信息");
  75. config.GetAnalyze<JT808_0x0200>().Analyze(ref positionReader, writer, config);
  76. writer.WriteEndObject();
  77. writer.WriteEndObject();
  78. }
  79. writer.WriteEndArray();
  80. }
  81. /// <summary>
  82. ///
  83. /// </summary>
  84. /// <param name="reader"></param>
  85. /// <param name="config"></param>
  86. /// <returns></returns>
  87. public override JT808_0x0802 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  88. {
  89. JT808_0x0802 value = new JT808_0x0802();
  90. value.MsgNum = reader.ReadUInt16();
  91. value.MultimediaItemCount = reader.ReadUInt16();
  92. value.MultimediaSearchItems = new List<JT808MultimediaSearchProperty>();
  93. for (var i = 0; i < value.MultimediaItemCount; i++)
  94. {
  95. JT808MultimediaSearchProperty jT808MultimediaSearchProperty = new JT808MultimediaSearchProperty();
  96. if (reader.ReadCurrentRemainContentLength() ==(value.MultimediaItemCount-i)*(4 + 1 + 1 + 1 + 28))
  97. {
  98. //2013 ,2019协议
  99. jT808MultimediaSearchProperty.MultimediaId = reader.ReadUInt32();
  100. }
  101. jT808MultimediaSearchProperty.MultimediaType = reader.ReadByte();
  102. jT808MultimediaSearchProperty.ChannelId = reader.ReadByte();
  103. jT808MultimediaSearchProperty.EventItemCoding = reader.ReadByte();
  104. JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28), reader.Version);
  105. jT808MultimediaSearchProperty.Position = config.GetMessagePackFormatter<JT808_0x0200>().Deserialize(ref positionReader, config);
  106. value.MultimediaSearchItems.Add(jT808MultimediaSearchProperty);
  107. }
  108. return value;
  109. }
  110. /// <summary>
  111. ///
  112. /// </summary>
  113. /// <param name="writer"></param>
  114. /// <param name="value"></param>
  115. /// <param name="config"></param>
  116. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x0802 value, IJT808Config config)
  117. {
  118. writer.WriteUInt16(value.MsgNum);
  119. writer.WriteUInt16((ushort)value.MultimediaSearchItems.Count);
  120. foreach (var item in value.MultimediaSearchItems)
  121. {
  122. if (writer.Version != JT808Version.JTT2011)
  123. {
  124. writer.WriteUInt32(item.MultimediaId);
  125. }
  126. writer.WriteByte(item.MultimediaType);
  127. writer.WriteByte(item.ChannelId);
  128. writer.WriteByte(item.EventItemCoding);
  129. config.GetMessagePackFormatter<JT808_0x0200>().Serialize(ref writer, item.Position, config);
  130. }
  131. }
  132. }
  133. }