Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

127 linhas
5.4 KiB

  1. using JT808.Protocol.Formatters;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.MessageBody;
  4. using JT808.Protocol.MessagePack;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.Extensions.JT1078.MessageBody
  9. {
  10. /// <summary>
  11. /// 音视频通道列表设置
  12. /// 0x8103_0x0076
  13. /// </summary>
  14. public class JT808_0x8103_0x0076 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter<JT808_0x8103_0x0076>, IJT808Analyze
  15. {
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. public override uint ParamId { get; set; } = 0x0076;
  20. /// <summary>
  21. /// 数据 长度
  22. /// </summary>
  23. public override byte ParamLength { get; set; }
  24. /// <summary>
  25. /// 音视频通道总数
  26. /// l
  27. /// </summary>
  28. public byte AVChannelTotal { get; set; }
  29. /// <summary>
  30. /// 音频通道总数
  31. /// m
  32. /// </summary>
  33. public byte AudioChannelTotal { get; set; }
  34. /// <summary>
  35. /// 视频通道总数
  36. /// n
  37. /// </summary>
  38. public byte VudioChannelTotal { get; set; }
  39. /// <summary>
  40. /// 音视频通道对照表
  41. /// 4*(l+m+n)
  42. /// </summary>
  43. public List<JT808_0x8103_0x0076_AVChannelRefTable> AVChannelRefTables { get; set; }
  44. /// <summary>
  45. ///
  46. /// </summary>
  47. /// <param name="reader"></param>
  48. /// <param name="writer"></param>
  49. /// <param name="config"></param>
  50. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  51. {
  52. JT808_0x8103_0x0076 value = new JT808_0x8103_0x0076();
  53. value.ParamId = reader.ReadUInt32();
  54. writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数 ID", value.ParamId);
  55. value.ParamLength = reader.ReadByte();
  56. writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]数据长度", value.ParamLength);
  57. value.AVChannelTotal = reader.ReadByte();
  58. writer.WriteNumber($"[{value.AVChannelTotal.ReadNumber()}]音视频通道总数", value.AVChannelTotal);
  59. value.AudioChannelTotal = reader.ReadByte();
  60. writer.WriteNumber($"[{value.AudioChannelTotal.ReadNumber()}]音频通道总数", value.AudioChannelTotal);
  61. value.VudioChannelTotal = reader.ReadByte();
  62. writer.WriteNumber($"[{value.VudioChannelTotal.ReadNumber()}]视频通道总数", value.VudioChannelTotal);
  63. var channelTotal = value.AVChannelTotal + value.AudioChannelTotal + value.VudioChannelTotal;//通道总数
  64. writer.WriteStartArray("音视频通道对照表");
  65. for (int i = 0; i < channelTotal; i++)
  66. {
  67. writer.WriteStartObject();
  68. var formatter = config.GetMessagePackFormatter<JT808_0x8103_0x0076_AVChannelRefTable>();
  69. formatter.Analyze(ref reader, writer, config);
  70. writer.WriteEndObject();
  71. }
  72. writer.WriteEndArray();
  73. }
  74. /// <summary>
  75. ///
  76. /// </summary>
  77. /// <param name="reader"></param>
  78. /// <param name="config"></param>
  79. /// <returns></returns>
  80. public JT808_0x8103_0x0076 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  81. {
  82. JT808_0x8103_0x0076 jT808_0X8103_0X0076 = new JT808_0x8103_0x0076();
  83. jT808_0X8103_0X0076.ParamId = reader.ReadUInt32();
  84. jT808_0X8103_0X0076.ParamLength = reader.ReadByte();
  85. jT808_0X8103_0X0076.AVChannelTotal = reader.ReadByte();
  86. jT808_0X8103_0X0076.AudioChannelTotal = reader.ReadByte();
  87. jT808_0X8103_0X0076.VudioChannelTotal = reader.ReadByte();
  88. var channelTotal = jT808_0X8103_0X0076.AVChannelTotal + jT808_0X8103_0X0076.AudioChannelTotal + jT808_0X8103_0X0076.VudioChannelTotal;//通道总数
  89. if (channelTotal > 0)
  90. {
  91. jT808_0X8103_0X0076.AVChannelRefTables = new List<JT808_0x8103_0x0076_AVChannelRefTable>();
  92. var formatter = config.GetMessagePackFormatter<JT808_0x8103_0x0076_AVChannelRefTable>();
  93. for (int i = 0; i < channelTotal; i++)
  94. {
  95. jT808_0X8103_0X0076.AVChannelRefTables.Add(formatter.Deserialize(ref reader, config));
  96. }
  97. }
  98. return jT808_0X8103_0X0076;
  99. }
  100. /// <summary>
  101. ///
  102. /// </summary>
  103. /// <param name="writer"></param>
  104. /// <param name="value"></param>
  105. /// <param name="config"></param>
  106. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0076 value, IJT808Config config)
  107. {
  108. writer.WriteUInt32(value.ParamId);
  109. writer.Skip(1, out int position);
  110. writer.WriteByte(value.AVChannelTotal);
  111. writer.WriteByte(value.AudioChannelTotal);
  112. writer.WriteByte(value.VudioChannelTotal);
  113. if (value.AVChannelRefTables.Any())
  114. {
  115. var formatter = config.GetMessagePackFormatter<JT808_0x8103_0x0076_AVChannelRefTable>();
  116. foreach (var AVChannelRefTable in value.AVChannelRefTables)
  117. {
  118. formatter.Serialize(ref writer, AVChannelRefTable, config);
  119. }
  120. }
  121. writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - position - 1), position);
  122. }
  123. }
  124. }