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 { /// /// 平台下发远程录像回放请求 /// public class JT808_0x9201 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze { public override string Description => "平台下发远程录像回放请求"; public override ushort MsgId => 0x9201; /// /// 服务器IP地址长度 /// public byte ServerIpLength { get; set; } /// /// 服务器IP地址 /// public string ServerIp { get; set; } /// /// 服务器音视频通道监听端口号TCP /// public ushort TcpPort { get; set; } /// /// 服务器音视频通道监听端口号UDP /// public ushort UdpPort { get; set; } /// /// 逻辑通道号 /// public byte LogicChannelNo { get; set; } /// /// 音视频类型 /// public byte AVItemType { get; set; } /// /// 码流类型 /// public byte StreamType { get; set; } /// /// 存储器类型 /// public byte MemType { get; set; } /// /// 回放方式 /// public byte PlayBackWay { get; set; } /// /// 快进或快退倍数 /// public byte FastForwardOrFastRewindMultiples { get; set; } /// /// 起始时间 /// public DateTime BeginTime { get; set; } /// /// 结束时间 /// public DateTime EndTime { get; set; } public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x9201 value = new JT808_0x9201(); value.ServerIpLength = reader.ReadByte(); writer.WriteNumber($"[{value.ServerIpLength.ReadNumber()}]服务器IP地址长度", value.ServerIpLength); string ipHex = reader.ReadVirtualArray(value.ServerIpLength).ToArray().ToHexString(); value.ServerIp = reader.ReadString(value.ServerIpLength); writer.WriteString($"[{ipHex}]服务器IP地址", value.ServerIp); value.TcpPort = reader.ReadUInt16(); writer.WriteNumber($"[{value.TcpPort.ReadNumber()}]服务器视频通道监听端口号(TCP)", value.TcpPort); value.UdpPort = reader.ReadUInt16(); writer.WriteNumber($"[{value.UdpPort.ReadNumber()}]服务器视频通道监听端口号(UDP)", value.UdpPort); value.LogicChannelNo = reader.ReadByte(); writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); value.AVItemType = reader.ReadByte(); writer.WriteString($"[{value.AVItemType.ReadNumber()}]音视频类型", AVItemTypeDisplay(value.AVItemType)); value.StreamType = reader.ReadByte(); writer.WriteString($"[{value.StreamType.ReadNumber()}]码流类型", StreamTypeDisplay(value.StreamType)); value.MemType = reader.ReadByte(); writer.WriteString($"[{value.MemType.ReadNumber()}]存储器类型", MemTypeDisplay(value.MemType)); value.PlayBackWay = reader.ReadByte(); writer.WriteString($"[{value.PlayBackWay.ReadNumber()}]回访方式", PlayBackWayDisplay(value.PlayBackWay)); value.FastForwardOrFastRewindMultiples = reader.ReadByte(); writer.WriteString($"[{value.FastForwardOrFastRewindMultiples.ReadNumber()}]快进或快退倍数", FastForwardOrFastRewindMultiplesDisplay(value.FastForwardOrFastRewindMultiples)); value.BeginTime = reader.ReadDateTime6(); writer.WriteString($"[{value.BeginTime.ToString("yyMMddHHmmss")}]起始时间", value.BeginTime.ToString("yyyy-MM-dd HH:mm:ss")); value.EndTime = reader.ReadDateTime6(); writer.WriteString($"[{value.EndTime.ToString("yyMMddHHmmss")}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); string AVItemTypeDisplay(byte AVItemType) { switch (AVItemType) { case 0: return "音视频"; case 1: return "音频"; case 2: return "视频"; case 3: return "音频或视频"; default: return "未知"; } } string StreamTypeDisplay(byte StreamType) { switch (StreamType) { case 0: return "主码流或子码流"; case 1: return "主码流"; case 2: return "子码流"; default: return "未知"; } } string MemTypeDisplay(byte MemType) { switch (MemType) { case 0: return "主存储器或灾备服务器"; case 1: return "主存储器"; case 2: return "灾备服务器"; default: return "未知"; } } string PlayBackWayDisplay(byte PlayBackWay) { switch (PlayBackWay) { case 0: return "正常回放"; case 1: return "快进回放"; case 2: return "关键帧快退回访"; case 3: return "关键帧播放"; case 4: return "单帧上传"; default: return "未知"; } } string FastForwardOrFastRewindMultiplesDisplay(byte FastForwardOrFastRewindMultiples) { switch (FastForwardOrFastRewindMultiples) { case 0: return "无效"; case 1: return "1倍"; case 2: return "2倍"; case 3: return "4倍"; case 4: return "8倍"; case 5: return "16倍"; default: return "未知"; } } string LogicalChannelNoDisplay(byte LogicalChannelNo) { switch (LogicalChannelNo) { case 1: return "驾驶员"; case 2: return "车辆正前方"; case 3: return "车前门"; case 4: return "车厢前部"; case 5: return "车厢后部"; case 7: return "行李舱"; case 8: return "车辆左侧"; case 9: return "车辆右侧"; case 10: return "车辆正后方"; case 11: return "车厢中部"; case 12: return "车中门"; case 13: return "驾驶席车门"; case 33: return "驾驶员"; case 36: return "车厢前部"; case 37: return "车厢后部"; default: return "预留"; } } } public JT808_0x9201 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x9201 jT808_0x9201 = new JT808_0x9201(); jT808_0x9201.ServerIpLength = reader.ReadByte(); jT808_0x9201.ServerIp = reader.ReadString(jT808_0x9201.ServerIpLength); jT808_0x9201.TcpPort = reader.ReadUInt16(); jT808_0x9201.UdpPort = reader.ReadUInt16(); jT808_0x9201.LogicChannelNo = reader.ReadByte(); jT808_0x9201.AVItemType = reader.ReadByte(); jT808_0x9201.StreamType = reader.ReadByte(); jT808_0x9201.MemType = reader.ReadByte(); jT808_0x9201.PlayBackWay = reader.ReadByte(); jT808_0x9201.FastForwardOrFastRewindMultiples = reader.ReadByte(); jT808_0x9201.BeginTime = reader.ReadDateTime6(); jT808_0x9201.EndTime = reader.ReadDateTime6(); return jT808_0x9201; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9201 value, IJT808Config config) { writer.Skip(1, out int position); writer.WriteString(value.ServerIp); writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - position - 1), position);//计算完字符串后,回写字符串长度 writer.WriteUInt16(value.TcpPort); writer.WriteUInt16(value.UdpPort); writer.WriteByte(value.LogicChannelNo); writer.WriteByte(value.AVItemType); writer.WriteByte(value.StreamType); writer.WriteByte(value.MemType); writer.WriteByte(value.PlayBackWay); writer.WriteByte(value.FastForwardOrFastRewindMultiples); writer.WriteDateTime6(value.BeginTime); writer.WriteDateTime6(value.EndTime); } } }