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);
}
}
}