using JT808.Protocol.Formatters; using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; using System.Collections.Generic; using System.Text; using System.Text.Json; namespace JT808.Protocol.Extensions.JT1078.MessageBody { /// /// 音视频实时传输控制(LiveControl直播控制) /// public class JT808_0x9102 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze { #pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 public override string Description => "音视频实时传输控制"; public override ushort MsgId => 0x9102; #pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 /// /// 逻辑通道号 /// public byte ChannelNo { get; set; } /// /// 控制指令 /// 平台可以通过该指令对设备的实时音视频进行控制: /// 0:关闭音视频传输指令 /// 1:切换码流(增加暂停和继续) /// 2:暂停该通道所有流的发送 /// 3:恢复暂停前流的发送,与暂停前的流类型一致 /// 4:关闭双向对讲 /// public byte ControlCmd { get; set; } /// /// 关闭音视频类型 /// 0:关闭该通道有关的音视频数据 /// 1:只关闭该通道有关的音频,保留该通道有关的视频 /// 2:只关闭该通道有关的视频,保留该通道有关的音频 /// public byte CloseAVData { get; set; } /// /// 切换码流类型 /// 将之前申请的码流切换为新申请的码流,音频与切换前保持一致。 /// 新申请的码流为: /// 0:主码流 /// 1:子码流 /// public byte StreamType { get; set; } /// /// 格式分析 /// /// /// /// public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x9102 value = new JT808_0x9102(); value.ChannelNo = reader.ReadByte(); writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); value.ControlCmd = reader.ReadByte(); writer.WriteString($"[{value.ControlCmd.ReadNumber()}]控制指令", ControlCmdDisplay(value.ControlCmd)); value.CloseAVData = reader.ReadByte(); writer.WriteString($"[{value.CloseAVData.ReadNumber()}]关闭音视频类型", CloseAVDataDisplay(value.CloseAVData)); value.StreamType = reader.ReadByte(); writer.WriteString($"[{value.StreamType.ReadNumber()}]切换码流类型", value.StreamType == 0 ? "主码流" : "子码流"); string CloseAVDataDisplay(byte CloseAVData) { return CloseAVData switch { 0 => "关闭该通道有关的音视频数据", 1 => "只关闭该通道有关的音频,保留该通道有关的视频", 2 => "只关闭该通道有关的视频,保留该通道有关的音频", _ => "未知", }; } string ControlCmdDisplay(byte ControlCmd) { return ControlCmd switch { 0 => "关闭音视频传输指令", 1 => "切换码流(增加暂停和继续)", 2 => "暂停该通道所有流的发送", 3 => "恢复暂停前流的发送,与暂停前的流类型一致", 4 => "关闭双向对讲", _ => "未知", }; } string LogicalChannelNoDisplay(byte LogicalChannelNo) { return LogicalChannelNo switch { 1 => "驾驶员", 2 => "车辆正前方", 3 => "车前门", 4 => "车厢前部", 5 => "车厢后部", 7 => "行李舱", 8 => "车辆左侧", 9 => "车辆右侧", 10 => "车辆正后方", 11 => "车厢中部", 12 => "车中门", 13 => "驾驶席车门", 33 => "驾驶员", 36 => "车厢前部", 37 => "车厢后部", _ => "预留", }; } } /// /// 反序列化 /// /// /// /// public JT808_0x9102 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { var jT808_0X9102 = new JT808_0x9102(); jT808_0X9102.ChannelNo = reader.ReadByte(); jT808_0X9102.ControlCmd = reader.ReadByte(); jT808_0X9102.CloseAVData = reader.ReadByte(); jT808_0X9102.StreamType = reader.ReadByte(); return jT808_0X9102; } /// /// 序列化 /// /// /// /// public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9102 value, IJT808Config config) { writer.WriteByte(value.ChannelNo); writer.WriteByte(value.ControlCmd); writer.WriteByte(value.CloseAVData); writer.WriteByte(value.StreamType); } } }