@@ -27,10 +27,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test1() | |||
{ | |||
JT808_0x9101 jT808_0X9101 = new JT808_0x9101(); | |||
jT808_0X9101.ServerIPAddress = "127.0.0.1"; | |||
jT808_0X9101.ServerVideoChannelTcpPort = 1888; | |||
jT808_0X9101.ServerVideoChannelUdpPort = 0; | |||
jT808_0X9101.LogicalChannelNo= 1; | |||
jT808_0X9101.ServerIp = "127.0.0.1"; | |||
jT808_0X9101.TcpPort = 1888; | |||
jT808_0X9101.UdpPort = 0; | |||
jT808_0X9101.ChannelNo= 1; | |||
jT808_0X9101.DataType= 1; | |||
jT808_0X9101.StreamType= 1; | |||
var hex = JT808Serializer.Serialize(jT808_0X9101).ToHexString(); | |||
@@ -41,11 +41,11 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
JT808_0x9101 jT808_0X9101= JT808Serializer.Deserialize<JT808_0x9101>("093132372E302E302E3107600000010101".ToHexBytes()); | |||
Assert.Equal("127.0.0.1", jT808_0X9101.ServerIPAddress); | |||
Assert.Equal(9, jT808_0X9101.ServerIPAddressLength); | |||
Assert.Equal(1888, jT808_0X9101.ServerVideoChannelTcpPort); | |||
Assert.Equal(0, jT808_0X9101.ServerVideoChannelUdpPort); | |||
Assert.Equal(1, jT808_0X9101.LogicalChannelNo); | |||
Assert.Equal("127.0.0.1", jT808_0X9101.ServerIp); | |||
Assert.Equal(9, jT808_0X9101.ServerIpLength); | |||
Assert.Equal(1888, jT808_0X9101.TcpPort); | |||
Assert.Equal(0, jT808_0X9101.UdpPort); | |||
Assert.Equal(1, jT808_0X9101.ChannelNo); | |||
Assert.Equal(1, jT808_0X9101.DataType); | |||
Assert.Equal(1, jT808_0X9101.StreamType); | |||
} | |||
@@ -60,10 +60,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
header.TerminalPhoneNo = "12345679810"; | |||
jT808Package.Header = header; | |||
JT808_0x9101 jT808_0X9101 = new JT808_0x9101(); | |||
jT808_0X9101.ServerIPAddress = "127.0.0.1"; | |||
jT808_0X9101.ServerVideoChannelTcpPort = 1888; | |||
jT808_0X9101.ServerVideoChannelUdpPort = 0; | |||
jT808_0X9101.LogicalChannelNo = 1; | |||
jT808_0X9101.ServerIp = "127.0.0.1"; | |||
jT808_0X9101.TcpPort = 1888; | |||
jT808_0X9101.UdpPort = 0; | |||
jT808_0X9101.ChannelNo = 1; | |||
jT808_0X9101.DataType = 1; | |||
jT808_0X9101.StreamType = 1; | |||
jT808Package.Bodies = jT808_0X9101; | |||
@@ -88,10 +88,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
header.TerminalPhoneNo = ""; | |||
jT808Package.Header = header; | |||
JT808_0x9101 jT808_0X9101 = new JT808_0x9101(); | |||
jT808_0X9101.ServerIPAddress = ""; | |||
jT808_0X9101.ServerVideoChannelTcpPort = 1078; | |||
jT808_0X9101.ServerVideoChannelUdpPort = 0; | |||
jT808_0X9101.LogicalChannelNo = 3; | |||
jT808_0X9101.ServerIp = ""; | |||
jT808_0X9101.TcpPort = 1078; | |||
jT808_0X9101.UdpPort = 0; | |||
jT808_0X9101.ChannelNo = 3; | |||
jT808_0X9101.DataType = 1; | |||
jT808_0X9101.StreamType = 1; | |||
jT808Package.Bodies = jT808_0X9101; | |||
@@ -27,10 +27,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test1() | |||
{ | |||
JT808_0x9102 jT808_0X9102 = new JT808_0x9102(); | |||
jT808_0X9102.LogicalChannelNo = 1; | |||
jT808_0X9102.ChannelNo = 1; | |||
jT808_0X9102.ControlCmd = 1; | |||
jT808_0X9102.CloseAVData = 0; | |||
jT808_0X9102.SwitchStreamType = 0; | |||
jT808_0X9102.StreamType = 0; | |||
var hex = JT808Serializer.Serialize(jT808_0X9102).ToHexString(); | |||
Assert.Equal("01010000", hex); | |||
} | |||
@@ -39,10 +39,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
JT808_0x9102 jT808_0X9102 = JT808Serializer.Deserialize<JT808_0x9102>("01010000".ToHexBytes()); | |||
Assert.Equal(1, jT808_0X9102.LogicalChannelNo); | |||
Assert.Equal(1, jT808_0X9102.ChannelNo); | |||
Assert.Equal(1, jT808_0X9102.ControlCmd); | |||
Assert.Equal(0, jT808_0X9102.CloseAVData); | |||
Assert.Equal(0, jT808_0X9102.SwitchStreamType); | |||
Assert.Equal(0, jT808_0X9102.StreamType); | |||
} | |||
[Fact] | |||
@@ -55,10 +55,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
header.TerminalPhoneNo = "12345679810"; | |||
jT808Package.Header = header; | |||
JT808_0x9102 jT808_0X9102 = new JT808_0x9102(); | |||
jT808_0X9102.LogicalChannelNo = 1; | |||
jT808_0X9102.ChannelNo = 1; | |||
jT808_0X9102.ControlCmd = 1; | |||
jT808_0X9102.CloseAVData = 0; | |||
jT808_0X9102.SwitchStreamType = 0; | |||
jT808_0X9102.StreamType = 0; | |||
jT808Package.Bodies = jT808_0X9102; | |||
var hex = JT808Serializer.Serialize(jT808Package).ToHexString(); | |||
//7E910200040123456798100001010100001E7E | |||
@@ -39,7 +39,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9105 jT808_0x9105 = new JT808_0x9105() | |||
{ | |||
LogicChannelNo=1, | |||
ChannelNo=1, | |||
DropRate=2 | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808_0x9105).ToHexString(); | |||
@@ -50,7 +50,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
var jT808_0x9105 = JT808Serializer.Deserialize<JT808_0x9105>("0102".ToHexBytes()); | |||
Assert.Equal(1, jT808_0x9105.LogicChannelNo); | |||
Assert.Equal(1, jT808_0x9105.ChannelNo); | |||
Assert.Equal(2, jT808_0x9105.DropRate); | |||
} | |||
[Fact] | |||
@@ -39,13 +39,13 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9201 jT808_0x9201 = new JT808_0x9201() | |||
{ | |||
LogicChannelNo = 1, | |||
AVItemType = 2, | |||
ChannelNo = 1, | |||
MediaType = 2, | |||
BeginTime = Convert.ToDateTime("2019-07-16 10:10:10"), | |||
EndTime = Convert.ToDateTime("2019-07-16 10:10:10"), | |||
FastForwardOrFastRewindMultiples=3, | |||
MemType=5, | |||
PlayBackWay=6, | |||
PlaySpeed=3, | |||
MemoryType=5, | |||
PlaybackWay=6, | |||
ServerIp="127.0.0.1", | |||
ServerIpLength=9, | |||
StreamType=7, | |||
@@ -60,13 +60,13 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
var jT808_0x9201 = JT808Serializer.Deserialize<JT808_0x9201>("093132372E302E302E3100501F90010207050603190716101010190716101010".ToHexBytes()); | |||
Assert.Equal(1, jT808_0x9201.LogicChannelNo); | |||
Assert.Equal(2, jT808_0x9201.AVItemType); | |||
Assert.Equal(1, jT808_0x9201.ChannelNo); | |||
Assert.Equal(2, jT808_0x9201.MediaType); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:10"), jT808_0x9201.BeginTime); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:10"), jT808_0x9201.EndTime); | |||
Assert.Equal(3, jT808_0x9201.FastForwardOrFastRewindMultiples); | |||
Assert.Equal(5, jT808_0x9201.MemType); | |||
Assert.Equal(6, jT808_0x9201.PlayBackWay); | |||
Assert.Equal(3, jT808_0x9201.PlaySpeed); | |||
Assert.Equal(5, jT808_0x9201.MemoryType); | |||
Assert.Equal(6, jT808_0x9201.PlaybackWay); | |||
Assert.Equal("127.0.0.1", jT808_0x9201.ServerIp); | |||
Assert.Equal(9, jT808_0x9201.ServerIpLength); | |||
Assert.Equal(7, jT808_0x9201.StreamType); | |||
@@ -39,10 +39,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9202 jT808_0x9202 = new JT808_0x9202() | |||
{ | |||
AVChannelNo=1, | |||
DragPlaybackPosition=Convert.ToDateTime("2019-07-16 10:10:10"), | |||
FastForwardOrFastRewindMultiples=2, | |||
PlayBackControl=3 | |||
ChannelNo=1, | |||
DragPlayPosition=Convert.ToDateTime("2019-07-16 10:10:10"), | |||
PlaySpeed=2, | |||
PlayControl=3 | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808_0x9202).ToHexString(); | |||
Assert.Equal("010302190716101010", hex); | |||
@@ -52,10 +52,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
var jT808_0x9202 = JT808Serializer.Deserialize<JT808_0x9202>("010302190716101010".ToHexBytes()); | |||
Assert.Equal(1, jT808_0x9202.AVChannelNo); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:10"), jT808_0x9202.DragPlaybackPosition); | |||
Assert.Equal(2, jT808_0x9202.FastForwardOrFastRewindMultiples); | |||
Assert.Equal(3, jT808_0x9202.PlayBackControl); | |||
Assert.Equal(1, jT808_0x9202.ChannelNo); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:10"), jT808_0x9202.DragPlayPosition); | |||
Assert.Equal(2, jT808_0x9202.PlaySpeed); | |||
Assert.Equal(3, jT808_0x9202.PlayControl); | |||
} | |||
[Fact] | |||
public void Test3() | |||
@@ -40,10 +40,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
JT808_0x9205 jT808_0x9205 = new JT808_0x9205() | |||
{ | |||
AlarmFlag=1, | |||
AVResourceType=2, | |||
MediaType=2, | |||
BeginTime= Convert.ToDateTime("2019-07-16 10:10:10"), | |||
EndTime= Convert.ToDateTime("2019-07-16 10:10:11"), | |||
LogicChannelNo=3, | |||
ChannelNo=3, | |||
MemoryType=4, | |||
StreamType =5 | |||
}; | |||
@@ -56,10 +56,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
var jT808_0x9205 = JT808Serializer.Deserialize<JT808_0x9205>("031907161010101907161010110000000000000001020504".ToHexBytes()); | |||
Assert.Equal(1u, jT808_0x9205.AlarmFlag); | |||
Assert.Equal(2, jT808_0x9205.AVResourceType); | |||
Assert.Equal(2, jT808_0x9205.MediaType); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:10"), jT808_0x9205.BeginTime); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:11"), jT808_0x9205.EndTime); | |||
Assert.Equal(3, jT808_0x9205.LogicChannelNo); | |||
Assert.Equal(3, jT808_0x9205.ChannelNo); | |||
Assert.Equal(4, jT808_0x9205.MemoryType); | |||
Assert.Equal(5, jT808_0x9205.StreamType); | |||
} | |||
@@ -40,10 +40,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
JT808_0x9206 jT808_0x9206 = new JT808_0x9206() | |||
{ | |||
AlarmFlag=1, | |||
AVResourceType=2, | |||
MediaType=2, | |||
BeginTime= Convert.ToDateTime("2019-07-16 10:10:10"), | |||
EndTime= Convert.ToDateTime("2019-07-16 10:10:11"), | |||
LogicChannelNo=3, | |||
ChannelNo=3, | |||
StreamType =5, | |||
FileUploadPath ="D://1112", | |||
FileUploadPathLength=8, | |||
@@ -66,10 +66,10 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
var jT808_0x9206 = JT808Serializer.Deserialize<JT808_0x9206>("093132372E302E302E31032802746B0631323334353608443A2F2F31313132031907161010101907161010110000000102050407".ToHexBytes()); | |||
Assert.Equal(1u, jT808_0x9206.AlarmFlag); | |||
Assert.Equal(2, jT808_0x9206.AVResourceType); | |||
Assert.Equal(2, jT808_0x9206.MediaType); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:10"), jT808_0x9206.BeginTime); | |||
Assert.Equal(Convert.ToDateTime("2019-07-16 10:10:11"), jT808_0x9206.EndTime); | |||
Assert.Equal(3, jT808_0x9206.LogicChannelNo); | |||
Assert.Equal(3, jT808_0x9206.ChannelNo); | |||
Assert.Equal(5, jT808_0x9206.StreamType); | |||
Assert.Equal("D://1112", jT808_0x9206.FileUploadPath); | |||
Assert.Equal(8, jT808_0x9206.FileUploadPathLength); | |||
@@ -39,7 +39,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9301 jT808_0x9301 = new JT808_0x9301() | |||
{ | |||
LogicChannelNo=1, | |||
ChannelNo=1, | |||
Speed=2, | |||
Direction=3 | |||
}; | |||
@@ -51,7 +51,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
var jT808_0x9301 = JT808Serializer.Deserialize<JT808_0x9301>("010302".ToHexBytes()); | |||
Assert.Equal(1, jT808_0x9301.LogicChannelNo); | |||
Assert.Equal(1, jT808_0x9301.ChannelNo); | |||
Assert.Equal(2, jT808_0x9301.Speed); | |||
Assert.Equal(3, jT808_0x9301.Direction); | |||
} | |||
@@ -39,7 +39,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9303 jT808_0x9303 = new JT808_0x9303() | |||
{ | |||
LogicChannelNo=1, | |||
ChannelNo=1, | |||
IrisAdjustment=2 | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808_0x9303).ToHexString(); | |||
@@ -50,7 +50,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
var jT808_0x9303 = JT808Serializer.Deserialize<JT808_0x9303>("0102".ToHexBytes()); | |||
Assert.Equal(1, jT808_0x9303.LogicChannelNo); | |||
Assert.Equal(1, jT808_0x9303.ChannelNo); | |||
Assert.Equal(2, jT808_0x9303.IrisAdjustment); | |||
} | |||
[Fact] | |||
@@ -39,7 +39,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9304 jT808_0x9304 = new JT808_0x9304() | |||
{ | |||
LogicChannelNo=1, | |||
ChannelNo=1, | |||
StartOrStop=2 | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808_0x9304).ToHexString(); | |||
@@ -50,7 +50,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
var jT808_0x9304 = JT808Serializer.Deserialize<JT808_0x9304>("0102".ToHexBytes()); | |||
Assert.Equal(1, jT808_0x9304.LogicChannelNo); | |||
Assert.Equal(1, jT808_0x9304.ChannelNo); | |||
Assert.Equal(2, jT808_0x9304.StartOrStop); | |||
} | |||
[Fact] | |||
@@ -39,7 +39,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9305 jT808_0x9305 = new JT808_0x9305() | |||
{ | |||
LogicChannelNo=1, | |||
ChannelNo=1, | |||
StartOrStop=2 | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808_0x9305).ToHexString(); | |||
@@ -39,7 +39,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
{ | |||
JT808_0x9306 jT808_0x9306 = new JT808_0x9306() | |||
{ | |||
LogicChannelNo=1, | |||
ChannelNo=1, | |||
ChangeMultipleControl=2 | |||
}; | |||
var hex = JT808Serializer.Serialize(jT808_0x9306).ToHexString(); | |||
@@ -50,7 +50,7 @@ namespace JT808.Protocol.Extensions.JT1078.Test | |||
public void Test2() | |||
{ | |||
var jT808_0x9306 = JT808Serializer.Deserialize<JT808_0x9306>("0102".ToHexBytes()); | |||
Assert.Equal(1, jT808_0x9306.LogicChannelNo); | |||
Assert.Equal(1, jT808_0x9306.ChannelNo); | |||
Assert.Equal(2, jT808_0x9306.ChangeMultipleControl); | |||
} | |||
[Fact] | |||
@@ -1,10 +1,8 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT808.Protocol.Extensions.JT1078.Enums | |||
namespace JT808.Protocol.Extensions.JT1078.Enums | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public enum JT808_JT1078_MsgId:ushort | |||
{ | |||
终端上传音视频属性 = 0x1003, | |||
终端上传乘客流量 = 0x1005, | |||
@@ -26,4 +24,5 @@ namespace JT808.Protocol.Extensions.JT1078.Enums | |||
红外补光控制 = 0x9305, | |||
云台变倍控制 = 0x9306 | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} |
@@ -1,10 +1,9 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace JT808.Protocol.Extensions.JT1078.Enums | |||
{ | |||
[Flags] | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public enum VideoRelateAlarmType:uint | |||
{ | |||
视频信号丢失报警=0, | |||
@@ -15,4 +14,5 @@ namespace JT808.Protocol.Extensions.JT1078.Enums | |||
异常驾驶行为报警=32, | |||
特殊报警录像达到存储阈值报警=64, | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} |
@@ -9,8 +9,11 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9003:JT808Bodies | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "查询终端音视频属性"; | |||
public override ushort MsgId => 0x9003; | |||
public override bool SkipSerialization { get; set; } = true; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -9,32 +9,35 @@ using System.Text.Json; | |||
namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
{ | |||
/// <summary> | |||
/// 实时音视频传输请求 | |||
/// 实时音视频传输请求(live、talk、listen、fanout、passThrough直播、对讲、监听、广播、透传请求) | |||
/// </summary> | |||
public class JT808_0x9101: JT808Bodies, IJT808MessagePackFormatter<JT808_0x9101>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "实时音视频传输请求"; | |||
public override ushort MsgId => 0x9101; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 服务器IP地址长度 | |||
/// 视频服务器IP地址长度 | |||
/// </summary> | |||
public byte ServerIPAddressLength { get; set; } | |||
public byte ServerIpLength { get;internal set; } | |||
/// <summary> | |||
/// 服务器IP地址 | |||
/// 视频服务器IP地址 | |||
/// </summary> | |||
public string ServerIPAddress { get; set; } | |||
public string ServerIp { get; set; } | |||
/// <summary> | |||
/// 服务器视频通道监听端口号(TCP) | |||
/// 视频服务器TCP端口号,不使用TCP协议传输时保持默认值0即可(TCP和UDP二选一,当TCP和UDP均非默认值时一般以TCP为准) | |||
/// </summary> | |||
public ushort ServerVideoChannelTcpPort { get; set; } | |||
public ushort TcpPort { get; set; } | |||
/// <summary> | |||
/// 服务器视频通道监听端口号(UDP) | |||
/// 视频服务器UDP端口号,不使用UDP协议传输时保持默认值0即可(TCP和UDP二选一,当TCP和UDP均非默认值时一般以TCP为准) | |||
/// </summary> | |||
public ushort ServerVideoChannelUdpPort { get; set; } | |||
public ushort UdpPort { get; set; } | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicalChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 数据类型 | |||
/// 0:音视频 | |||
@@ -52,105 +55,98 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public byte StreamType { get; set; } | |||
/// <summary> | |||
/// 格式分析 | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="writer"></param> | |||
/// <param name="config"></param> | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9101 value = new JT808_0x9101(); | |||
value.ServerIPAddressLength = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.ServerIPAddressLength.ReadNumber()}]服务器IP地址长度", value.ServerIPAddressLength); | |||
string ipHex = reader.ReadVirtualArray(value.ServerIPAddressLength).ToArray().ToHexString(); | |||
value.ServerIPAddress = reader.ReadString(value.ServerIPAddressLength); | |||
writer.WriteString($"[{ipHex}]服务器IP地址", value.ServerIPAddress); | |||
value.ServerVideoChannelTcpPort = reader.ReadUInt16(); | |||
writer.WriteNumber($"[{value.ServerVideoChannelTcpPort.ReadNumber()}]服务器视频通道监听端口号(TCP)", value.ServerVideoChannelTcpPort); | |||
value.ServerVideoChannelUdpPort = reader.ReadUInt16(); | |||
writer.WriteNumber($"[{value.ServerVideoChannelUdpPort.ReadNumber()}]服务器视频通道监听端口号(UDP)", value.ServerVideoChannelUdpPort); | |||
value.LogicalChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicalChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicalChannelNo)); | |||
var value = new JT808_0x9101(); | |||
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.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.DataType = reader.ReadByte(); | |||
writer.WriteString($"[{value.DataType.ReadNumber()}]数据类型", DataTypeDisplay(value.DataType)); | |||
value.StreamType = reader.ReadByte(); | |||
writer.WriteString($"[{value.StreamType.ReadNumber()}]码流类型", value.StreamType==0?"主码流":"子码流"); | |||
string DataTypeDisplay(byte DataType) { | |||
switch (DataType) | |||
return DataType switch | |||
{ | |||
case 0: | |||
return "音视频"; | |||
case 1: | |||
return "视频"; | |||
case 2: | |||
return "双向对讲"; | |||
case 3: | |||
return "监听"; | |||
case 4: | |||
return "中心广播"; | |||
case 5: | |||
return "透传"; | |||
default: | |||
break; | |||
} | |||
return "未知"; | |||
0 => "音视频", | |||
1 => "视频", | |||
2 => "双向对讲", | |||
3 => "监听", | |||
4 => "中心广播", | |||
5 => "透传", | |||
_ => "未知", | |||
}; | |||
} | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) { | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
/// <summary> | |||
/// 反序列化 | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="config"></param> | |||
/// <returns></returns> | |||
public JT808_0x9101 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9101 jT808_0X9101 = new JT808_0x9101(); | |||
jT808_0X9101.ServerIPAddressLength = reader.ReadByte(); | |||
jT808_0X9101.ServerIPAddress = reader.ReadString(jT808_0X9101.ServerIPAddressLength); | |||
jT808_0X9101.ServerVideoChannelTcpPort = reader.ReadUInt16(); | |||
jT808_0X9101.ServerVideoChannelUdpPort = reader.ReadUInt16(); | |||
jT808_0X9101.LogicalChannelNo = reader.ReadByte(); | |||
jT808_0X9101.DataType = reader.ReadByte(); | |||
jT808_0X9101.StreamType = reader.ReadByte(); | |||
return jT808_0X9101; | |||
var jT808_0x9101 = new JT808_0x9101(); | |||
jT808_0x9101.ServerIpLength = reader.ReadByte(); | |||
jT808_0x9101.ServerIp = reader.ReadString(jT808_0x9101.ServerIpLength); | |||
jT808_0x9101.TcpPort = reader.ReadUInt16(); | |||
jT808_0x9101.UdpPort = reader.ReadUInt16(); | |||
jT808_0x9101.ChannelNo = reader.ReadByte(); | |||
jT808_0x9101.DataType = reader.ReadByte(); | |||
jT808_0x9101.StreamType = reader.ReadByte(); | |||
return jT808_0x9101; | |||
} | |||
/// <summary> | |||
/// 序列化 | |||
/// </summary> | |||
/// <param name="writer"></param> | |||
/// <param name="value"></param> | |||
/// <param name="config"></param> | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9101 value, IJT808Config config) | |||
{ | |||
writer.Skip(1, out int position); | |||
writer.WriteString(value.ServerIPAddress); | |||
writer.WriteString(value.ServerIp); | |||
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - position - 1), position); | |||
writer.WriteUInt16(value.ServerVideoChannelTcpPort); | |||
writer.WriteUInt16(value.ServerVideoChannelUdpPort); | |||
writer.WriteByte(value.LogicalChannelNo); | |||
writer.WriteUInt16(value.TcpPort); | |||
writer.WriteUInt16(value.UdpPort); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.DataType); | |||
writer.WriteByte(value.StreamType); | |||
} | |||
@@ -9,16 +9,18 @@ using System.Text.Json; | |||
namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
{ | |||
/// <summary> | |||
/// 音视频实时传输控制 | |||
/// 音视频实时传输控制(LiveControl直播控制) | |||
/// </summary> | |||
public class JT808_0x9102: JT808Bodies, IJT808MessagePackFormatter<JT808_0x9102>, IJT808Analyze | |||
public class JT808_0x9102 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9102>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "音视频实时传输控制"; | |||
public override ushort MsgId => 0x9102; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicalChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 控制指令 | |||
/// 平台可以通过该指令对设备的实时音视频进行控制: | |||
@@ -43,106 +45,98 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// 0:主码流 | |||
/// 1:子码流 | |||
/// </summary> | |||
public byte SwitchStreamType { get; set; } | |||
public byte StreamType { get; set; } | |||
/// <summary> | |||
/// 格式分析 | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="writer"></param> | |||
/// <param name="config"></param> | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9102 value = new JT808_0x9102(); | |||
value.LogicalChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicalChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicalChannelNo)); | |||
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.SwitchStreamType = reader.ReadByte(); | |||
writer.WriteString($"[{value.SwitchStreamType.ReadNumber()}]切换码流类型", value.SwitchStreamType==0?"主码流":"子码流"); | |||
value.StreamType = reader.ReadByte(); | |||
writer.WriteString($"[{value.StreamType.ReadNumber()}]切换码流类型", value.StreamType == 0 ? "主码流" : "子码流"); | |||
string CloseAVDataDisplay(byte CloseAVData) { | |||
switch (CloseAVData) | |||
string CloseAVDataDisplay(byte CloseAVData) | |||
{ | |||
return CloseAVData switch | |||
{ | |||
case 0: | |||
return "关闭该通道有关的音视频数据"; | |||
case 1: | |||
return "只关闭该通道有关的音频,保留该通道有关的视频"; | |||
case 2: | |||
return "只关闭该通道有关的视频,保留该通道有关的音频"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "关闭该通道有关的音视频数据", | |||
1 => "只关闭该通道有关的音频,保留该通道有关的视频", | |||
2 => "只关闭该通道有关的视频,保留该通道有关的音频", | |||
_ => "未知", | |||
}; | |||
} | |||
string ControlCmdDisplay(byte ControlCmd) { | |||
switch (ControlCmd) | |||
string ControlCmdDisplay(byte ControlCmd) | |||
{ | |||
return ControlCmd switch | |||
{ | |||
case 0: | |||
return "关闭音视频传输指令"; | |||
case 1: | |||
return "切换码流(增加暂停和继续)"; | |||
case 2: | |||
return "暂停该通道所有流的发送"; | |||
case 3: | |||
return "恢复暂停前流的发送,与暂停前的流类型一致"; | |||
case 4: | |||
return "关闭双向对讲"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "关闭音视频传输指令", | |||
1 => "切换码流(增加暂停和继续)", | |||
2 => "暂停该通道所有流的发送", | |||
3 => "恢复暂停前流的发送,与暂停前的流类型一致", | |||
4 => "关闭双向对讲", | |||
_ => "未知", | |||
}; | |||
} | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
/// <summary> | |||
/// 反序列化 | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="config"></param> | |||
/// <returns></returns> | |||
public JT808_0x9102 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9102 jT808_0X9102 = new JT808_0x9102(); | |||
jT808_0X9102.LogicalChannelNo = reader.ReadByte(); | |||
var jT808_0X9102 = new JT808_0x9102(); | |||
jT808_0X9102.ChannelNo = reader.ReadByte(); | |||
jT808_0X9102.ControlCmd = reader.ReadByte(); | |||
jT808_0X9102.CloseAVData = reader.ReadByte(); | |||
jT808_0X9102.SwitchStreamType = reader.ReadByte(); | |||
jT808_0X9102.StreamType = reader.ReadByte(); | |||
return jT808_0X9102; | |||
} | |||
/// <summary> | |||
/// 序列化 | |||
/// </summary> | |||
/// <param name="writer"></param> | |||
/// <param name="value"></param> | |||
/// <param name="config"></param> | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9102 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicalChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.ControlCmd); | |||
writer.WriteByte(value.CloseAVData); | |||
writer.WriteByte(value.SwitchStreamType); | |||
writer.WriteByte(value.StreamType); | |||
} | |||
} | |||
} |
@@ -13,75 +13,79 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9105 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9105>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "实时音视频传输状态通知"; | |||
public override ushort MsgId => 0x9105; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 丢包率 | |||
/// 丢包率 | |||
/// 当前传输通道的丢包率,数值乘以100之后取整部分 | |||
/// </summary> | |||
public byte DropRate { get; set; } | |||
public byte DropRate { get; set; } | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="writer"></param> | |||
/// <param name="config"></param> | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9105 value = new JT808_0x9105(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.DropRate = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.DropRate.ReadNumber()}]丢包率", value.DropRate); | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="config"></param> | |||
/// <returns></returns> | |||
public JT808_0x9105 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9105 jT808_0x9105 = new JT808_0x9105(); | |||
jT808_0x9105.LogicChannelNo = reader.ReadByte(); | |||
jT808_0x9105.ChannelNo = reader.ReadByte(); | |||
jT808_0x9105.DropRate = reader.ReadByte(); | |||
return jT808_0x9105; | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="writer"></param> | |||
/// <param name="value"></param> | |||
/// <param name="config"></param> | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9105 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.DropRate); | |||
} | |||
} | |||
@@ -9,12 +9,14 @@ using System.Text.Json; | |||
namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
{ | |||
/// <summary> | |||
/// 平台下发远程录像回放请求 | |||
/// 平台下发远程录像回放请求(vod点播请求) | |||
/// </summary> | |||
public class JT808_0x9201 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9201>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "平台下发远程录像回放请求"; | |||
public override ushort MsgId => 0x9201; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 服务器IP地址长度 | |||
/// </summary> | |||
@@ -24,49 +26,77 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public string ServerIp { get; set; } | |||
/// <summary> | |||
/// 服务器音视频通道监听端口号TCP | |||
/// 视频服务器TCP端口号,不使用TCP协议传输时保持默认值0即可(TCP和UDP二选一,当TCP和UDP均非默认值时一般以TCP为准) | |||
/// </summary> | |||
public ushort TcpPort { get; set; } | |||
/// <summary> | |||
/// 服务器音视频通道监听端口号UDP | |||
/// 视频服务器UDP端口号,不使用UDP协议传输时保持默认值0即可(TCP和UDP二选一,当TCP和UDP均非默认值时一般以TCP为准) | |||
/// </summary> | |||
public ushort UdpPort { get; set; } | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 音视频类型 | |||
/// 音视频类型(媒体类型) | |||
/// 0:audio and video | |||
/// 1:audio | |||
/// 2:video | |||
/// 3:audio or video | |||
/// </summary> | |||
public byte AVItemType { get; set; } | |||
public byte MediaType { get; set; } | |||
/// <summary> | |||
/// 码流类型 | |||
/// 0:主或子码流 | |||
/// 1:主 | |||
/// 2:子 | |||
/// 如果此通道只传输音频,置为0 | |||
/// </summary> | |||
public byte StreamType { get; set; } | |||
/// <summary> | |||
/// 存储器类型 | |||
/// 0:主或灾备存储器 | |||
/// 1:主存储器 | |||
/// 2:灾备存储器 | |||
/// </summary> | |||
public byte MemType { get; set; } | |||
public byte MemoryType { get; set; } | |||
/// <summary> | |||
/// 回放方式 | |||
/// 0:正常 | |||
/// 1:快进 | |||
/// 2:关键帧快退回放 | |||
/// 3:关键帧播放 | |||
/// 4:单帧上传 | |||
/// </summary> | |||
public byte PlayBackWay { get; set; } | |||
public byte PlaybackWay { get; set; } | |||
/// <summary> | |||
/// 快进或快退倍数 | |||
/// 快进或快退倍数,当<see cref="PlaybackWay"/>为1和2时,此字段有效,否则置0 | |||
/// 0:无效 | |||
/// 1:1倍 | |||
/// 2:2倍 | |||
/// 3:4倍 | |||
/// 4:8倍 | |||
/// 5:16倍 | |||
/// </summary> | |||
public byte FastForwardOrFastRewindMultiples { get; set; } | |||
public byte PlaySpeed { get; set; } | |||
/// <summary> | |||
/// 起始时间 | |||
/// 开始时间,当<see cref="PlaybackWay"/>为4时,该字段表示单帧上传时间 | |||
/// </summary> | |||
public DateTime BeginTime { get; set; } | |||
/// <summary> | |||
/// 结束时间 | |||
/// 结束时间,当<see cref="PlaybackWay"/>为4时,该字段无效 | |||
/// </summary> | |||
public DateTime EndTime { get; set; } | |||
/// <summary> | |||
/// 格式分析 | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="writer"></param> | |||
/// <param name="config"></param> | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9201 value = new JT808_0x9201(); | |||
var value = new JT808_0x9201(); | |||
value.ServerIpLength = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.ServerIpLength.ReadNumber()}]服务器IP地址长度", value.ServerIpLength); | |||
string ipHex = reader.ReadVirtualArray(value.ServerIpLength).ToArray().ToHexString(); | |||
@@ -76,144 +106,107 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
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.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.MediaType = reader.ReadByte(); | |||
writer.WriteString($"[{value.MediaType.ReadNumber()}]音视频类型", AVItemTypeDisplay(value.MediaType)); | |||
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.MemoryType = reader.ReadByte(); | |||
writer.WriteString($"[{value.MemoryType.ReadNumber()}]存储器类型", MemTypeDisplay(value.MemoryType)); | |||
value.PlaybackWay = reader.ReadByte(); | |||
writer.WriteString($"[{value.PlaybackWay.ReadNumber()}]回访方式", PlayBackWayDisplay(value.PlaybackWay)); | |||
value.PlaySpeed = reader.ReadByte(); | |||
writer.WriteString($"[{value.PlaySpeed.ReadNumber()}]快进或快退倍数", FastForwardOrFastRewindMultiplesDisplay(value.PlaySpeed)); | |||
value.BeginTime = reader.ReadDateTime6(); | |||
writer.WriteString($"[{value.BeginTime.ToString("yyMMddHHmmss")}]起始时间", value.BeginTime.ToString("yyyy-MM-dd HH:mm:ss")); | |||
writer.WriteString($"[{value.BeginTime: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) | |||
writer.WriteString($"[{value.EndTime:yyMMddHHmmss}]结束时间", value.EndTime.ToString("yyyy-MM-dd HH:mm:ss")); | |||
static string AVItemTypeDisplay(byte AVItemType) | |||
{ | |||
switch (AVItemType) | |||
return AVItemType switch | |||
{ | |||
case 0: | |||
return "音视频"; | |||
case 1: | |||
return "音频"; | |||
case 2: | |||
return "视频"; | |||
case 3: | |||
return "音频或视频"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "音视频", | |||
1 => "音频", | |||
2 => "视频", | |||
3 => "音频或视频", | |||
_ => "未知", | |||
}; | |||
} | |||
string StreamTypeDisplay(byte StreamType) | |||
static string StreamTypeDisplay(byte StreamType) | |||
{ | |||
switch (StreamType) | |||
return StreamType switch | |||
{ | |||
case 0: | |||
return "主码流或子码流"; | |||
case 1: | |||
return "主码流"; | |||
case 2: | |||
return "子码流"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "主码流或子码流", | |||
1 => "主码流", | |||
2 => "子码流", | |||
_ => "未知", | |||
}; | |||
} | |||
string MemTypeDisplay(byte MemType) | |||
static string MemTypeDisplay(byte MemType) | |||
{ | |||
switch (MemType) | |||
return MemType switch | |||
{ | |||
case 0: | |||
return "主存储器或灾备服务器"; | |||
case 1: | |||
return "主存储器"; | |||
case 2: | |||
return "灾备服务器"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "主存储器或灾备服务器", | |||
1 => "主存储器", | |||
2 => "灾备服务器", | |||
_ => "未知", | |||
}; | |||
} | |||
string PlayBackWayDisplay(byte PlayBackWay) | |||
static string PlayBackWayDisplay(byte PlayBackWay) | |||
{ | |||
switch (PlayBackWay) | |||
return PlayBackWay switch | |||
{ | |||
case 0: | |||
return "正常回放"; | |||
case 1: | |||
return "快进回放"; | |||
case 2: | |||
return "关键帧快退回访"; | |||
case 3: | |||
return "关键帧播放"; | |||
case 4: | |||
return "单帧上传"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "正常回放", | |||
1 => "快进回放", | |||
2 => "关键帧快退回访", | |||
3 => "关键帧播放", | |||
4 => "单帧上传", | |||
_ => "未知", | |||
}; | |||
} | |||
string FastForwardOrFastRewindMultiplesDisplay(byte FastForwardOrFastRewindMultiples) | |||
static string FastForwardOrFastRewindMultiplesDisplay(byte FastForwardOrFastRewindMultiples) | |||
{ | |||
switch (FastForwardOrFastRewindMultiples) | |||
return FastForwardOrFastRewindMultiples switch | |||
{ | |||
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 "未知"; | |||
} | |||
0 => "无效", | |||
1 => "1倍", | |||
2 => "2倍", | |||
3 => "4倍", | |||
4 => "8倍", | |||
5 => "16倍", | |||
_ => "未知", | |||
}; | |||
} | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
/// <summary> | |||
/// 反序列化 | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="config"></param> | |||
/// <returns></returns> | |||
public JT808_0x9201 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9201 jT808_0x9201 = new JT808_0x9201(); | |||
@@ -221,17 +214,23 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
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.ChannelNo = reader.ReadByte(); | |||
jT808_0x9201.MediaType = reader.ReadByte(); | |||
jT808_0x9201.StreamType = reader.ReadByte(); | |||
jT808_0x9201.MemType = reader.ReadByte(); | |||
jT808_0x9201.PlayBackWay = reader.ReadByte(); | |||
jT808_0x9201.FastForwardOrFastRewindMultiples = reader.ReadByte(); | |||
jT808_0x9201.MemoryType = reader.ReadByte(); | |||
jT808_0x9201.PlaybackWay = reader.ReadByte(); | |||
jT808_0x9201.PlaySpeed = reader.ReadByte(); | |||
jT808_0x9201.BeginTime = reader.ReadDateTime6(); | |||
jT808_0x9201.EndTime = reader.ReadDateTime6(); | |||
return jT808_0x9201; | |||
} | |||
/// <summary> | |||
/// 序列化 | |||
/// </summary> | |||
/// <param name="writer"></param> | |||
/// <param name="value"></param> | |||
/// <param name="config"></param> | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9201 value, IJT808Config config) | |||
{ | |||
writer.Skip(1, out int position); | |||
@@ -239,12 +238,12 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
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.ChannelNo); | |||
writer.WriteByte(value.MediaType); | |||
writer.WriteByte(value.StreamType); | |||
writer.WriteByte(value.MemType); | |||
writer.WriteByte(value.PlayBackWay); | |||
writer.WriteByte(value.FastForwardOrFastRewindMultiples); | |||
writer.WriteByte(value.MemoryType); | |||
writer.WriteByte(value.PlaybackWay); | |||
writer.WriteByte(value.PlaySpeed); | |||
writer.WriteDateTime6(value.BeginTime); | |||
writer.WriteDateTime6(value.EndTime); | |||
} | |||
@@ -9,137 +9,136 @@ using System.Text.Json; | |||
namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
{ | |||
/// <summary> | |||
/// 平台下发远程录像回放控制 | |||
/// 平台下发远程录像回放控制(VodControl点播控制) | |||
/// </summary> | |||
public class JT808_0x9202 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9202>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "平台下发远程录像回放控制"; | |||
public override ushort MsgId => 0x9202; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 音视频通道号 | |||
/// </summary> | |||
public byte AVChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 回放控制 | |||
/// 0:开始 | |||
/// 1:暂停 | |||
/// 2:结束 | |||
/// 3:快进 | |||
/// 4:关键帧快退播放 | |||
/// 5:拖动(到指定位置) | |||
/// 6:关键帧播放 | |||
/// </summary> | |||
public byte PlayBackControl { get; set; } | |||
public byte PlayControl { get; set; } | |||
/// <summary> | |||
/// 快进或快退倍数 | |||
/// 快进或快退倍数,当<see cref="PlayControl"/>为3和4时,此字段有效,否则置0 | |||
/// 0:无效 | |||
/// 1:1倍 | |||
/// 2:2倍 | |||
/// 3:4倍 | |||
/// 4:8倍 | |||
/// 5:16倍 | |||
/// </summary> | |||
public byte FastForwardOrFastRewindMultiples { get; set; } | |||
public byte PlaySpeed { get; set; } | |||
/// <summary> | |||
/// 拖动回放位置 | |||
/// 拖动回放位置,当<see cref="PlayControl"/>为5时有效(必须) | |||
/// </summary> | |||
public DateTime DragPlaybackPosition { get; set; } | |||
public DateTime DragPlayPosition { get; set; } | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="writer"></param> | |||
/// <param name="config"></param> | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9202 value = new JT808_0x9202(); | |||
value.AVChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.AVChannelNo.ReadNumber()}]音视频通道号", AVChannelNoDisplay(value.AVChannelNo)); | |||
value.PlayBackControl = reader.ReadByte(); | |||
writer.WriteString($"[{value.PlayBackControl.ReadNumber()}]回放控制", PlayBackControlDisplay(value.PlayBackControl)); | |||
value.FastForwardOrFastRewindMultiples = reader.ReadByte(); | |||
writer.WriteString($"[{value.FastForwardOrFastRewindMultiples.ReadNumber()}]快进或快退倍数", FastForwardOrFastRewindMultiplesDisplay(value.FastForwardOrFastRewindMultiples)); | |||
value.DragPlaybackPosition = reader.ReadDateTime6(); | |||
writer.WriteString($"[{value.DragPlaybackPosition.ToString("yyMMddHHmmss")}]拖动回放位置", value.DragPlaybackPosition.ToString("yyyy-MM-dd HH:mm:ss")); | |||
string AVChannelNoDisplay(byte LogicalChannelNo) | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]音视频通道号", AVChannelNoDisplay(value.ChannelNo)); | |||
value.PlayControl = reader.ReadByte(); | |||
writer.WriteString($"[{value.PlayControl.ReadNumber()}]回放控制", PlayBackControlDisplay(value.PlayControl)); | |||
value.PlaySpeed = reader.ReadByte(); | |||
writer.WriteString($"[{value.PlaySpeed.ReadNumber()}]快进或快退倍数", FastForwardOrFastRewindMultiplesDisplay(value.PlaySpeed)); | |||
value.DragPlayPosition = reader.ReadDateTime6(); | |||
writer.WriteString($"[{value.DragPlayPosition.ToString("yyMMddHHmmss")}]拖动回放位置", value.DragPlayPosition.ToString("yyyy-MM-dd HH:mm:ss")); | |||
static string AVChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
string PlayBackControlDisplay(byte PlayBackControl) { | |||
switch (PlayBackControl) | |||
static string PlayBackControlDisplay(byte PlayBackControl) { | |||
return PlayBackControl switch | |||
{ | |||
case 0: | |||
return "开始回放"; | |||
case 1: | |||
return "暂停回放"; | |||
case 2: | |||
return "结束回放"; | |||
case 3: | |||
return "快进回放"; | |||
case 4: | |||
return "关键帧快退回放"; | |||
case 5: | |||
return "拖动回放"; | |||
case 6: | |||
return "关键帧播放"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "开始回放", | |||
1 => "暂停回放", | |||
2 => "结束回放", | |||
3 => "快进回放", | |||
4 => "关键帧快退回放", | |||
5 => "拖动回放", | |||
6 => "关键帧播放", | |||
_ => "未知", | |||
}; | |||
} | |||
string FastForwardOrFastRewindMultiplesDisplay(byte FastForwardOrFastRewindMultiples) | |||
static string FastForwardOrFastRewindMultiplesDisplay(byte FastForwardOrFastRewindMultiples) | |||
{ | |||
switch (FastForwardOrFastRewindMultiples) | |||
return FastForwardOrFastRewindMultiples switch | |||
{ | |||
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 "未知"; | |||
} | |||
0 => "无效", | |||
1 => "1倍", | |||
2 => "2倍", | |||
3 => "4倍", | |||
4 => "8倍", | |||
5 => "16倍", | |||
_ => "未知", | |||
}; | |||
} | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="reader"></param> | |||
/// <param name="config"></param> | |||
/// <returns></returns> | |||
public JT808_0x9202 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9202 jT808_0x9202 = new JT808_0x9202(); | |||
jT808_0x9202.AVChannelNo = reader.ReadByte(); | |||
jT808_0x9202.PlayBackControl = reader.ReadByte(); | |||
jT808_0x9202.FastForwardOrFastRewindMultiples = reader.ReadByte(); | |||
jT808_0x9202.DragPlaybackPosition = reader.ReadDateTime6(); | |||
var jT808_0x9202 = new JT808_0x9202(); | |||
jT808_0x9202.ChannelNo = reader.ReadByte(); | |||
jT808_0x9202.PlayControl = reader.ReadByte(); | |||
jT808_0x9202.PlaySpeed = reader.ReadByte(); | |||
jT808_0x9202.DragPlayPosition = reader.ReadDateTime6(); | |||
return jT808_0x9202; | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="writer"></param> | |||
/// <param name="value"></param> | |||
/// <param name="config"></param> | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9202 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.AVChannelNo); | |||
writer.WriteByte(value.PlayBackControl); | |||
writer.WriteByte(value.FastForwardOrFastRewindMultiples); | |||
writer.WriteDateTime6(value.DragPlaybackPosition); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.PlayControl); | |||
writer.WriteByte(value.PlaySpeed); | |||
writer.WriteDateTime6(value.DragPlayPosition); | |||
} | |||
} | |||
} |
@@ -13,12 +13,14 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9205 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9205>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "查询资源列表"; | |||
public override ushort MsgId => 0x9205; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 开始时间 | |||
/// </summary> | |||
@@ -33,127 +35,108 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
public ulong AlarmFlag { get; set; } | |||
/// <summary> | |||
/// 音视频资源类型 | |||
/// 0:audio and video | |||
/// 1:audio | |||
/// 2:video | |||
/// 3:audio or video | |||
/// </summary> | |||
public byte AVResourceType { get; set; } | |||
public byte MediaType { get; set; } | |||
/// <summary> | |||
/// 码流类型 | |||
/// 0:主或子码流 | |||
/// 1:主 | |||
/// 2:子 | |||
/// </summary> | |||
public byte StreamType { get; set; } | |||
/// <summary> | |||
/// 存储器类型 | |||
/// 0:主或灾备存储器 | |||
/// 1:主存储器 | |||
/// 2:灾备存储器 | |||
/// </summary> | |||
public byte MemoryType { get; set; } | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9205 value = new JT808_0x9205(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
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")); | |||
value.AlarmFlag = reader.ReadUInt64(); | |||
writer.WriteNumber($"[{value.AlarmFlag.ReadNumber()}]报警标志", value.AlarmFlag); | |||
value.AVResourceType = reader.ReadByte(); | |||
writer.WriteString($"[{value.AVResourceType.ReadNumber()}]音视频类型", AVResourceTypeDisplay(value.AVResourceType)); | |||
value.MediaType = reader.ReadByte(); | |||
writer.WriteString($"[{value.MediaType.ReadNumber()}]音视频类型", AVResourceTypeDisplay(value.MediaType)); | |||
value.StreamType = reader.ReadByte(); | |||
writer.WriteString($"[{value.StreamType.ReadNumber()}]码流类型", StreamTypeDisplay(value.StreamType)); | |||
value.MemoryType = reader.ReadByte(); | |||
writer.WriteString($"[{value.MemoryType.ReadNumber()}]存储器类型", MemoryTypeDisplay(value.MemoryType)); | |||
string AVResourceTypeDisplay(byte AVResourceType) | |||
static string AVResourceTypeDisplay(byte AVResourceType) | |||
{ | |||
switch (AVResourceType) | |||
return AVResourceType switch | |||
{ | |||
case 0: | |||
return "音视频"; | |||
case 1: | |||
return "音频"; | |||
case 2: | |||
return "视频"; | |||
case 3: | |||
return "音频或视频"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "音视频", | |||
1 => "音频", | |||
2 => "视频", | |||
3 => "音频或视频", | |||
_ => "未知", | |||
}; | |||
} | |||
string StreamTypeDisplay(byte StreamType) | |||
static string StreamTypeDisplay(byte StreamType) | |||
{ | |||
switch (StreamType) | |||
return StreamType switch | |||
{ | |||
case 0: | |||
return "所有码流"; | |||
case 1: | |||
return "主码流"; | |||
case 2: | |||
return "子码流"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "所有码流", | |||
1 => "主码流", | |||
2 => "子码流", | |||
_ => "未知", | |||
}; | |||
} | |||
string MemoryTypeDisplay(byte MemType) | |||
static string MemoryTypeDisplay(byte MemType) | |||
{ | |||
switch (MemType) | |||
return MemType switch | |||
{ | |||
case 0: | |||
return "所有存储器"; | |||
case 1: | |||
return "主存储器"; | |||
case 2: | |||
return "灾备服务器"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "所有存储器", | |||
1 => "主存储器", | |||
2 => "灾备服务器", | |||
_ => "未知", | |||
}; | |||
} | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
public JT808_0x9205 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9205 jT808_0x9205 = new JT808_0x9205(); | |||
jT808_0x9205.LogicChannelNo = reader.ReadByte(); | |||
var jT808_0x9205 = new JT808_0x9205(); | |||
jT808_0x9205.ChannelNo = reader.ReadByte(); | |||
jT808_0x9205.BeginTime = reader.ReadDateTime6(); | |||
jT808_0x9205.EndTime = reader.ReadDateTime6(); | |||
jT808_0x9205.AlarmFlag = reader.ReadUInt64(); | |||
jT808_0x9205.AVResourceType = reader.ReadByte(); | |||
jT808_0x9205.MediaType = reader.ReadByte(); | |||
jT808_0x9205.StreamType = reader.ReadByte(); | |||
jT808_0x9205.MemoryType = reader.ReadByte(); | |||
return jT808_0x9205; | |||
@@ -161,13 +144,14 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9205 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteDateTime6(value.BeginTime); | |||
writer.WriteDateTime6(value.EndTime); | |||
writer.WriteUInt64(value.AlarmFlag); | |||
writer.WriteByte(value.AVResourceType); | |||
writer.WriteByte(value.MediaType); | |||
writer.WriteByte(value.StreamType); | |||
writer.WriteByte(value.MemoryType); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,12 +13,14 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9206 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9206>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "文件上传指令"; | |||
public override ushort MsgId => 0x9206; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 服务器IP地址服务 | |||
/// </summary> | |||
public byte ServerIpLength { get; set; } | |||
public byte ServerIpLength { get;internal set; } | |||
/// <summary> | |||
/// 服务器IP地址 | |||
/// </summary> | |||
@@ -30,7 +32,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// <summary> | |||
/// 用户名长度 | |||
/// </summary> | |||
public byte UserNameLength { get; set; } | |||
public byte UserNameLength { get; internal set; } | |||
/// <summary> | |||
/// 用户名 | |||
/// </summary> | |||
@@ -38,7 +40,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// <summary> | |||
/// 密码长度 | |||
/// </summary> | |||
public byte PasswordLength { get; set; } | |||
public byte PasswordLength { get; internal set; } | |||
/// <summary> | |||
/// 密码 | |||
/// </summary> | |||
@@ -46,7 +48,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// <summary> | |||
/// 文件上传路径长度 | |||
/// </summary> | |||
public byte FileUploadPathLength { get; set; } | |||
public byte FileUploadPathLength { get; internal set; } | |||
/// <summary> | |||
/// 文件上传路径 | |||
/// </summary> | |||
@@ -54,7 +56,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 起始时间 | |||
/// </summary> | |||
@@ -70,7 +72,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// <summary> | |||
/// 音视频资源类型 | |||
/// </summary> | |||
public byte AVResourceType { get; set; } | |||
public byte MediaType { get; set; } | |||
/// <summary> | |||
/// 码流类型 | |||
/// </summary> | |||
@@ -84,6 +86,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public byte TaskExcuteCondition { get; set; } | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9206 value = new JT808_0x9206(); | |||
@@ -110,16 +113,16 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
value.FileUploadPath = reader.ReadString(value.FileUploadPathLength); | |||
writer.WriteString($"[{fileUploadPathHex}]文件上传路径", value.FileUploadPath); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
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")); | |||
value.AlarmFlag = reader.ReadUInt32(); | |||
writer.WriteNumber($"[{value.AlarmFlag.ReadNumber()}]报警标志", value.AlarmFlag); | |||
value.AVResourceType = reader.ReadByte(); | |||
writer.WriteString($"[{value.AVResourceType.ReadNumber()}]音视频类型", AVResourceTypeDisplay(value.AVResourceType)); | |||
value.MediaType = reader.ReadByte(); | |||
writer.WriteString($"[{value.MediaType.ReadNumber()}]音视频类型", AVResourceTypeDisplay(value.MediaType)); | |||
value.StreamType = reader.ReadByte(); | |||
writer.WriteString($"[{value.StreamType.ReadNumber()}]码流类型", StreamTypeDisplay(value.StreamType)); | |||
value.MemoryPositon = reader.ReadByte(); | |||
@@ -127,90 +130,61 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
value.TaskExcuteCondition = reader.ReadByte(); | |||
writer.WriteString($"[{value.TaskExcuteCondition.ReadNumber()}]任务执行条件", TaskExcuteConditionDisplay(value.TaskExcuteCondition)); | |||
string AVResourceTypeDisplay(byte AVResourceType) | |||
static string AVResourceTypeDisplay(byte AVResourceType) | |||
{ | |||
switch (AVResourceType) | |||
return AVResourceType switch | |||
{ | |||
case 0: | |||
return "音视频"; | |||
case 1: | |||
return "音频"; | |||
case 2: | |||
return "视频"; | |||
case 3: | |||
return "音频或视频"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "音视频", | |||
1 => "音频", | |||
2 => "视频", | |||
3 => "音频或视频", | |||
_ => "未知", | |||
}; | |||
} | |||
string StreamTypeDisplay(byte StreamType) | |||
static string StreamTypeDisplay(byte StreamType) | |||
{ | |||
switch (StreamType) | |||
return StreamType switch | |||
{ | |||
case 0: | |||
return "所有码流"; | |||
case 1: | |||
return "主码流"; | |||
case 2: | |||
return "子码流"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "所有码流", | |||
1 => "主码流", | |||
2 => "子码流", | |||
_ => "未知", | |||
}; | |||
} | |||
string MemoryPositonDisplay(byte MemoryPositon) | |||
static string MemoryPositonDisplay(byte MemoryPositon) | |||
{ | |||
switch (MemoryPositon) | |||
return MemoryPositon switch | |||
{ | |||
case 0: | |||
return "主存储器或灾备服务器"; | |||
case 1: | |||
return "主存储器"; | |||
case 2: | |||
return "灾备服务器"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "主存储器或灾备服务器", | |||
1 => "主存储器", | |||
2 => "灾备服务器", | |||
_ => "未知", | |||
}; | |||
} | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
string TaskExcuteConditionDisplay(byte TaskExcuteCondition) { | |||
string taskExcuteConditionDisplay = string.Empty; | |||
static string TaskExcuteConditionDisplay(byte TaskExcuteCondition) { | |||
var taskExcuteConditionDisplay = string.Empty; | |||
taskExcuteConditionDisplay += (TaskExcuteCondition & 0x01) == 1 ? ",WIFI":""; | |||
taskExcuteConditionDisplay += (TaskExcuteCondition & 0x01) == 1 ? ",LAN" : ""; | |||
taskExcuteConditionDisplay += (TaskExcuteCondition & 0x01) == 1 ? ",3G/4G" : ""; | |||
@@ -220,7 +194,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
public JT808_0x9206 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9206 jT808_0x9206 = new JT808_0x9206(); | |||
var jT808_0x9206 = new JT808_0x9206(); | |||
jT808_0x9206.ServerIpLength = reader.ReadByte(); | |||
jT808_0x9206.ServerIp = reader.ReadString(jT808_0x9206.ServerIpLength); | |||
jT808_0x9206.Port = reader.ReadUInt16(); | |||
@@ -230,11 +204,11 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
jT808_0x9206.Password = reader.ReadString(jT808_0x9206.PasswordLength); | |||
jT808_0x9206.FileUploadPathLength = reader.ReadByte(); | |||
jT808_0x9206.FileUploadPath = reader.ReadString(jT808_0x9206.FileUploadPathLength); | |||
jT808_0x9206.LogicChannelNo = reader.ReadByte(); | |||
jT808_0x9206.ChannelNo = reader.ReadByte(); | |||
jT808_0x9206.BeginTime = reader.ReadDateTime6(); | |||
jT808_0x9206.EndTime = reader.ReadDateTime6(); | |||
jT808_0x9206.AlarmFlag = reader.ReadUInt32(); | |||
jT808_0x9206.AVResourceType = reader.ReadByte(); | |||
jT808_0x9206.MediaType = reader.ReadByte(); | |||
jT808_0x9206.StreamType = reader.ReadByte(); | |||
jT808_0x9206.MemoryPositon = reader.ReadByte(); | |||
jT808_0x9206.TaskExcuteCondition = reader.ReadByte(); | |||
@@ -256,14 +230,15 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
writer.Skip(1, out int fileUploadPathLengthLengthposition); | |||
writer.WriteString(value.FileUploadPath); | |||
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - fileUploadPathLengthLengthposition - 1), fileUploadPathLengthLengthposition); | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteDateTime6(value.BeginTime); | |||
writer.WriteDateTime6(value.EndTime); | |||
writer.WriteUInt32(value.AlarmFlag); | |||
writer.WriteByte(value.AVResourceType); | |||
writer.WriteByte(value.MediaType); | |||
writer.WriteByte(value.StreamType); | |||
writer.WriteByte(value.MemoryPositon); | |||
writer.WriteByte(value.TaskExcuteCondition); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,8 +13,10 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9207 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9207>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "文件上传控制"; | |||
public override ushort MsgId => 0x9207; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 流水号 | |||
/// </summary> | |||
@@ -24,6 +26,7 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public byte UploadControl { get; set; } | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9207 value = new JT808_0x9207(); | |||
@@ -31,24 +34,20 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
writer.WriteNumber($"[{value.MgsNum.ReadNumber()}]流水号", value.MgsNum); | |||
value.UploadControl = reader.ReadByte(); | |||
writer.WriteString($"[{value.UploadControl.ReadNumber()}]上传控制", UploadControlDisplay(value.UploadControl)); | |||
string UploadControlDisplay(byte UploadControl) { | |||
switch (UploadControl) | |||
static string UploadControlDisplay(byte UploadControl) { | |||
return UploadControl switch | |||
{ | |||
case 0: | |||
return "暂停"; | |||
case 1: | |||
return "继续"; | |||
case 2: | |||
return "取消"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "暂停", | |||
1 => "继续", | |||
2 => "取消", | |||
_ => "未知", | |||
}; | |||
} | |||
} | |||
public JT808_0x9207 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9207 jT808_0x9207 = new JT808_0x9207(); | |||
var jT808_0x9207 = new JT808_0x9207(); | |||
jT808_0x9207.MgsNum = reader.ReadUInt16(); | |||
jT808_0x9207.UploadControl = reader.ReadByte(); | |||
return jT808_0x9207; | |||
@@ -59,5 +58,6 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
writer.WriteUInt16(value.MgsNum); | |||
writer.WriteByte(value.UploadControl); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,91 +13,77 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9301 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9301>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "云台旋转"; | |||
public override ushort MsgId => 0x9301; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 方向 | |||
/// 0:停止 | |||
/// 1:上 | |||
/// 2:下 | |||
/// 3:左 | |||
/// 4:右 | |||
/// </summary> | |||
public byte Direction { get; set; } | |||
/// <summary> | |||
/// 速度 | |||
/// 0-255 | |||
/// </summary> | |||
public byte Speed { get; set; } | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9301 value = new JT808_0x9301(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.Direction = reader.ReadByte(); | |||
writer.WriteString($"[{value.Direction.ReadNumber()}]方向", DirectionDisplay(value.Direction)); | |||
value.Speed = reader.ReadByte(); | |||
writer.WriteNumber($"[{value.Speed.ReadNumber()}]速度", value.Speed); | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
string DirectionDisplay(byte Direction) { | |||
switch (Direction) | |||
static string DirectionDisplay(byte Direction) { | |||
return Direction switch | |||
{ | |||
case 0: | |||
return "停止"; | |||
case 1: | |||
return "上"; | |||
case 2: | |||
return "下"; | |||
case 3: | |||
return "左"; | |||
case 4: | |||
return "右"; | |||
default: | |||
return "未知"; | |||
} | |||
0 => "停止", | |||
1 => "上", | |||
2 => "下", | |||
3 => "左", | |||
4 => "右", | |||
_ => "未知", | |||
}; | |||
} | |||
} | |||
public JT808_0x9301 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9301 jT808_0x9301 = new JT808_0x9301(); | |||
jT808_0x9301.LogicChannelNo = reader.ReadByte(); | |||
var jT808_0x9301 = new JT808_0x9301(); | |||
jT808_0x9301.ChannelNo = reader.ReadByte(); | |||
jT808_0x9301.Direction = reader.ReadByte(); | |||
jT808_0x9301.Speed = reader.ReadByte(); | |||
return jT808_0x9301; | |||
@@ -105,9 +91,10 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9301 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.Direction); | |||
writer.WriteByte(value.Speed); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,8 +13,11 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9302 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9302>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "云台调整焦距控制"; | |||
public override ushort MsgId => 0x9302; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
@@ -23,59 +26,43 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// 焦距调整方向 | |||
/// </summary> | |||
public byte FocusAdjustmentDirection { get; set; } | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9302 value = new JT808_0x9302(); | |||
var value = new JT808_0x9302(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.FocusAdjustmentDirection = reader.ReadByte(); | |||
writer.WriteString($"[{value.FocusAdjustmentDirection.ReadNumber()}]焦距调整方向", value.FocusAdjustmentDirection==0?"焦距调大":"焦距调小"); | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
public JT808_0x9302 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9302 jT808_0x9302 = new JT808_0x9302(); | |||
var jT808_0x9302 = new JT808_0x9302(); | |||
jT808_0x9302.LogicChannelNo = reader.ReadByte(); | |||
jT808_0x9302.FocusAdjustmentDirection = reader.ReadByte(); | |||
return jT808_0x9302; | |||
@@ -86,5 +73,6 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.FocusAdjustmentDirection); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,76 +13,64 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9303 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9303>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "云台调整光圈控制"; | |||
public override ushort MsgId => 0x9303; | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 光圈调整方式 | |||
/// </summary> | |||
public byte IrisAdjustment { get; set; } | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9303 value = new JT808_0x9303(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.IrisAdjustment = reader.ReadByte(); | |||
writer.WriteString($"[{value.IrisAdjustment.ReadNumber()}]光圈调整方式", value.IrisAdjustment == 0 ? "调大" : "调小"); | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
public JT808_0x9303 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9303 jT808_0x9303 = new JT808_0x9303(); | |||
jT808_0x9303.LogicChannelNo = reader.ReadByte(); | |||
var jT808_0x9303 = new JT808_0x9303(); | |||
jT808_0x9303.ChannelNo = reader.ReadByte(); | |||
jT808_0x9303.IrisAdjustment = reader.ReadByte(); | |||
return jT808_0x9303; | |||
} | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9303 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.IrisAdjustment); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,12 +13,13 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9304 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9304>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "云台雨刷控制"; | |||
public override ushort MsgId => 0x9304; | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 启停标识 | |||
/// </summary> | |||
@@ -27,62 +28,48 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9304 value = new JT808_0x9304(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.StartOrStop = reader.ReadByte(); | |||
writer.WriteString($"[{value.StartOrStop.ReadNumber()}]启停标识", value.StartOrStop == 0 ? "停止" : "启动"); | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
public JT808_0x9304 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9304 jT808_0x9304 = new JT808_0x9304(); | |||
jT808_0x9304.LogicChannelNo = reader.ReadByte(); | |||
var jT808_0x9304 = new JT808_0x9304(); | |||
jT808_0x9304.ChannelNo = reader.ReadByte(); | |||
jT808_0x9304.StartOrStop = reader.ReadByte(); | |||
return jT808_0x9304; | |||
} | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9304 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.StartOrStop); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,12 +13,13 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9305 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9305>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "红外补光控制"; | |||
public override ushort MsgId => 0x9305; | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 启停标识 | |||
/// </summary> | |||
@@ -27,62 +28,48 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9305 value = new JT808_0x9305(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.StartOrStop = reader.ReadByte(); | |||
writer.WriteString($"[{value.StartOrStop.ReadNumber()}]启停标识", value.StartOrStop == 0 ? "停止" : "启动"); | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
public JT808_0x9305 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9305 jT808_0x9305 = new JT808_0x9305(); | |||
jT808_0x9305.LogicChannelNo = reader.ReadByte(); | |||
var jT808_0x9305 = new JT808_0x9305(); | |||
jT808_0x9305.ChannelNo = reader.ReadByte(); | |||
jT808_0x9305.StartOrStop = reader.ReadByte(); | |||
return jT808_0x9305; | |||
} | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9305 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.StartOrStop); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |
@@ -13,12 +13,14 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
/// </summary> | |||
public class JT808_0x9306 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x9306>, IJT808Analyze | |||
{ | |||
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
public override string Description => "云台变倍控制"; | |||
public override ushort MsgId => 0x9306; | |||
/// <summary> | |||
/// 逻辑通道号 | |||
/// </summary> | |||
public byte LogicChannelNo { get; set; } | |||
public byte ChannelNo { get; set; } | |||
/// <summary> | |||
/// 变倍控制 | |||
/// </summary> | |||
@@ -26,63 +28,49 @@ namespace JT808.Protocol.Extensions.JT1078.MessageBody | |||
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) | |||
{ | |||
JT808_0x9306 value = new JT808_0x9306(); | |||
value.LogicChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.LogicChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.LogicChannelNo)); | |||
var value = new JT808_0x9306(); | |||
value.ChannelNo = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChannelNo.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelNo)); | |||
value.ChangeMultipleControl = reader.ReadByte(); | |||
writer.WriteString($"[{value.ChangeMultipleControl.ReadNumber()}]变倍控制", value.ChangeMultipleControl == 0 ? "调大" : "调小"); | |||
string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
static string LogicalChannelNoDisplay(byte LogicalChannelNo) | |||
{ | |||
switch (LogicalChannelNo) | |||
return LogicalChannelNo switch | |||
{ | |||
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 "预留"; | |||
} | |||
1 => "驾驶员", | |||
2 => "车辆正前方", | |||
3 => "车前门", | |||
4 => "车厢前部", | |||
5 => "车厢后部", | |||
7 => "行李舱", | |||
8 => "车辆左侧", | |||
9 => "车辆右侧", | |||
10 => "车辆正后方", | |||
11 => "车厢中部", | |||
12 => "车中门", | |||
13 => "驾驶席车门", | |||
33 => "驾驶员", | |||
36 => "车厢前部", | |||
37 => "车厢后部", | |||
_ => "预留", | |||
}; | |||
} | |||
} | |||
public JT808_0x9306 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x9306 jT808_0x9306 = new JT808_0x9306(); | |||
jT808_0x9306.LogicChannelNo = reader.ReadByte(); | |||
var jT808_0x9306 = new JT808_0x9306(); | |||
jT808_0x9306.ChannelNo = reader.ReadByte(); | |||
jT808_0x9306.ChangeMultipleControl = reader.ReadByte(); | |||
return jT808_0x9306; | |||
} | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9306 value, IJT808Config config) | |||
{ | |||
writer.WriteByte(value.LogicChannelNo); | |||
writer.WriteByte(value.ChannelNo); | |||
writer.WriteByte(value.ChangeMultipleControl); | |||
} | |||
#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 | |||
} | |||
} |