25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
5.8 KiB

  1. using JT808.Protocol.Formatters;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.MessagePack;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.Extensions.JT1078.MessageBody
  9. {
  10. /// <summary>
  11. /// 音视频实时传输控制(LiveControl直播控制)
  12. /// </summary>
  13. public class JT808_0x9102 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9102>, IJT808Analyze
  14. {
  15. #pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释
  16. public override string Description => "音视频实时传输控制";
  17. public override ushort MsgId => 0x9102;
  18. #pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释
  19. /// <summary>
  20. /// 逻辑通道号
  21. /// </summary>
  22. public byte ChannelNo { get; set; }
  23. /// <summary>
  24. /// 控制指令
  25. /// 平台可以通过该指令对设备的实时音视频进行控制:
  26. /// 0:关闭音视频传输指令
  27. /// 1:切换码流(增加暂停和继续)
  28. /// 2:暂停该通道所有流的发送
  29. /// 3:恢复暂停前流的发送,与暂停前的流类型一致
  30. /// 4:关闭双向对讲
  31. /// </summary>
  32. public byte ControlCmd { get; set; }
  33. /// <summary>
  34. /// 关闭音视频类型
  35. /// 0:关闭该通道有关的音视频数据
  36. /// 1:只关闭该通道有关的音频,保留该通道有关的视频
  37. /// 2:只关闭该通道有关的视频,保留该通道有关的音频
  38. /// </summary>
  39. public byte CloseAVData { get; set; }
  40. /// <summary>
  41. /// 切换码流类型
  42. /// 将之前申请的码流切换为新申请的码流,音频与切换前保持一致。
  43. /// 新申请的码流为:
  44. /// 0:主码流
  45. /// 1:子码流
  46. /// </summary>
  47. public byte StreamType { get; set; }
  48. /// <summary>
  49. /// 格式分析
  50. /// </summary>
  51. /// <param name="reader"></param>
  52. /// <param name="writer"></param>
  53. /// <param name="config"></param>
  54. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  55. {
  56. JT808_0x9102 value = new JT808_0x9102();
  57. value.ChannelNo = reader.ReadByte();
  58. writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo));
  59. value.ControlCmd = reader.ReadByte();
  60. writer.WriteString($"[{value.ControlCmd.ReadNumber()}]控制指令", ControlCmdDisplay(value.ControlCmd));
  61. value.CloseAVData = reader.ReadByte();
  62. writer.WriteString($"[{value.CloseAVData.ReadNumber()}]关闭音视频类型", CloseAVDataDisplay(value.CloseAVData));
  63. value.StreamType = reader.ReadByte();
  64. writer.WriteString($"[{value.StreamType.ReadNumber()}]切换码流类型", value.StreamType == 0 ? "主码流" : "子码流");
  65. string CloseAVDataDisplay(byte CloseAVData)
  66. {
  67. return CloseAVData switch
  68. {
  69. 0 => "关闭该通道有关的音视频数据",
  70. 1 => "只关闭该通道有关的音频,保留该通道有关的视频",
  71. 2 => "只关闭该通道有关的视频,保留该通道有关的音频",
  72. _ => "未知",
  73. };
  74. }
  75. string ControlCmdDisplay(byte ControlCmd)
  76. {
  77. return ControlCmd switch
  78. {
  79. 0 => "关闭音视频传输指令",
  80. 1 => "切换码流(增加暂停和继续)",
  81. 2 => "暂停该通道所有流的发送",
  82. 3 => "恢复暂停前流的发送,与暂停前的流类型一致",
  83. 4 => "关闭双向对讲",
  84. _ => "未知",
  85. };
  86. }
  87. string LogicalChannelNoDisplay(byte LogicalChannelNo)
  88. {
  89. return LogicalChannelNo switch
  90. {
  91. 1 => "驾驶员",
  92. 2 => "车辆正前方",
  93. 3 => "车前门",
  94. 4 => "车厢前部",
  95. 5 => "车厢后部",
  96. 7 => "行李舱",
  97. 8 => "车辆左侧",
  98. 9 => "车辆右侧",
  99. 10 => "车辆正后方",
  100. 11 => "车厢中部",
  101. 12 => "车中门",
  102. 13 => "驾驶席车门",
  103. 33 => "驾驶员",
  104. 36 => "车厢前部",
  105. 37 => "车厢后部",
  106. _ => "预留",
  107. };
  108. }
  109. }
  110. /// <summary>
  111. /// 反序列化
  112. /// </summary>
  113. /// <param name="reader"></param>
  114. /// <param name="config"></param>
  115. /// <returns></returns>
  116. public JT808_0x9102 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  117. {
  118. var jT808_0X9102 = new JT808_0x9102();
  119. jT808_0X9102.ChannelNo = reader.ReadByte();
  120. jT808_0X9102.ControlCmd = reader.ReadByte();
  121. jT808_0X9102.CloseAVData = reader.ReadByte();
  122. jT808_0X9102.StreamType = reader.ReadByte();
  123. return jT808_0X9102;
  124. }
  125. /// <summary>
  126. /// 序列化
  127. /// </summary>
  128. /// <param name="writer"></param>
  129. /// <param name="value"></param>
  130. /// <param name="config"></param>
  131. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9102 value, IJT808Config config)
  132. {
  133. writer.WriteByte(value.ChannelNo);
  134. writer.WriteByte(value.ControlCmd);
  135. writer.WriteByte(value.CloseAVData);
  136. writer.WriteByte(value.StreamType);
  137. }
  138. }
  139. }