From 985142353b911b4ae2bd918c220ac74434e7f75c Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Sat, 29 May 2021 18:01:21 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=B0=83=E6=95=B40x0200=E9=99=84=E5=8A=A0?= =?UTF-8?q?=E5=9F=BA=E7=B1=BB=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?4=E4=B8=AA=E5=AD=97=E8=8A=82=E7=9A=84=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E9=99=84=E5=8A=A0=E4=BF=A1=E6=81=AF=E9=95=BF=E5=BA=A6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=202.=E4=BF=AE=E6=94=B9=E8=8B=8F=E6=A0=87=E7=9A=84?= =?UTF-8?q?=E4=B8=BB=E5=8A=A8=E5=AE=89=E5=85=A8=E6=8A=A5=E8=AD=A6=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E4=BF=A1=E6=81=AF=E6=B6=88=E6=81=AF=E7=9A=84=E7=BB=88?= =?UTF-8?q?=E7=AB=AFID=E5=B1=9E=E6=80=A7=203.=E5=A2=9E=E5=8A=A0=E7=B2=A4?= =?UTF-8?q?=E6=A0=87=E5=8D=8F=E8=AE=AE=EF=BC=88=E5=BE=85=E5=AE=8C=E5=96=84?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ocol.Extensions.JTActiveSafety.Test.csproj | 7 - .../JT808_0x1210_Test.cs | 4 +- ...808.Protocol.Extensions.JTActiveSafety.xml | 4 +- .../MessageBody/JT808_0x1210.cs | 12 +- .../Enums/ActivePhotographyStrategyType.cs | 33 + .../Enums/JT808_YueBiao_MsgId.cs | 33 + .../Enums/PhotoResolutionType.cs | 41 + .../Enums/USBIDType.cs | 29 + .../Enums/VideoRecordingResolutionType.cs | 45 + .../Enums/WorkingConditionType.cs | 33 + .../JT808.Protocol.Extensions.YueBiao.csproj | 2 +- .../JT808.Protocol.Extensions.YueBiao.xml | 2017 +++++++++++++++++ .../JT808_YueBiao_Constants.cs | 53 + .../MessageBody/JT808_0x0200_0x64.cs | 352 +++ .../MessageBody/JT808_0x0200_0x65.cs | 315 +++ .../MessageBody/JT808_0x0200_0x66.cs | 316 +++ .../MessageBody/JT808_0x0200_0x67.cs | 283 +++ .../MessageBody/JT808_0x0900_0xF7.cs | 122 + .../MessageBody/JT808_0x0900_0xF8.cs | 175 ++ .../MessageBody/JT808_0x1210.cs | 179 ++ .../MessageBody/JT808_0x1211.cs | 87 + .../MessageBody/JT808_0x1212.cs | 87 + .../MessageBody/JT808_0x8103_0xF364.cs | 456 ++++ .../MessageBody/JT808_0x8103_0xF365.cs | 365 +++ .../MessageBody/JT808_0x8103_0xF366.cs | 151 ++ .../MessageBody/JT808_0x8103_0xF367.cs | 77 + .../MessageBody/JT808_0x8900_0xF7.cs | 90 + .../MessageBody/JT808_0x8900_0xF8.cs | 90 + .../MessageBody/JT808_0x9208.cs | 143 ++ .../MessageBody/JT808_0x9212.cs | 139 ++ .../Metadata/AlarmIdentificationProperty.cs | 40 + .../Metadata/AlarmOrEventProperty.cs | 33 + .../Metadata/AttachProperty.cs | 26 + .../Metadata/DataPackageProperty.cs | 21 + .../Metadata/JT808_0x0900_0xF7_USB.cs | 31 + .../Metadata/JT808_0x0900_0xF8_USB.cs | 72 + src/JT808.Protocol/JT808.Protocol.xml | 7 + .../MessageBody/JT808_0x0200_BodyBase.cs | 6 + 38 files changed, 5958 insertions(+), 18 deletions(-) create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/ActivePhotographyStrategyType.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/JT808_YueBiao_MsgId.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/PhotoResolutionType.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/USBIDType.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/VideoRecordingResolutionType.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/WorkingConditionType.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808_YueBiao_Constants.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x64.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x65.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x66.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x67.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF7.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF8.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1210.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1211.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1212.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF364.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF365.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF366.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF367.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF7.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF8.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9208.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9212.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmIdentificationProperty.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmOrEventProperty.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AttachProperty.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/DataPackageProperty.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF7_USB.cs create mode 100644 src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF8_USB.cs diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808.Protocol.Extensions.JTActiveSafety.Test.csproj b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808.Protocol.Extensions.JTActiveSafety.Test.csproj index c7ce9d9..43ff6eb 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808.Protocol.Extensions.JTActiveSafety.Test.csproj +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808.Protocol.Extensions.JTActiveSafety.Test.csproj @@ -6,13 +6,6 @@ false - - - - True - - - diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x1210_Test.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x1210_Test.cs index f250bf5..3558cd4 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x1210_Test.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x1210_Test.cs @@ -43,7 +43,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test FileSize=10 } }, - MakerID = "4444444", + TerminalId = "4444444", InfoType = 0 }; var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); @@ -68,7 +68,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test Assert.Equal(9, jT808UploadLocationRequest.AttachInfos[1].FileNameLength); Assert.Equal(10u, jT808UploadLocationRequest.AttachInfos[1].FileSize); - Assert.Equal("4444444", jT808UploadLocationRequest.MakerID); + Assert.Equal("4444444", jT808UploadLocationRequest.TerminalId); Assert.Equal(0, jT808UploadLocationRequest.InfoType); } diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml index 8986e83..9e3a4b0 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml @@ -783,9 +783,9 @@ 报警附件信息消息 - + - 制造商Id + 终端ID 7 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00” diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x1210.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x1210.cs index 4a6d105..6de33f1 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x1210.cs +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x1210.cs @@ -15,10 +15,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody public class JT808_0x1210: JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze { /// - /// 制造商Id + /// 终端ID /// 7 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00” /// - public string MakerID { get; set; } + public string TerminalId { get; set; } /// /// 报警标识号 /// @@ -60,8 +60,8 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody { JT808_0x1210 value = new JT808_0x1210(); string makerIdHex=reader.ReadVirtualArray(7).ToArray().ToHexString(); - value.MakerID = reader.ReadString(7); - writer.WriteString($"[{makerIdHex}]制造商Id", value.MakerID); + value.TerminalId = reader.ReadString(7); + writer.WriteString($"[{makerIdHex}]终端ID", value.TerminalId); value.AlarmIdentification = new AlarmIdentificationProperty(); string terminalIDHex = reader.ReadVirtualArray(7).ToArray().ToHexString(); value.AlarmIdentification.TerminalID = reader.ReadString(7); @@ -109,7 +109,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody public JT808_0x1210 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x1210 value = new JT808_0x1210(); - value.MakerID = reader.ReadString(7); + value.TerminalId = reader.ReadString(7); value.AlarmIdentification = new AlarmIdentificationProperty { TerminalID = reader.ReadString(7), @@ -143,7 +143,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody /// public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1210 value, IJT808Config config) { - writer.WriteString(value.MakerID.PadRight(7, '\0')); + writer.WriteString(value.TerminalId.PadRight(7, '\0')); if (value.AlarmIdentification == null) { throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空"); diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/ActivePhotographyStrategyType.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/ActivePhotographyStrategyType.cs new file mode 100644 index 0000000..09a3eef --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/ActivePhotographyStrategyType.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Enums +{ + /// + /// 主动拍照策略 + /// + public enum ActivePhotographyStrategyType:byte + { + /// + /// 不开启 + /// + 不开启 = 0x00, + /// + /// 定时拍照 + /// + 定时拍照 = 0x01, + /// + /// 定距拍照 + /// + 定距拍照 = 0x02, + /// + /// 保留 + /// + 保留 = 0x03, + /// + /// 不修改参数 + /// + 不修改参数 = 0xFF + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/JT808_YueBiao_MsgId.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/JT808_YueBiao_MsgId.cs new file mode 100644 index 0000000..aa2d916 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/JT808_YueBiao_MsgId.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Enums +{ + /// + /// 主动安全消息Id + /// + public enum JT808_YueBiao_MsgId : ushort + { + /// + /// 报警附件信息消息 + /// + 报警附件信息消息 = 0x1210, + /// + /// 文件信息上传 + /// + 文件信息上传 = 0x1211, + /// + /// 文件上传完成消息 + /// + 文件上传完成消息 = 0x1212, + /// + /// 报警附件上传指令 + /// + 报警附件上传指令 = 0x9208, + /// + /// 文件上传完成消息应答 + /// + 文件上传完成消息应答 = 0x9212, + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/PhotoResolutionType.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/PhotoResolutionType.cs new file mode 100644 index 0000000..92bca3c --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/PhotoResolutionType.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Enums +{ + /// + /// 拍照分辨率 + /// + public enum PhotoResolutionType:byte + { + /// + /// 352x288 + /// + x352_288 = 0x01, + /// + /// 704x288 + /// + x704_288 = 0x02, + /// + /// 704x576 + /// + x704_576 = 0x03, + /// + /// 640x480 + /// + x640_480 = 0x04, + /// + /// 1280x720 + /// + x1280_720 = 0x05, + /// + /// 1920x1080 + /// + x1920_1080 = 0x06, + /// + /// 不修改参数 + /// + 不修改参数 = 0xFF + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/USBIDType.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/USBIDType.cs new file mode 100644 index 0000000..6761dd6 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/USBIDType.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Enums +{ + /// + /// USB编号类型 + /// + public enum USBIDType:byte + { + /// + /// 高级驾驶辅助系统 + /// + ADAS = 0x64, + /// + /// 驾驶员状态监控系统 + /// + DSM = 0x65, + /// + /// 轮胎气压监测系统 + /// + TPMS = 0x66, + /// + /// 盲点监测系统 + /// + BSD = 0x67 + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/VideoRecordingResolutionType.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/VideoRecordingResolutionType.cs new file mode 100644 index 0000000..6d1f9f5 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/VideoRecordingResolutionType.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Enums +{ + /// + /// 视频录制分辨率 + /// + public enum VideoRecordingResolutionType:byte + { + /// + /// CIF + /// + CIF = 0x01, + /// + /// HD1 + /// + HD1 = 0x02, + /// + /// D1 + /// + D1 = 0x03, + /// + /// WD1 + /// + WD1 = 0x04, + /// + /// VGA + /// + VGA = 0x05, + /// + /// 720P + /// + _720P = 0x06, + /// + /// 1080P + /// + _1080P = 0x07, + /// + /// 不修改参数 + /// + 不修改参数 = 0xFF + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/WorkingConditionType.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/WorkingConditionType.cs new file mode 100644 index 0000000..f292fea --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/WorkingConditionType.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Enums +{ + /// + /// 工作状态 + /// + public enum WorkingConditionType:byte + { + /// + /// 正常工作 + /// + 正常工作 = 0x01, + /// + /// 待机状态 + /// + 待机状态 = 0x02, + /// + /// 升级维护 + /// + 升级维护 = 0x03, + /// + /// 设备异常 + /// + 设备异常 = 0x04, + /// + /// 断开连接 + /// + 断开连接 = 0x10, + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.csproj b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.csproj index 03b8429..1467982 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.csproj +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.csproj @@ -13,7 +13,7 @@ True - + diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.xml b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.xml index 0ec9c30..7ccb3a4 100644 --- a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.xml +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.xml @@ -16,5 +16,2022 @@ + + + 主动拍照策略 + + + + + 不开启 + + + + + 定时拍照 + + + + + 定距拍照 + + + + + 保留 + + + + + 不修改参数 + + + + + 主动安全消息Id + + + + + 报警附件信息消息 + + + + + 文件信息上传 + + + + + 文件上传完成消息 + + + + + 报警附件上传指令 + + + + + 文件上传完成消息应答 + + + + + 拍照分辨率 + + + + + 352x288 + + + + + 704x288 + + + + + 704x576 + + + + + 640x480 + + + + + 1280x720 + + + + + 1920x1080 + + + + + 不修改参数 + + + + + USB编号类型 + + + + + 高级驾驶辅助系统 + + + + + 驾驶员状态监控系统 + + + + + 轮胎气压监测系统 + + + + + 盲点监测系统 + + + + + 视频录制分辨率 + + + + + CIF + + + + + HD1 + + + + + D1 + + + + + WD1 + + + + + VGA + + + + + 720P + + + + + 1080P + + + + + 不修改参数 + + + + + 工作状态 + + + + + 正常工作 + + + + + 待机状态 + + + + + 升级维护 + + + + + 设备异常 + + + + + 断开连接 + + + + + 主动安全常量 + + + + + 附加信息ID 高级驾驶辅助系统报警信息 + + + + + 附加信息ID 驾驶员状态监测系统报警信息 + + + + + 附加信息ID 胎压监测系统报警信息 + + + + + 附加信息ID 盲区监测系统报警信息 + + + + + 高级驾驶辅助系统参数设置 + + + + + 驾驶员状态监测系统参数设置 + + + + + 胎压监测系统参数设置 + + + + + 盲区监测系统参数设置 + + + + + 状态查询 + + + + + 信息查询 + + + + + 高级驾驶辅助系统报警信息 + + + + + 高级驾驶辅助系统报警信息Id + + + + + 高级驾驶辅助系统报警信息附加长度 + + + + + 报警ID + + + + + 标志状态 + + + + + 报警/事件类型 + + + + + 报警/事件类型 + + + + + 前车车速 + + + + + 前车/行人距离 + + + + + 偏离类型 + + + + + 道路标志识别类型 + + + + + 道路标志识别类型 + + + + + 车速 + + + + + 高程 + + + + + 纬度 + + + + + 经度 + + + + + 日期时间 + YYMMDDhhmmss + BCD[6] + + + + + 车辆状态 + + + + + 报警标识号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 驾驶员状态监测系统报警信息 + + + + + 驾驶员状态监测系统报警信息Id + + + + + 驾驶员状态监测系统报警信息长度 + + + + + 报警ID + + + + + 标志状态 + + + + + 报警/事件类型 + + + + + 报警级别 + + + + + 疲劳程度 + + + + + 预留 + + + + + 车速 + + + + + 高程 + + + + + 纬度 + + + + + 经度 + + + + + 日期时间 + YYMMDDhhmmss + BCD[6] + + + + + 车辆状态 + + + + + 报警标识号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 胎压监测系统报警信息 + + + + + 胎压监测系统报警信息Id + + + + + 胎压监测系统报警信息长度 + + + + + 报警ID + + + + + 标志状态 + + + + + 车速 + + + + + 高程 + + + + + 纬度 + + + + + 经度 + + + + + 日期时间 + YYMMDDhhmmss + BCD[6] + + + + + 车辆状态 + + + + + 报警标识号 + + + + + 报警/事件列表总数 + + + + + 报警/事件信息列表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 盲区监测系统报警信息 + + + + + 盲区监测系统报警信息Id + + + + + 盲区监测系统报警信息长度 + + + + + 报警ID + + + + + 标志状态 + + + + + 报警/事件类型 + + + + + 报警/事件类型 + + + + + 车速 + + + + + 高程 + + + + + 纬度 + + + + + 经度 + + + + + 日期时间 + YYMMDDhhmmss + BCD[6] + + + + + 车辆状态 + + + + + 报警标识号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 透传数据 + + + + + 透传类型 + + + + + 消息列表总数 + + + + + 消息列表数据 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 透传数据 + + + + + 透传类型 + + + + + 消息列表总数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 报警附件信息消息 + + + + + 终端 ID + 30 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00” + + + + + 报警标识号 + + + + + 平台给报警分配的唯一编号 + 32 + + + + + 信息类型 + 0x00:正常报警文件信息 + 0x01:补传报警文件信息 + + + + + 附件数量 + + + + + 附件信息列表 + + + + + 报警附件信息消息Id + + + + + 报警附件信息消息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 文件信息上传 + + + + + 文件信息上传 + + + + + 文件名称长度 + + + + + 文件名称 + 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名 + + + + + 文件类型 + + + + + 文件大小 + + + + + 文件信息上传Id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 文件上传完成消息 + + + + + 文件上传完成消息 + + + + + 文件名称长度 + + + + + 文件名称 + 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名 + + + + + 文件类型 + + + + + 文件大小 + + + + + 文件上传完成消息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 高级驾驶辅助系统参数 + + + + + 高级驾驶辅助系统参数 + + + + + 高级驾驶辅助系统参数长度 + + + + + 报警判断速度阈值 + + + + + 报警提示音量 + + + + + 主动拍照策略 + + + + + + 主动定时拍照时间间隔 + + + + + 主动定距拍照距离间隔 + + + + + 单次主动拍照张数 + + + + + 单次主动拍照时间间隔 + + + + + 拍照分辨率 + + + + + + 视频录制分辨率 + + + + + 报警使能 + + + + + 事件使能 + + + + + 预留字段 + + + + + 障碍物报警距离阈值 + + + + + 障碍物报警分级速度阈值 + + + + + 障碍物报警前后视频录制时间 + + + + + 障碍物报警拍照张数 + + + + + 障碍物报警拍照间隔 + + + + + 频繁变道报警判断时间段 + + + + + 频繁变道报警判断次数 + + + + + 频繁变道报警分级速度阈值 + + + + + 频繁变道报警前后视频录制时间 + + + + + 频繁变道报警拍照张数 + + + + + 频繁变道报警拍照间隔 + + + + + 车道偏离报警分级速度阈值 + + + + + 车道偏离报警前后视频录制时间 + + + + + 车道偏离报警拍照张数 + + + + + 车道偏离报警拍照间隔 + + + + + 前向碰撞报警时间阈值 + + + + + 前向碰撞报警分级速度阈值 + + + + + 前向碰撞报警前后视频录制时间 + + + + + 前向碰撞报警拍照张数 + + + + + 前向碰撞报警拍照间隔 + + + + + 行人碰撞报警时间阈值 + + + + + 行人碰撞报警使能速度阈值 + + + + + 行人碰撞报警前后视频录制时间 + + + + + 行人碰撞报警拍照张数 + + + + + 行人碰撞报警拍照间隔 + + + + + 车距监控报警距离阈值 + + + + + 车距监控报警分级速度阈值 + + + + + 车距过近报警前后视频录制时间 + + + + + 车距过近报警拍照张数 + + + + + 车距过近报警拍照间隔 + + + + + 道路标志识别拍照张数 + + + + + 道路标志识别拍照间隔 + + + + + 保留字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 驾驶员状态监测系统参数 + + + + + 驾驶员状态监测系统参数 + + + + + 驾驶员状态监测系统参数长度 + + + + + 报警判断速度阈值 + + + + + 报警提示音量 + + + + + 主动拍照策略 + + + + + 主动定时拍照时间间隔 + + + + + 主动定距拍照距离间隔 + + + + + 单次主动拍照张数 + + + + + 单次主动拍照时间间隔 + + + + + 拍照分辨率 + + + + + 视频录制分辨率 + + + + + 报警使能 + + + + + 事件使能 + + + + + 吸烟报警判断时间间隔 + + + + + 接打电话报警判断时间间隔 + + + + + 预留字段 + + + + + 疲劳驾驶报警分级速度阈值 + + + + + 疲劳驾驶报警前后视频录制时间 + + + + + 疲劳驾驶报警拍照张数 + + + + + 疲劳驾驶报警拍照间隔时间 + + + + + 接打电话报警分级速度阈值 + + + + + 接打电话报警前后视频录制时间 + + + + + 接打电话报警拍驾驶员面部特征照片张数 + + + + + 接打电话报警拍驾驶员面部特征照片间隔时间 + + + + + 抽烟报警分级车速阈值 + + + + + 抽烟报警前后视频录制时间 + + + + + 抽烟报警拍驾驶员面部特征照片张数 + + + + + 抽烟报警拍驾驶员面部特征照片间隔时间 + + + + + 分神驾驶报警分级车速阈值 + + + + + 分神驾驶报警拍照张数 + + + + + 分神驾驶报警拍照间隔时间 + + + + + 驾驶行为异常视频录制时间 + + + + + 驾驶行为异常抓拍照片张数 + + + + + 驾驶行为异常拍照间隔 + + + + + 驾驶员身份识别触发 + + + + + 保留字段 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 胎压监测系统参数 + + + + + 胎压监测系统参数Id + + + + + 胎压监测系统参数长度 + + + + + 轮胎规格型号 12位 + + + + + 胎压单位 + + + + + 正常胎压值 + + + + + 胎压不平衡门限 + + + + + 慢漏气门限 + + + + + 低压阈值 + + + + + 高压阈值 + + + + + 高温阈值 + + + + + 电压阈值 + + + + + 定时上报时间间隔 + + + + + 保留项 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 盲区监测系统参数 + + + + + 盲区监测系统参数Id + + + + + 盲区监测系统参数长度 + + + + + 后方接近报警时间阈值 + + + + + 侧后方接近报警时间阈值 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 状态查询 + + + + + 查询基本信息类型 + 外设状态信息:外设工作状态、设备报警信息 + + + + + 外设ID列表总数 + + + + + 外设ID + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 信息查询 + + + + + 查询基本信息透传类型 + 外设传感器的基本信息:公司信息、 产品代码、 版本号、 外设 ID、 客户代码。对应的消息内容见表 + + + + + 外设ID列表总数 + + + + + 外设ID + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 报警附件上传指令 + + + + + Description + + + + + 服务IP地址长度 + + + + + 服务IP地址 + + + + + TCP端口 + + + + + UDP端口 + + + + + 报警标识号 + + + + + 平台给报警分配的唯一编号 + 32 + + + + + 预留 + + + + + 报警附件上传指令Id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 文件上传完成消息应答 + + + + + 文件上传完成消息应答 + + + + + 文件名称长度 + + + + + 文件名称 + + + + + 文件类型 + + + + + 上传结果 + + + + + 补传数据包数量 + 需要补传的数据包数量,无补传时该值为0 + + + + + 补传数据包列表 + + + + + 文件上传完成消息应答Id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 报警标识号 + 报警附件信息消息数据格式 + + + + + 终端ID + 30 + + + + + YY-MM-DD-hh-mm-ss + BCD[6] + + + + + 序号 + + + + + 附件数量 + + + + + 预留1 + + + + + 预留2 + + + + + 胎压监测系统报警/事件信息 + + + + + 胎压报警位置 + + + + + 报警/事件类型 + + + + + 胎压 + + + + + 胎温 + + + + + 电池电量 + + + + + 附件信息 + + + + + 文件名称长度 + + + + + 文件名称 + 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名 + + + + + 文件大小 + + + + + 补传数据包信息 + + + + + 数据偏移量 + + + + + 数据长度 + + + + + + + + + + 外设ID + + + + + + 消息长度 + + + + + 工作状态 + + + + + + 报警状态 + + + + + + + + + + 外设ID + + + + + + 消息长度 + + + + + 公司名称长度 + + + + + 公司名称 + + + + + 产品型号长度 + + + + + 产品型号 + + + + + 硬件版本号长度 + + + + + 硬件版本号 + ASCII + + + + + 软件版本号长度 + + + + + 软件版本号 + ASCII + + + + + 设备ID长度 + + + + + 设备ID + + + + + 客户代码长度 + + + + + 客户代码 + + diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808_YueBiao_Constants.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808_YueBiao_Constants.cs new file mode 100644 index 0000000..95dfe1f --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808_YueBiao_Constants.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao +{ + /// + /// 主动安全常量 + /// + public static class JT808_YueBiao_Constants + { + /// + /// 附加信息ID 高级驾驶辅助系统报警信息 + /// + public const byte JT808_0X0200_0x64 = 0x64; + /// + /// 附加信息ID 驾驶员状态监测系统报警信息 + /// + public const byte JT808_0X0200_0x65 = 0x65; + /// + /// 附加信息ID 胎压监测系统报警信息 + /// + public const byte JT808_0X0200_0x66 = 0x66; + /// + /// 附加信息ID 盲区监测系统报警信息 + /// + public const byte JT808_0X0200_0x67 = 0x67; + /// + /// 高级驾驶辅助系统参数设置 + /// + public const uint JT808_0X8103_0xF364 = 0xF364; + /// + /// 驾驶员状态监测系统参数设置 + /// + public const uint JT808_0X8103_0xF365 = 0xF365; + /// + /// 胎压监测系统参数设置 + /// + public const uint JT808_0X8103_0xF366 = 0xF366; + /// + /// 盲区监测系统参数设置 + /// + public const uint JT808_0X8103_0xF367 = 0xF367; + /// + /// 状态查询 + /// + public const byte JT808_0X0900_0xF7 = 0xF7; + /// + /// 信息查询 + /// + public const byte JT808_0X0900_0xF8 = 0xF8; + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x64.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x64.cs new file mode 100644 index 0000000..8f92a51 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x64.cs @@ -0,0 +1,352 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 高级驾驶辅助系统报警信息 + /// + public class JT808_0x0200_0x64 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 高级驾驶辅助系统报警信息Id + /// + public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x64; + /// + /// 高级驾驶辅助系统报警信息附加长度 + /// + public override byte AttachInfoLength { get; set; } = 32; + /// + /// 报警ID + /// + public uint AlarmId { get; set; } + /// + /// 标志状态 + /// + public byte FlagState { get; set; } + /// + /// 报警/事件类型 + /// + public byte AlarmOrEventType{ get; set; } + /// + /// 报警/事件类型 + /// + public byte AlarmLevel { get; set; } + /// + /// 前车车速 + /// + public byte VehicleSpeed { get; set; } + /// + /// 前车/行人距离 + /// + public byte CarOrPedestrianDistanceAhead { get; set; } + /// + /// 偏离类型 + /// + public byte DeviateType { get; set; } + /// + /// 道路标志识别类型 + /// + public byte RoadSignIdentificationType { get; set; } + /// + /// 道路标志识别类型 + /// + public byte RoadSignIdentificationData { get; set; } + /// + /// 车速 + /// + public byte Speed { get; set; } + /// + /// 高程 + /// + public ushort Altitude { get; set; } + /// + /// 纬度 + /// + public int Latitude { get; set; } + /// + /// 经度 + /// + public int Longitude { get; set; } + /// + /// 日期时间 + /// YYMMDDhhmmss + /// BCD[6] + /// + public DateTime AlarmTime { get; set; } + /// + /// 车辆状态 + /// + public ushort VehicleState { get; set; } + /// + /// 报警标识号 + /// + public AlarmIdentificationProperty AlarmIdentification { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x64 value = new JT808_0x0200_0x64(); + value.AttachInfoId = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); + value.AttachInfoLength = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); + value.AlarmId = reader.ReadUInt32(); + writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId); + value.FlagState = reader.ReadByte(); + string flagStateString = "未知"; + switch (value.FlagState) + { + case 0: + flagStateString = "不可用"; + break; + case 1: + flagStateString = "开始标志"; + break; + case 2: + flagStateString = "结束标志"; + break; + } + writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState); + value.AlarmOrEventType = reader.ReadByte(); + string alarmOrEventTypeString = ""; + string vehicleSpeedString = "无效"; + string carOrPedestrianDistanceAheadString = "无效"; + string deviateTypeString = "无效"; + string roadSignIdentificationTypeString = "无效"; + switch (value.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "前向碰撞报警"; + vehicleSpeedString = "有效"; + carOrPedestrianDistanceAheadString = "有效"; + break; + case 0x02: + alarmOrEventTypeString = "车道偏离报警"; + vehicleSpeedString = "有效"; + carOrPedestrianDistanceAheadString = "有效"; + deviateTypeString = "有效"; + break; + case 0x03: + alarmOrEventTypeString = "车距过近报警"; + break; + case 0x04: + alarmOrEventTypeString = "行人碰撞报警"; + vehicleSpeedString = "有效"; + break; + case 0x05: + alarmOrEventTypeString = "频繁变道报警"; + break; + case 0x06: + alarmOrEventTypeString = "道路标识超限报警"; + roadSignIdentificationTypeString = "有效"; + break; + case 0x07: + alarmOrEventTypeString = "障碍物报警"; + break; + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + alarmOrEventTypeString = "用户自定义"; + break; + case 0x10: + roadSignIdentificationTypeString = "有效"; + alarmOrEventTypeString = "道路标志识别事件"; + break; + case 0x11: + alarmOrEventTypeString = "主动抓拍事件"; + break; + case 0x12: + alarmOrEventTypeString = "实现变道报警"; + break; + case 0x13: + alarmOrEventTypeString = "车厢过道行人检测报警"; + break; + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + alarmOrEventTypeString = "用户自定义"; + break; + } + writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType); + value.AlarmLevel = reader.ReadByte(); + string alarmLevelString = "未知"; + switch (value.AlarmLevel) + { + case 0x01: + alarmLevelString = "一级报警"; + break; + case 0x02: + alarmLevelString = "二级报警"; + break; + } + writer.WriteNumber($"[{value.AlarmLevel.ReadNumber()}]报警级别-{alarmLevelString}", value.AlarmLevel); + value.VehicleSpeed = reader.ReadByte(); + writer.WriteNumber($"[{value.VehicleSpeed.ReadNumber()}]前车车速-{vehicleSpeedString}", value.VehicleSpeed); + value.CarOrPedestrianDistanceAhead = reader.ReadByte(); + writer.WriteNumber($"[{value.CarOrPedestrianDistanceAhead.ReadNumber()}]前车_行人距离-{carOrPedestrianDistanceAheadString}", value.CarOrPedestrianDistanceAhead); + value.DeviateType = reader.ReadByte(); + string deviateType = value.DeviateType == 0x01 ? "左侧偏离" : "右侧偏离"; + writer.WriteNumber($"[{value.DeviateType.ReadNumber()}]偏离类型-{deviateType}-{deviateTypeString}", value.DeviateType); + value.RoadSignIdentificationType = reader.ReadByte(); + string roadSignIdentificationType = "未知标志"; + if (value.RoadSignIdentificationType == 0x01) + { + roadSignIdentificationType = "限速标志"; + } + else if (value.RoadSignIdentificationType == 0x02) + { + roadSignIdentificationType = "限高标志"; + } + else if (value.RoadSignIdentificationType == 0x03) + { + roadSignIdentificationType = "限重标志"; + } + writer.WriteNumber($"[{value.RoadSignIdentificationType.ReadNumber()}]道路标志识别类型-{roadSignIdentificationType}-{roadSignIdentificationTypeString}", value.RoadSignIdentificationType); + value.RoadSignIdentificationData = reader.ReadByte(); + writer.WriteNumber($"[{value.RoadSignIdentificationData.ReadNumber()}]道路标志识别数据", value.RoadSignIdentificationData); + value.Speed = reader.ReadByte(); + writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed); + value.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); + value.Latitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude); + value.Longitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude); + value.AlarmTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.VehicleState = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState); + var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); + value.AlarmIdentification = new AlarmIdentificationProperty(); + string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString(); + value.AlarmIdentification.TerminalId = reader.ReadString(30); + value.AlarmIdentification.Time = reader.ReadDateTime6(); + value.AlarmIdentification.SN = reader.ReadByte(); + value.AlarmIdentification.AttachCount = reader.ReadByte(); + value.AlarmIdentification.Retain1 = reader.ReadByte(); + value.AlarmIdentification.Retain2 = reader.ReadByte(); + writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId); + writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN); + writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount); + writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1); + writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2); + } + /// + /// + /// + /// + /// + /// + public JT808_0x0200_0x64 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0200_0x64 value = new JT808_0x0200_0x64(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.AlarmId = reader.ReadUInt32(); + value.FlagState = reader.ReadByte(); + value.AlarmOrEventType = reader.ReadByte(); + value.AlarmLevel = reader.ReadByte(); + value.VehicleSpeed = reader.ReadByte(); + value.CarOrPedestrianDistanceAhead = reader.ReadByte(); + value.DeviateType = reader.ReadByte(); + value.RoadSignIdentificationType = reader.ReadByte(); + value.RoadSignIdentificationData = reader.ReadByte(); + value.Speed = reader.ReadByte(); + value.Altitude = reader.ReadUInt16(); + value.Latitude = (int)reader.ReadUInt32(); + value.Longitude = (int)reader.ReadUInt32(); + value.AlarmTime = reader.ReadDateTime6(); + value.VehicleState = reader.ReadUInt16(); + value.AlarmIdentification = new AlarmIdentificationProperty + { + TerminalId = reader.ReadString(30), + Time = reader.ReadDateTime6(), + SN = reader.ReadByte(), + AttachCount = reader.ReadByte(), + Retain1 = reader.ReadByte(), + Retain2 = reader.ReadByte() + }; + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x64 value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + writer.WriteByte(value.AttachInfoLength); + writer.WriteUInt32(value.AlarmId); + writer.WriteByte(value.FlagState); + writer.WriteByte(value.AlarmOrEventType); + writer.WriteByte(value.AlarmLevel); + writer.WriteByte(value.VehicleSpeed); + writer.WriteByte(value.CarOrPedestrianDistanceAhead); + writer.WriteByte(value.DeviateType); + writer.WriteByte(value.RoadSignIdentificationType); + writer.WriteByte(value.RoadSignIdentificationData); + writer.WriteByte(value.Speed); + writer.WriteUInt16(value.Altitude); + writer.WriteUInt32((uint)value.Latitude); + writer.WriteUInt32((uint)value.Longitude); + writer.WriteDateTime6(value.AlarmTime); + writer.WriteUInt16(value.VehicleState); + if (value.AlarmIdentification == null) { + throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空"); + } + writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0')); + writer.WriteDateTime6(value.AlarmIdentification.Time); + writer.WriteByte(value.AlarmIdentification.SN); + writer.WriteByte(value.AlarmIdentification.AttachCount); + writer.WriteByte(value.AlarmIdentification.Retain1); + writer.WriteByte(value.AlarmIdentification.Retain2); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x65.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x65.cs new file mode 100644 index 0000000..6f18db6 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x65.cs @@ -0,0 +1,315 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 驾驶员状态监测系统报警信息 + /// + public class JT808_0x0200_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 驾驶员状态监测系统报警信息Id + /// + public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x65; + /// + /// 驾驶员状态监测系统报警信息长度 + /// + public override byte AttachInfoLength { get; set; } = 47; + /// + /// 报警ID + /// + public uint AlarmId { get; set; } + /// + /// 标志状态 + /// + public byte FlagState { get; set; } + /// + /// 报警/事件类型 + /// + public byte AlarmOrEventType{ get; set; } + /// + /// 报警级别 + /// + public byte AlarmLevel { get; set; } + /// + /// 疲劳程度 + /// + public byte Fatigue { get; set; } + /// + /// 预留 + /// + public byte[] Retain { get; set; } = new byte[4]; + /// + /// 车速 + /// + public byte Speed { get; set; } + /// + /// 高程 + /// + public ushort Altitude { get; set; } + /// + /// 纬度 + /// + public int Latitude { get; set; } + /// + /// 经度 + /// + public int Longitude { get; set; } + /// + /// 日期时间 + /// YYMMDDhhmmss + /// BCD[6] + /// + public DateTime AlarmTime { get; set; } + /// + /// 车辆状态 + /// + public ushort VehicleState { get; set; } + /// + /// 报警标识号 + /// + public AlarmIdentificationProperty AlarmIdentification { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x65 value = new JT808_0x0200_0x65(); + value.AttachInfoId = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); + value.AttachInfoLength = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); + value.AlarmId = reader.ReadUInt32(); + writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId); + value.FlagState = reader.ReadByte(); + string flagStateString = "未知"; + switch (value.FlagState) + { + case 0: + flagStateString = "不可用"; + break; + case 1: + flagStateString = "开始标志"; + break; + case 2: + flagStateString = "结束标志"; + break; + } + writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState); + value.AlarmOrEventType = reader.ReadByte(); + string alarmOrEventTypeString = ""; + switch (value.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "疲劳驾驶报警"; + break; + case 0x02: + alarmOrEventTypeString = "接打手持电话报警"; + break; + case 0x03: + alarmOrEventTypeString = "抽烟报警"; + break; + case 0x04: + alarmOrEventTypeString = "不目视前方报警"; + break; + case 0x05: + alarmOrEventTypeString = "驾驶员异常报警"; + break; + case 0x06: + alarmOrEventTypeString = "探头遮挡报警"; + break; + case 0x07: + alarmOrEventTypeString = "用户自定义"; + break; + case 0x08: + alarmOrEventTypeString = "超时驾驶报警"; + break; + case 0x09: + alarmOrEventTypeString = "用户自定义"; + break; + case 0x0A: + alarmOrEventTypeString = "未系安全带报警"; + break; + case 0x0B: + alarmOrEventTypeString = "红外阻断型墨镜失效报警"; + break; + case 0x0C: + alarmOrEventTypeString = "双脱把报警(双手同时脱离方向盘)"; + break; + case 0x0D: + alarmOrEventTypeString = "玩手机报警"; + break; + case 0x0E: + case 0x0F: + alarmOrEventTypeString = "用户自定义"; + break; + case 0x10: + alarmOrEventTypeString = "自动抓拍事件"; + break; + case 0x11: + alarmOrEventTypeString = "驾驶员变更事件"; + break; + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + alarmOrEventTypeString = "用户自定义"; + break; + } + writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType); + value.AlarmLevel = reader.ReadByte(); + string alarmLevelString = "未知"; + switch (value.AlarmLevel) + { + case 0x01: + alarmLevelString = "一级报警"; + break; + case 0x02: + alarmLevelString = "二级报警"; + break; + } + writer.WriteNumber($"[{value.AlarmLevel.ReadNumber()}]报警级别-{alarmLevelString}", value.AlarmLevel); + value.Fatigue = reader.ReadByte(); + writer.WriteNumber($"[{value.Fatigue.ReadNumber()}]疲劳程度", value.Fatigue); + value.Retain = reader.ReadArray(4).ToArray(); + writer.WriteString("预留", value.Retain.ToHexString()); + value.Speed = reader.ReadByte(); + writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed); + value.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); + value.Latitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude); + value.Longitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude); + value.AlarmTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.VehicleState = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState); + var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); + value.AlarmIdentification = new AlarmIdentificationProperty(); + string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString(); + value.AlarmIdentification.TerminalId = reader.ReadString(30); + value.AlarmIdentification.Time = reader.ReadDateTime6(); + value.AlarmIdentification.SN = reader.ReadByte(); + value.AlarmIdentification.AttachCount = reader.ReadByte(); + value.AlarmIdentification.Retain1 = reader.ReadByte(); + value.AlarmIdentification.Retain2 = reader.ReadByte(); + writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId); + writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN); + writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount); + writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1); + writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2); + } + /// + /// + /// + /// + /// + /// + public JT808_0x0200_0x65 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0200_0x65 value = new JT808_0x0200_0x65(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.AlarmId = reader.ReadUInt32(); + value.FlagState = reader.ReadByte(); + value.AlarmOrEventType = reader.ReadByte(); + value.AlarmLevel = reader.ReadByte(); + value.Fatigue = reader.ReadByte(); + value.Retain = reader.ReadArray(4).ToArray(); + value.Speed = reader.ReadByte(); + value.Altitude = reader.ReadUInt16(); + value.Latitude = (int)reader.ReadUInt32(); + value.Longitude = (int)reader.ReadUInt32(); + value.AlarmTime = reader.ReadDateTime6(); + value.VehicleState = reader.ReadUInt16(); + value.AlarmIdentification = new AlarmIdentificationProperty + { + TerminalId = reader.ReadString(30), + Time = reader.ReadDateTime6(), + SN = reader.ReadByte(), + AttachCount = reader.ReadByte(), + Retain1 = reader.ReadByte(), + Retain2 = reader.ReadByte() + }; + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x65 value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + writer.WriteByte(value.AttachInfoLength); + writer.WriteUInt32(value.AlarmId); + writer.WriteByte(value.FlagState); + writer.WriteByte(value.AlarmOrEventType); + writer.WriteByte(value.AlarmLevel); + writer.WriteByte(value.Fatigue); + if (value.Retain.Length != 4) + { + throw new ArgumentOutOfRangeException($"{nameof(JT808_0x0200_0x65.Retain)} length==4"); + } + writer.WriteArray(value.Retain); + writer.WriteByte(value.Speed); + writer.WriteUInt16(value.Altitude); + writer.WriteUInt32((uint)value.Latitude); + writer.WriteUInt32((uint)value.Longitude); + writer.WriteDateTime6(value.AlarmTime); + writer.WriteUInt16(value.VehicleState); + if (value.AlarmIdentification == null) + { + throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空"); + } + writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0')); + writer.WriteDateTime6(value.AlarmIdentification.Time); + writer.WriteByte(value.AlarmIdentification.SN); + writer.WriteByte(value.AlarmIdentification.AttachCount); + writer.WriteByte(value.AlarmIdentification.Retain1); + writer.WriteByte(value.AlarmIdentification.Retain2); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x66.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x66.cs new file mode 100644 index 0000000..163c6e5 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x66.cs @@ -0,0 +1,316 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 胎压监测系统报警信息 + /// + public class JT808_0x0200_0x66 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 胎压监测系统报警信息Id + /// + public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x66; + /// + /// 胎压监测系统报警信息长度 + /// + public override byte AttachInfoLength { get; set; } + /// + /// 报警ID + /// + public uint AlarmId { get; set; } + /// + /// 标志状态 + /// + public byte FlagState { get; set; } + /// + /// 车速 + /// + public byte Speed { get; set; } + /// + /// 高程 + /// + public ushort Altitude { get; set; } + /// + /// 纬度 + /// + public int Latitude { get; set; } + /// + /// 经度 + /// + public int Longitude { get; set; } + /// + /// 日期时间 + /// YYMMDDhhmmss + /// BCD[6] + /// + public DateTime AlarmTime { get; set; } + /// + /// 车辆状态 + /// + public ushort VehicleState { get; set; } + /// + /// 报警标识号 + /// + public AlarmIdentificationProperty AlarmIdentification { get; set; } + /// + /// 报警/事件列表总数 + /// + public byte AlarmOrEventCount { get; set; } + /// + /// 报警/事件信息列表 + /// + public List AlarmOrEvents { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x66 value = new JT808_0x0200_0x66(); + value.AttachInfoId = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); + value.AttachInfoLength = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); + value.AlarmId = reader.ReadUInt32(); + writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId); + value.FlagState = reader.ReadByte(); + string flagStateString = "未知"; + switch (value.FlagState) + { + case 0: + flagStateString = "不可用"; + break; + case 1: + flagStateString = "开始标志"; + break; + case 2: + flagStateString = "结束标志"; + break; + } + writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState); + value.Speed = reader.ReadByte(); + writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed); + value.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); + value.Latitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude); + value.Longitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude); + value.AlarmTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.VehicleState = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState); + var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); + value.AlarmIdentification = new AlarmIdentificationProperty(); + string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString(); + value.AlarmIdentification.TerminalId = reader.ReadString(30); + value.AlarmIdentification.Time = reader.ReadDateTime6(); + value.AlarmIdentification.SN = reader.ReadByte(); + value.AlarmIdentification.AttachCount = reader.ReadByte(); + value.AlarmIdentification.Retain1 = reader.ReadByte(); + value.AlarmIdentification.Retain2 = reader.ReadByte(); + writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId); + writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN); + writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount); + writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1); + writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2); + value.AlarmOrEventCount = reader.ReadByte(); + writer.WriteNumber($"[{value.AlarmOrEventCount.ReadNumber()}]报警_事件列表总数", value.AlarmOrEventCount); + if (value.AlarmOrEventCount > 0) + { + writer.WriteStartArray("报警_事件列表"); + for (int i = 0; i < value.AlarmOrEventCount; i++) + { + writer.WriteStartObject(); + AlarmOrEventProperty item = new AlarmOrEventProperty(); + item.TirePressureAlarmPosition = reader.ReadByte(); + writer.WriteNumber($"[{item.TirePressureAlarmPosition.ReadNumber()}]胎压报警位置", item.TirePressureAlarmPosition); + item.AlarmOrEventType = reader.ReadUInt16(); + string alarmOrEventTypeString = ""; + switch (item.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "前向碰撞报警"; + break; + case 0x02: + alarmOrEventTypeString = "车道偏离报警"; + break; + case 0x03: + alarmOrEventTypeString = "车距过近报警"; + break; + case 0x04: + alarmOrEventTypeString = "行人碰撞报警"; + break; + case 0x05: + alarmOrEventTypeString = "频繁变道报警"; + break; + case 0x06: + alarmOrEventTypeString = "道路标识超限报警"; + break; + case 0x07: + alarmOrEventTypeString = "障碍物报警"; + break; + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + alarmOrEventTypeString = "用户自定义"; + break; + case 0x10: + alarmOrEventTypeString = "道路标志识别事件"; + break; + case 0x11: + alarmOrEventTypeString = "主动抓拍事件"; + break; + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + alarmOrEventTypeString = "用户自定义"; + break; + } + writer.WriteNumber($"[{item.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", item.AlarmOrEventType); + item.TirePressure = reader.ReadUInt16(); + writer.WriteNumber($"[{item.TirePressure.ReadNumber()}]胎压Kpa", item.TirePressure); + item.TireTemperature = reader.ReadUInt16(); + writer.WriteNumber($"[{item.TireTemperature.ReadNumber()}]胎温℃", item.TireTemperature); + item.BatteryLevel = reader.ReadUInt16(); + writer.WriteNumber($"[{item.BatteryLevel.ReadNumber()}]电池电量%", item.BatteryLevel); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + /// + /// + /// + /// + /// + /// + public JT808_0x0200_0x66 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0200_0x66 value = new JT808_0x0200_0x66(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.AlarmId = reader.ReadUInt32(); + value.FlagState = reader.ReadByte(); + value.Speed = reader.ReadByte(); + value.Altitude = reader.ReadUInt16(); + value.Latitude = (int)reader.ReadUInt32(); + value.Longitude = (int)reader.ReadUInt32(); + value.AlarmTime = reader.ReadDateTime6(); + value.VehicleState = reader.ReadUInt16(); + value.AlarmIdentification = new AlarmIdentificationProperty + { + TerminalId = reader.ReadString(30), + Time = reader.ReadDateTime6(), + SN = reader.ReadByte(), + AttachCount = reader.ReadByte(), + Retain1 = reader.ReadByte(), + Retain2 = reader.ReadByte() + }; + value.AlarmOrEventCount = reader.ReadByte(); + if (value.AlarmOrEventCount > 0) + { + value.AlarmOrEvents = new List(); + for (int i = 0; i < value.AlarmOrEventCount; i++) + { + AlarmOrEventProperty alarmOrEventProperty = new AlarmOrEventProperty(); + alarmOrEventProperty.TirePressureAlarmPosition = reader.ReadByte(); + alarmOrEventProperty.AlarmOrEventType = reader.ReadUInt16(); + alarmOrEventProperty.TirePressure = reader.ReadUInt16(); + alarmOrEventProperty.TireTemperature = reader.ReadUInt16(); + alarmOrEventProperty.BatteryLevel = reader.ReadUInt16(); + value.AlarmOrEvents.Add(alarmOrEventProperty); + } + } + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x66 value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + writer.Skip(1, out int AttachInfoLengthPosition); + writer.WriteUInt32(value.AlarmId); + writer.WriteByte(value.FlagState); + writer.WriteByte(value.Speed); + writer.WriteUInt16(value.Altitude); + writer.WriteUInt32((uint)value.Latitude); + writer.WriteUInt32((uint)value.Longitude); + writer.WriteDateTime6(value.AlarmTime); + writer.WriteUInt16(value.VehicleState); + if (value.AlarmIdentification == null) + { + throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空"); + } + writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0')); + writer.WriteDateTime6(value.AlarmIdentification.Time); + writer.WriteByte(value.AlarmIdentification.SN); + writer.WriteByte(value.AlarmIdentification.AttachCount); + writer.WriteByte(value.AlarmIdentification.Retain1); + writer.WriteByte(value.AlarmIdentification.Retain2); + if (value.AlarmOrEvents.Count > 0) + { + writer.WriteByte((byte)value.AlarmOrEvents.Count); + foreach (var item in value.AlarmOrEvents) + { + writer.WriteByte(item.TirePressureAlarmPosition); + writer.WriteUInt16(item.AlarmOrEventType); + writer.WriteUInt16(item.TirePressure); + writer.WriteUInt16(item.TireTemperature); + writer.WriteUInt16(item.BatteryLevel); + } + } + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - AttachInfoLengthPosition - 1), AttachInfoLengthPosition); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x67.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x67.cs new file mode 100644 index 0000000..2dacb56 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x67.cs @@ -0,0 +1,283 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 盲区监测系统报警信息 + /// + public class JT808_0x0200_0x67 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 盲区监测系统报警信息Id + /// + public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x67; + /// + /// 盲区监测系统报警信息长度 + /// + public override byte AttachInfoLength { get; set; } = 26; + /// + /// 报警ID + /// + public uint AlarmId { get; set; } + /// + /// 标志状态 + /// + public byte FlagState { get; set; } + /// + /// 报警/事件类型 + /// + public byte AlarmOrEventType{ get; set; } + /// + /// 报警/事件类型 + /// + public byte AlarmLevel { get; set; } + /// + /// 车速 + /// + public byte Speed { get; set; } + /// + /// 高程 + /// + public ushort Altitude { get; set; } + /// + /// 纬度 + /// + public int Latitude { get; set; } + /// + /// 经度 + /// + public int Longitude { get; set; } + /// + /// 日期时间 + /// YYMMDDhhmmss + /// BCD[6] + /// + public DateTime AlarmTime { get; set; } + /// + /// 车辆状态 + /// + public ushort VehicleState { get; set; } + /// + /// 报警标识号 + /// + public AlarmIdentificationProperty AlarmIdentification { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0200_0x67 value = new JT808_0x0200_0x67(); + value.AttachInfoId = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); + value.AttachInfoLength = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); + value.AlarmId = reader.ReadUInt32(); + writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId); + value.FlagState = reader.ReadByte(); + string flagStateString = "未知"; + switch (value.FlagState) + { + case 0: + flagStateString = "不可用"; + break; + case 1: + flagStateString = "开始标志"; + break; + case 2: + flagStateString = "结束标志"; + break; + } + writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState); + value.AlarmOrEventType = reader.ReadByte(); + string alarmOrEventTypeString = ""; + switch (value.AlarmOrEventType) + { + case 0x01: + alarmOrEventTypeString = "前向碰撞报警"; + break; + case 0x02: + alarmOrEventTypeString = "车道偏离报警"; + break; + case 0x03: + alarmOrEventTypeString = "车距过近报警"; + break; + case 0x04: + alarmOrEventTypeString = "行人碰撞报警"; + break; + case 0x05: + alarmOrEventTypeString = "频繁变道报警"; + break; + case 0x06: + alarmOrEventTypeString = "道路标识超限报警"; + break; + case 0x07: + alarmOrEventTypeString = "障碍物报警"; + break; + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + alarmOrEventTypeString = "用户自定义"; + break; + case 0x10: + alarmOrEventTypeString = "道路标志识别事件"; + break; + case 0x11: + alarmOrEventTypeString = "主动抓拍事件"; + break; + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + alarmOrEventTypeString = "用户自定义"; + break; + } + writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType); + value.AlarmLevel = reader.ReadByte(); + string alarmLevelString = "未知"; + switch (value.AlarmLevel) + { + case 0x01: + alarmLevelString = "一级报警"; + break; + case 0x02: + alarmLevelString = "二级报警"; + break; + } + writer.WriteNumber($"[{value.AlarmLevel.ReadNumber()}]报警级别-{alarmLevelString}", value.AlarmLevel); + value.Speed = reader.ReadByte(); + writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed); + value.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); + value.Latitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude); + value.Longitude = (int)reader.ReadUInt32(); + writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude); + value.AlarmTime = reader.ReadDateTime6(); + writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss")); + value.VehicleState = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState); + var vehicleStateBits=Convert.ToString(value.VehicleState, 2).PadLeft(16, '0'); + writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]"); + writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12]=='0'?"关闭":"打开"); + writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动"); + writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡"); + writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString()); + writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString()); + writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString()); + writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString()); + writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位"); + writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString()); + writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString()); + writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString()); + writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString()); + writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString()); + writer.WriteEndObject(); + value.AlarmIdentification = new AlarmIdentificationProperty(); + string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString(); + value.AlarmIdentification.TerminalId = reader.ReadString(30); + value.AlarmIdentification.Time = reader.ReadDateTime6(); + value.AlarmIdentification.SN = reader.ReadByte(); + value.AlarmIdentification.AttachCount = reader.ReadByte(); + value.AlarmIdentification.Retain1 = reader.ReadByte(); + value.AlarmIdentification.Retain2 = reader.ReadByte(); + writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId); + writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN); + writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount); + writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1); + writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2); + } + /// + /// + /// + /// + /// + /// + public JT808_0x0200_0x67 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0200_0x67 value = new JT808_0x0200_0x67(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.AlarmId = reader.ReadUInt32(); + value.FlagState = reader.ReadByte(); + value.AlarmOrEventType = reader.ReadByte(); + value.AlarmLevel = reader.ReadByte(); + value.Speed = reader.ReadByte(); + value.Altitude = reader.ReadUInt16(); + value.Latitude = (int)reader.ReadUInt32(); + value.Longitude = (int)reader.ReadUInt32(); + value.AlarmTime = reader.ReadDateTime6(); + value.VehicleState = reader.ReadUInt16(); + value.AlarmIdentification = new AlarmIdentificationProperty + { + TerminalId = reader.ReadString(30), + Time = reader.ReadDateTime6(), + SN = reader.ReadByte(), + AttachCount = reader.ReadByte(), + Retain1 = reader.ReadByte(), + Retain2 = reader.ReadByte() + }; + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x67 value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + writer.WriteByte(value.AttachInfoLength); + writer.WriteUInt32(value.AlarmId); + writer.WriteByte(value.FlagState); + writer.WriteByte(value.AlarmOrEventType); + writer.WriteByte(value.AlarmLevel); + writer.WriteByte(value.Speed); + writer.WriteUInt16(value.Altitude); + writer.WriteUInt32((uint)value.Latitude); + writer.WriteUInt32((uint)value.Longitude); + writer.WriteDateTime6(value.AlarmTime); + writer.WriteUInt16(value.VehicleState); + if (value.AlarmIdentification == null) + { + throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空"); + } + writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0')); + writer.WriteDateTime6(value.AlarmIdentification.Time); + writer.WriteByte(value.AlarmIdentification.SN); + writer.WriteByte(value.AlarmIdentification.AttachCount); + writer.WriteByte(value.AlarmIdentification.Retain1); + writer.WriteByte(value.AlarmIdentification.Retain2); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF7.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF7.cs new file mode 100644 index 0000000..811ff9a --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF7.cs @@ -0,0 +1,122 @@ +using JT808.Protocol.Extensions.YueBiao.Enums; +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 透传数据 + /// + public class JT808_0x0900_0xF7 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 透传类型 + /// + public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF7; + /// + /// 消息列表总数 + /// + public byte USBMessageCount { get; set; } + /// + /// 消息列表数据 + /// + public List USBMessages { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0900_0xF7 value = new JT808_0x0900_0xF7(); + value.USBMessageCount = reader.ReadByte(); + writer.WriteNumber($"[{value.USBMessageCount.ReadNumber()}]消息列表总数", value.USBMessageCount); + if (value.USBMessageCount > 0) + { + writer.WriteStartArray("消息列表"); + for (int i = 0; i < value.USBMessageCount; i++) + { + writer.WriteStartObject(); + JT808_0x0900_0xF7_USB item = new JT808_0x0900_0xF7_USB(); + item.USBID = reader.ReadByte(); + writer.WriteNumber($"[{item.USBID.ReadNumber()}]外设ID", item.USBID); + item.MessageLength = reader.ReadByte(); + writer.WriteNumber($"[{item.MessageLength.ReadNumber()}]消息长度", item.MessageLength); + item.WorkingCondition = reader.ReadByte(); + var workingCondition = (WorkingConditionType)item.WorkingCondition; + writer.WriteNumber($"[{item.WorkingCondition.ReadNumber()}]工作状态-{workingCondition.ToString()}", item.WorkingCondition); + item.AlarmStatus = reader.ReadUInt32(); + writer.WriteNumber($"[{item.AlarmStatus.ReadNumber()}]报警状态", item.AlarmStatus); + var alarmStatusBits = Convert.ToString(item.AlarmStatus, 2).PadLeft(32, '0').AsSpan(); + writer.WriteStartObject($"报警状态对象[{alarmStatusBits.ToString()}]"); + writer.WriteString($"[bit12~bit31]预留", alarmStatusBits.Slice(12).ToString()); + writer.WriteString($"]bit11]定位模块异常", alarmStatusBits[11].ToString()); + writer.WriteString($"[bit10]通讯模块异常", alarmStatusBits[10].ToString()); + writer.WriteString($"[bit6~bit9]预留", alarmStatusBits.Slice(6,4).ToString()); + writer.WriteString($"[bit5]电池异常", alarmStatusBits[5].ToString()); + writer.WriteString($"[bit4]扬声器异常", alarmStatusBits[4].ToString()); + writer.WriteString($"[bit3]红外补光异常", alarmStatusBits[3].ToString()); + writer.WriteString($"[bit2]辅存储器异常", alarmStatusBits[2].ToString()); + writer.WriteString($"[bit1]主存储器异常", alarmStatusBits[1].ToString()); + writer.WriteString($"[bit0]摄像头异常", alarmStatusBits[0].ToString()); + writer.WriteEndObject(); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + /// + /// + /// + /// + /// + /// + public JT808_0x0900_0xF7 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0900_0xF7 value = new JT808_0x0900_0xF7(); + value.USBMessageCount = reader.ReadByte(); + if (value.USBMessageCount > 0) + { + value.USBMessages = new List(); + for (int i = 0; i < value.USBMessageCount; i++) + { + JT808_0x0900_0xF7_USB item = new JT808_0x0900_0xF7_USB(); + item.USBID = reader.ReadByte(); + item.MessageLength = reader.ReadByte(); + item.WorkingCondition = reader.ReadByte(); + item.AlarmStatus = reader.ReadUInt32(); + value.USBMessages.Add(item); + } + } + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0900_0xF7 value, IJT808Config config) + { + if (value.USBMessages != null && value.USBMessages.Count > 0) + { + writer.WriteByte((byte)value.USBMessages.Count); + foreach (var item in value.USBMessages) + { + writer.WriteByte(item.USBID); + writer.WriteByte(5); + writer.WriteByte(item.WorkingCondition); + writer.WriteUInt32(item.AlarmStatus); + } + } + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF8.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF8.cs new file mode 100644 index 0000000..1ae0f4c --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF8.cs @@ -0,0 +1,175 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 透传数据 + /// + public class JT808_0x0900_0xF8 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 透传类型 + /// + public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF8; + /// + /// 消息列表总数 + /// + public byte USBMessageCount { get; set; } + /// + /// + /// + public List USBMessages { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x0900_0xF8 value = new JT808_0x0900_0xF8(); + value.USBMessageCount = reader.ReadByte(); + writer.WriteNumber($"[{value.USBMessageCount.ReadNumber()}]消息列表总数", value.USBMessageCount); + if (value.USBMessageCount > 0) + { + writer.WriteStartArray("消息列表"); + for (int i = 0; i < value.USBMessageCount; i++) + { + writer.WriteStartObject(); + JT808_0x0900_0xF8_USB item = new JT808_0x0900_0xF8_USB(); + item.USBID = reader.ReadByte(); + writer.WriteNumber($"[{item.USBID.ReadNumber()}]外设ID", item.USBID); + item.MessageLength = reader.ReadByte(); + writer.WriteNumber($"[{item.MessageLength.ReadNumber()}]消息长度", item.MessageLength); + item.CompantNameLength = reader.ReadByte(); + writer.WriteNumber($"[{item.CompantNameLength.ReadNumber()}]公司名称长度", item.CompantNameLength); + + string compantNameHex = reader.ReadVirtualArray(item.CompantNameLength).ToArray().ToHexString(); + item.CompantName = reader.ReadString(item.CompantNameLength); + writer.WriteString($"[{compantNameHex}]公司名称", item.CompantName); + + item.ProductModelLength = reader.ReadByte(); + writer.WriteNumber($"[{item.ProductModelLength.ReadNumber()}]产品型号长度", item.ProductModelLength); + + string productModelHex = reader.ReadVirtualArray(item.ProductModelLength).ToArray().ToHexString(); + item.ProductModel = reader.ReadString(item.ProductModelLength); + writer.WriteString($"[{productModelHex}]产品型号", item.ProductModel); + + item.HardwareVersionNumberLength = reader.ReadByte(); + writer.WriteNumber($"[{item.HardwareVersionNumberLength.ReadNumber()}]硬件版本号长度", item.HardwareVersionNumberLength); + string hardwareVersionNumberHex = reader.ReadVirtualArray(item.HardwareVersionNumberLength).ToArray().ToHexString(); + item.HardwareVersionNumber = reader.ReadString(item.HardwareVersionNumberLength); + writer.WriteString($"[{hardwareVersionNumberHex}]硬件版本号", item.HardwareVersionNumber); + + item.SoftwareVersionNumberLength = reader.ReadByte(); + writer.WriteNumber($"[{item.SoftwareVersionNumberLength.ReadNumber()}]软件版本号长度", item.SoftwareVersionNumberLength); + string softwareVersionNumberHex = reader.ReadVirtualArray(item.SoftwareVersionNumberLength).ToArray().ToHexString(); + item.SoftwareVersionNumber = reader.ReadString(item.SoftwareVersionNumberLength); + writer.WriteString($"[{softwareVersionNumberHex}]软件版本号", item.SoftwareVersionNumber); + + item.DevicesIDLength = reader.ReadByte(); + writer.WriteNumber($"[{item.DevicesIDLength.ReadNumber()}]设备ID长度", item.DevicesIDLength); + string devicesIDHex = reader.ReadVirtualArray(item.DevicesIDLength).ToArray().ToHexString(); + item.DevicesID = reader.ReadString(item.DevicesIDLength); + writer.WriteString($"[{devicesIDHex}]设备ID", item.DevicesID); + + item.CustomerCodeLength = reader.ReadByte(); + writer.WriteNumber($"[{item.CustomerCodeLength.ReadNumber()}]客户代码长度", item.CustomerCodeLength); + string customerCodeHex = reader.ReadVirtualArray(item.CustomerCodeLength).ToArray().ToHexString(); + item.CustomerCode = reader.ReadString(item.CustomerCodeLength); + writer.WriteString($"[{customerCodeHex}]客户代码", item.CustomerCode); + + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + /// + /// + /// + /// + /// + /// + public JT808_0x0900_0xF8 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0900_0xF8 value = new JT808_0x0900_0xF8(); + value.USBMessageCount = reader.ReadByte(); + if (value.USBMessageCount > 0) + { + value.USBMessages = new List(); + for (int i = 0; i < value.USBMessageCount; i++) + { + JT808_0x0900_0xF8_USB item = new JT808_0x0900_0xF8_USB(); + item.USBID = reader.ReadByte(); + item.MessageLength = reader.ReadByte(); + item.CompantNameLength = reader.ReadByte(); + item.CompantName = reader.ReadString(item.CompantNameLength); + item.ProductModelLength = reader.ReadByte(); + item.ProductModel = reader.ReadString(item.ProductModelLength); + item.HardwareVersionNumberLength = reader.ReadByte(); + item.HardwareVersionNumber = reader.ReadString(item.HardwareVersionNumberLength); + item.SoftwareVersionNumberLength = reader.ReadByte(); + item.SoftwareVersionNumber = reader.ReadString(item.SoftwareVersionNumberLength); + item.DevicesIDLength = reader.ReadByte(); + item.DevicesID = reader.ReadString(item.DevicesIDLength); + item.CustomerCodeLength = reader.ReadByte(); + item.CustomerCode = reader.ReadString(item.CustomerCodeLength); + value.USBMessages.Add(item); + } + } + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0900_0xF8 value, IJT808Config config) + { + if (value.USBMessages != null && value.USBMessages.Count > 0) + { + writer.WriteByte((byte)value.USBMessages.Count); + foreach (var item in value.USBMessages) + { + writer.WriteByte(item.USBID); + writer.Skip(1,out int messageLengthPosition); + + writer.Skip(1, out int CompantNameLengthPosition); + writer.WriteString(item.CompantName); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - CompantNameLengthPosition - 1), CompantNameLengthPosition); + + writer.Skip(1, out int ProductModelLengthPosition); + writer.WriteString(item.ProductModel); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ProductModelLengthPosition - 1), ProductModelLengthPosition); + + writer.Skip(1, out int HardwareVersionNumberLengthPosition); + writer.WriteString(item.HardwareVersionNumber); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - HardwareVersionNumberLengthPosition - 1), HardwareVersionNumberLengthPosition); + + writer.Skip(1, out int SoftwareVersionNumberLengthPosition); + writer.WriteString(item.SoftwareVersionNumber); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - SoftwareVersionNumberLengthPosition - 1), SoftwareVersionNumberLengthPosition); + + writer.Skip(1, out int DevicesIDLengthPosition); + writer.WriteString(item.DevicesID); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - DevicesIDLengthPosition - 1), DevicesIDLengthPosition); + + writer.Skip(1, out int CustomerCodeLengthPosition); + writer.WriteString(item.CustomerCode); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - CustomerCodeLengthPosition - 1), CustomerCodeLengthPosition); + + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - messageLengthPosition - 1), messageLengthPosition); + } + } + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1210.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1210.cs new file mode 100644 index 0000000..d766050 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1210.cs @@ -0,0 +1,179 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +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.YueBiao.MessageBody +{ + /// + /// 报警附件信息消息 + /// + public class JT808_0x1210: JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze,IJT808_2019_Version + { + /// + /// 终端 ID + /// 30 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00” + /// + public string TerminalId { get; set; } + /// + /// 报警标识号 + /// + public AlarmIdentificationProperty AlarmIdentification { get; set; } + /// + /// 平台给报警分配的唯一编号 + /// 32 + /// + public string AlarmId { get; set; } + /// + /// 信息类型 + /// 0x00:正常报警文件信息 + /// 0x01:补传报警文件信息 + /// + public byte InfoType { get; set; } + /// + /// 附件数量 + /// + public byte AttachCount { get; set; } + /// + /// 附件信息列表 + /// + public List AttachInfos { get; set; } + /// + /// 报警附件信息消息Id + /// + public override ushort MsgId => 0x1210; + /// + /// 报警附件信息消息 + /// + public override string Description => "报警附件信息消息"; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x1210 value = new JT808_0x1210(); + string makerIdHex=reader.ReadVirtualArray(30).ToArray().ToHexString(); + value.TerminalId = reader.ReadString(30); + writer.WriteString($"[{makerIdHex}]终端ID", value.TerminalId); + value.AlarmIdentification = new AlarmIdentificationProperty(); + string terminalIdHex = reader.ReadVirtualArray(30).ToArray().ToHexString(); + value.AlarmIdentification.TerminalId = reader.ReadString(30); + value.AlarmIdentification.Time = reader.ReadDateTime6(); + value.AlarmIdentification.SN = reader.ReadByte(); + value.AlarmIdentification.AttachCount = reader.ReadByte(); + value.AlarmIdentification.Retain1 = reader.ReadByte(); + value.AlarmIdentification.Retain2 = reader.ReadByte(); + writer.WriteString($"[{terminalIdHex}]终端ID", value.AlarmIdentification.TerminalId); + writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN); + writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount); + writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1); + writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2); + string alarmIdHex = reader.ReadVirtualArray(32).ToArray().ToHexString(); + value.AlarmId = reader.ReadString(32); + writer.WriteString($"[{alarmIdHex}]平台给报警分配的唯一编号", value.AlarmId); + value.InfoType = reader.ReadByte(); + writer.WriteNumber($"[{value.InfoType.ReadNumber()}]信息类型", value.InfoType); + value.AttachCount = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachCount.ReadNumber()}]附件数量", value.AttachCount); + if (value.AttachCount > 0) + { + writer.WriteStartArray("附件信息列表"); + for (int i = 0; i < value.AttachCount; i++) + { + writer.WriteStartObject(); + AttachProperty attachProperty = new AttachProperty(); + attachProperty.FileNameLength = reader.ReadByte(); + writer.WriteNumber($"[{attachProperty.FileNameLength.ReadNumber()}]文件名称长度", attachProperty.FileNameLength); + string fileNameHex = reader.ReadVirtualArray(attachProperty.FileNameLength).ToArray().ToHexString(); + attachProperty.FileName = reader.ReadString(attachProperty.FileNameLength); + writer.WriteString($"[{fileNameHex}]文件名称", attachProperty.FileName); + attachProperty.FileSize = reader.ReadUInt32(); + writer.WriteNumber($"[{ attachProperty.FileSize.ReadNumber()}]文件大小", attachProperty.FileSize); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + /// + /// + /// + /// + /// + /// + public JT808_0x1210 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x1210 value = new JT808_0x1210(); + value.TerminalId = reader.ReadString(30); + value.AlarmIdentification = new AlarmIdentificationProperty + { + TerminalId = reader.ReadString(30), + Time = reader.ReadDateTime6(), + SN = reader.ReadByte(), + AttachCount = reader.ReadByte(), + Retain1 = reader.ReadByte(), + Retain2 = reader.ReadByte() + }; + value.AlarmId = reader.ReadString(32); + value.InfoType = reader.ReadByte(); + value.AttachCount = reader.ReadByte(); + if (value.AttachCount > 0) + { + value.AttachInfos = new List(); + for (int i = 0; i < value.AttachCount; i++) + { + AttachProperty attachProperty = new AttachProperty(); + attachProperty.FileNameLength = reader.ReadByte(); + attachProperty.FileName = reader.ReadString(attachProperty.FileNameLength); + attachProperty.FileSize = reader.ReadUInt32(); + value.AttachInfos.Add(attachProperty); + } + } + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1210 value, IJT808Config config) + { + writer.WriteString(value.TerminalId.PadRight(30, '\0')); + if (value.AlarmIdentification == null) + { + throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空"); + } + writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0')); + writer.WriteDateTime6(value.AlarmIdentification.Time); + writer.WriteByte(value.AlarmIdentification.SN); + writer.WriteByte(value.AlarmIdentification.AttachCount); + writer.WriteByte(value.AlarmIdentification.Retain1); + writer.WriteByte(value.AlarmIdentification.Retain2); + writer.WriteString(value.AlarmId); + writer.WriteByte(value.InfoType); + if (value.AttachInfos != null && value.AttachInfos.Count > 0) + { + writer.WriteByte((byte)value.AttachInfos.Count); + foreach (var item in value.AttachInfos) + { + writer.Skip(1, out int FileNameLengthPosition); + writer.WriteString(item.FileName); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition); + writer.WriteUInt32(item.FileSize); + } + } + else + { + writer.WriteByte(0); + } + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1211.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1211.cs new file mode 100644 index 0000000..924688f --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1211.cs @@ -0,0 +1,87 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 文件信息上传 + /// + public class JT808_0x1211 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 文件信息上传 + /// + public override string Description => "文件信息上传"; + /// + /// 文件名称长度 + /// + public byte FileNameLength { get; set; } + /// + /// 文件名称 + /// 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名 + /// + public string FileName { get; set; } + /// + /// 文件类型 + /// + public byte FileType { get; set; } + /// + /// 文件大小 + /// + public uint FileSize { get; set; } + /// + /// 文件信息上传Id + /// + public override ushort MsgId => 0x1211; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x1211 value = new JT808_0x1211(); + value.FileNameLength = reader.ReadByte(); + writer.WriteNumber($"[{value.FileNameLength.ReadNumber()}]文件名称长度", value.FileNameLength); + string fileNameHex = reader.ReadVirtualArray(value.FileNameLength).ToArray().ToHexString(); + value.FileName = reader.ReadString(value.FileNameLength); + writer.WriteString($"[{fileNameHex}]文件名称", value.FileName); + value.FileType = reader.ReadByte(); + writer.WriteNumber($"[{value.FileType.ReadNumber()}]文件类型", value.FileType); + value.FileSize = reader.ReadUInt32(); + writer.WriteNumber($"[{value.FileSize.ReadNumber()}]文件大小", value.FileSize); + } + /// + /// + /// + /// + /// + /// + public JT808_0x1211 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x1211 value = new JT808_0x1211(); + value.FileNameLength = reader.ReadByte(); + value.FileName = reader.ReadString(value.FileNameLength); + value.FileType = reader.ReadByte(); + value.FileSize = reader.ReadUInt32(); + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1211 value, IJT808Config config) + { + writer.Skip(1, out int FileNameLengthPosition); + writer.WriteString(value.FileName); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition); + writer.WriteByte(value.FileType); + writer.WriteUInt32(value.FileSize); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1212.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1212.cs new file mode 100644 index 0000000..91719d4 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1212.cs @@ -0,0 +1,87 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 文件上传完成消息 + /// + public class JT808_0x1212 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 文件上传完成消息 + /// + public override string Description => "文件上传完成消息"; + /// + /// 文件名称长度 + /// + public byte FileNameLength { get; set; } + /// + /// 文件名称 + /// 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名 + /// + public string FileName { get; set; } + /// + /// 文件类型 + /// + public byte FileType { get; set; } + /// + /// 文件大小 + /// + public uint FileSize { get; set; } + /// + /// 文件上传完成消息 + /// + public override ushort MsgId => 0x1212; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x1212 value = new JT808_0x1212(); + value.FileNameLength = reader.ReadByte(); + writer.WriteNumber($"[{value.FileNameLength.ReadNumber()}]文件名称长度", value.FileNameLength); + string fileNameHex = reader.ReadVirtualArray(value.FileNameLength).ToArray().ToHexString(); + value.FileName = reader.ReadString(value.FileNameLength); + writer.WriteString($"[{fileNameHex}]文件名称", value.FileName); + value.FileType = reader.ReadByte(); + writer.WriteNumber($"[{value.FileType.ReadNumber()}]文件类型", value.FileType); + value.FileSize = reader.ReadUInt32(); + writer.WriteNumber($"[{value.FileSize.ReadNumber()}]文件大小", value.FileSize); + } + /// + /// + /// + /// + /// + /// + public JT808_0x1212 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x1212 value = new JT808_0x1212(); + value.FileNameLength = reader.ReadByte(); + value.FileName = reader.ReadString(value.FileNameLength); + value.FileType = reader.ReadByte(); + value.FileSize = reader.ReadUInt32(); + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1212 value, IJT808Config config) + { + writer.Skip(1, out int FileNameLengthPosition); + writer.WriteString(value.FileName); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition); + writer.WriteByte(value.FileType); + writer.WriteUInt32(value.FileSize); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF364.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF364.cs new file mode 100644 index 0000000..f11578c --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF364.cs @@ -0,0 +1,456 @@ +using JT808.Protocol.Extensions.YueBiao.Enums; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 高级驾驶辅助系统参数 + /// + public class JT808_0x8103_0xF364 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 高级驾驶辅助系统参数 + /// + public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF364; + /// + /// 高级驾驶辅助系统参数长度 + /// + public override byte ParamLength { get; set; } + /// + /// 报警判断速度阈值 + /// + public byte AlarmJudgeSpeedThreshold { get; set; } + /// + /// 报警提示音量 + /// + public byte WarningVolume { get; set; } + /// + /// 主动拍照策略 + /// + /// + public byte ActivePhotographyStrategy { get; set; } + /// + /// 主动定时拍照时间间隔 + /// + public ushort ActivelyTimePhotoInterval { get; set; } + /// + /// 主动定距拍照距离间隔 + /// + public ushort ActiveDistancePhotographyDistanceInterval { get; set; } + /// + /// 单次主动拍照张数 + /// + public byte SingleInitiativePhotos { get; set; } + /// + /// 单次主动拍照时间间隔 + /// + public byte SingleInitiativePhotosInterval { get; set; } + /// + /// 拍照分辨率 + /// + /// + public byte PhotoResolution { get; set; } + /// + /// 视频录制分辨率 + /// + public byte VideoRecordingResolution { get; set; } + /// + /// 报警使能 + /// + public uint AlarmEnable { get; set; } + /// + /// 事件使能 + /// + public uint EventEnable { get; set; } + /// + /// 预留字段 + /// + public byte Placeholder1 { get; set; } + /// + /// 障碍物报警距离阈值 + /// + public byte DistanceThresholdObstacleAlarm { get; set; } + /// + /// 障碍物报警分级速度阈值 + /// + public byte HierarchicalSpeedThresholdObstacleAlarm { get; set; } + /// + /// 障碍物报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterObstacleAlarm { get; set; } + /// + /// 障碍物报警拍照张数 + /// + public byte BarrierAlarmPhotographs { get; set; } + /// + /// 障碍物报警拍照间隔 + /// + public byte ObstacleAlarmInterval { get; set; } + /// + /// 频繁变道报警判断时间段 + /// + public byte FrequentChannelChangeAlarmJudgmentTimePeriod { get; set; } + + /// + /// 频繁变道报警判断次数 + /// + public byte FrequentAlarmJudgmentNumberChannelChange { get; set; } + /// + /// 频繁变道报警分级速度阈值 + /// + public byte HierarchicalSpeedThresholdFrequentChannelChangeAlarm { get; set; } + /// + /// 频繁变道报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm { get; set; } + /// + /// 频繁变道报警拍照张数 + /// + public byte FrequentChannelChangeAlarmPhotos { get; set; } + /// + /// 频繁变道报警拍照间隔 + /// + public byte FrequentLaneChangeAlarmInterval { get; set; } + /// + /// 车道偏离报警分级速度阈值 + /// + public byte GradedSpeedThresholdLaneDeviationAlarm { get; set; } + /// + /// 车道偏离报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm { get; set; } + /// + /// 车道偏离报警拍照张数 + /// + public byte LaneDepartureAlarmPhoto { get; set; } + /// + /// 车道偏离报警拍照间隔 + /// + public byte LaneDepartureAlarmPhotoInterval { get; set; } + /// + /// 前向碰撞报警时间阈值 + /// + public byte ForwardCollisionWarningTimeThreshold { get; set; } + /// + /// 前向碰撞报警分级速度阈值 + /// + public byte HierarchicalSpeedThresholdForwardCollisionWarning { get; set; } + /// + /// 前向碰撞报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm { get; set; } + /// + /// 前向碰撞报警拍照张数 + /// + public byte ForwardCollisionAlarmPhotographs { get; set; } + /// + /// 前向碰撞报警拍照间隔 + /// + public byte ForwardCollisionAlarmInterval { get; set; } + /// + /// 行人碰撞报警时间阈值 + /// + public byte PedestrianCollisionAlarmTimeThreshold { get; set; } + /// + /// 行人碰撞报警使能速度阈值 + /// + public byte PedestrianCollisionAlarmEnablingSpeedThreshold { get; set; } + /// + /// 行人碰撞报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm { get; set; } + /// + /// 行人碰撞报警拍照张数 + /// + public byte PedestrianCollisionAlarmPhotos { get; set; } + /// + /// 行人碰撞报警拍照间隔 + /// + public byte PedestrianCollisionAlarmInterval { get; set; } + /// + /// 车距监控报警距离阈值 + /// + public byte VehicleDistanceMonitoringAlarmDistanceThreshold { get; set; } + /// + /// 车距监控报警分级速度阈值 + /// + public byte VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold { get; set; } + /// + /// 车距过近报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity { get; set; } + /// + /// 车距过近报警拍照张数 + /// + public byte AlarmPhotoVehicleCloseDistance { get; set; } + /// + /// 车距过近报警拍照间隔 + /// + public byte AlarmPhotoVehicleCloseDistanceInterval { get; set; } + /// + /// 道路标志识别拍照张数 + /// + public byte RoadSignRecognitionPhotographs { get; set; } + /// + /// 道路标志识别拍照间隔 + /// + public byte RoadSignRecognitionPhotographsInterval { get; set; } + /// + /// 保留字段 + /// + public byte[] Placeholder2 { get; set; } = new byte[4]; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x8103_0xF364 value = new JT808_0x8103_0xF364(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数ID", value.ParamId); + writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength); + value.AlarmJudgeSpeedThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.AlarmJudgeSpeedThreshold.ReadNumber()}]报警判断速度阈值", value.AlarmJudgeSpeedThreshold); + value.WarningVolume = reader.ReadByte(); + writer.WriteNumber($"[{value.WarningVolume.ReadNumber()}]报警提示音量", value.WarningVolume); + value.ActivePhotographyStrategy = reader.ReadByte(); + var activePhotographyStrategy = (ActivePhotographyStrategyType)ActivePhotographyStrategy; + writer.WriteNumber($"[{value.ActivePhotographyStrategy.ReadNumber()}]主动拍照策略-{activePhotographyStrategy.ToString()}", value.ActivePhotographyStrategy); + value.ActivelyTimePhotoInterval = reader.ReadUInt16(); + writer.WriteNumber($"[{value.ActivelyTimePhotoInterval.ReadNumber()}]主动定时拍照时间间隔", value.ActivelyTimePhotoInterval); + value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16(); + writer.WriteNumber($"[{value.ActiveDistancePhotographyDistanceInterval.ReadNumber()}]主动定距拍照距离间隔", value.ActiveDistancePhotographyDistanceInterval); + value.SingleInitiativePhotos = reader.ReadByte(); + writer.WriteNumber($"[{value.SingleInitiativePhotos.ReadNumber()}]单次主动拍照张数", value.SingleInitiativePhotos); + value.SingleInitiativePhotosInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.SingleInitiativePhotosInterval.ReadNumber()}]单次主动拍照时间间隔", value.SingleInitiativePhotosInterval); + value.PhotoResolution = reader.ReadByte(); + var photoResolutionType = (PhotoResolutionType)value.PhotoResolution; + writer.WriteNumber($"[{value.PhotoResolution.ReadNumber()}]拍照分辨率-{photoResolutionType.ToString()}", value.PhotoResolution); + value.VideoRecordingResolution = reader.ReadByte(); + var videoRecordingResolution = (VideoRecordingResolutionType)value.VideoRecordingResolution; + writer.WriteNumber($"[{value.VideoRecordingResolution.ReadNumber()}]视频录制分辨率-{videoRecordingResolution.ToString()}", value.VideoRecordingResolution); + value.AlarmEnable = reader.ReadUInt32(); + writer.WriteNumber($"[{value.AlarmEnable.ReadNumber()}]报警使能", value.AlarmEnable); + var alarmEnableBits = Convert.ToString(value.AlarmEnable, 2).PadLeft(32, '0').AsSpan(); + writer.WriteStartObject("报警使能对象"); + writer.WriteString("[bit30~bit31]预留", alarmEnableBits.Slice(30,2).ToString()); + writer.WriteString("[bit17~bit29]用户自定义", alarmEnableBits.Slice(17, 13).ToString()); + writer.WriteString("[bit16]道路标识超限报警", alarmEnableBits[16]=='0'?"关闭":"打开"); + writer.WriteString("[bit12~bit15]道路标识超限报警", alarmEnableBits.Slice(12, 4).ToString()); + writer.WriteString("[bit11]车距过近二级报警", alarmEnableBits[11] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit10]车距过近一级报警", alarmEnableBits[10] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit9]行人碰撞二级报警", alarmEnableBits[9] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit8]行人碰撞一级报警", alarmEnableBits[8] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit7]前向碰撞二级报警", alarmEnableBits[7] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit6]前向碰撞一级报警", alarmEnableBits[6] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit5]车道偏离二级报警", alarmEnableBits[5] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit4]车道偏离一级报警", alarmEnableBits[4] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit3]频繁变道二级报警", alarmEnableBits[3] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit2]频繁变道一级报警", alarmEnableBits[2] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit1]障碍检测二级报警", alarmEnableBits[1] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit0]障碍检测一级报警", alarmEnableBits[0] == '0' ? "关闭" : "打开"); + writer.WriteEndObject(); + value.EventEnable = reader.ReadUInt32(); + writer.WriteNumber($"[{value.EventEnable.ReadNumber()}]事件使能", value.EventEnable); + var eventEnableBits = Convert.ToString(value.EventEnable, 2).PadLeft(32, '0').AsSpan(); + writer.WriteStartObject("事件使能对象"); + writer.WriteString("[bit30~bit31]预留", eventEnableBits.Slice(30, 2).ToString()); + writer.WriteString("[bit2~bit29]用户自定义", alarmEnableBits.Slice(2, 28).ToString()); + writer.WriteString("[bit1]主动拍照", alarmEnableBits[1] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit0]道路标识识别", alarmEnableBits[0] == '0' ? "关闭" : "打开"); + writer.WriteEndObject(); + value.Placeholder1 = reader.ReadByte(); + writer.WriteNumber($"[{value.Placeholder1.ReadNumber()}]预留字段", value.Placeholder1); + value.DistanceThresholdObstacleAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.DistanceThresholdObstacleAlarm.ReadNumber()}]障碍物报警距离阈值", value.DistanceThresholdObstacleAlarm); + value.HierarchicalSpeedThresholdObstacleAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.HierarchicalSpeedThresholdObstacleAlarm.ReadNumber()}]障碍物报警分级速度阈值", value.HierarchicalSpeedThresholdObstacleAlarm); + value.VideoRecordingTimeBeforeAndAfterObstacleAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterObstacleAlarm.ReadNumber()}]障碍物报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterObstacleAlarm); + value.BarrierAlarmPhotographs = reader.ReadByte(); + writer.WriteNumber($"[{value.BarrierAlarmPhotographs.ReadNumber()}]障碍物报警拍照张数", value.BarrierAlarmPhotographs); + value.ObstacleAlarmInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.ObstacleAlarmInterval.ReadNumber()}]障碍物报警拍照间隔", value.ObstacleAlarmInterval); + value.FrequentChannelChangeAlarmJudgmentTimePeriod = reader.ReadByte(); + writer.WriteNumber($"[{value.FrequentChannelChangeAlarmJudgmentTimePeriod.ReadNumber()}]频繁变道报警判断时间段", value.FrequentChannelChangeAlarmJudgmentTimePeriod); + value.FrequentAlarmJudgmentNumberChannelChange = reader.ReadByte(); + writer.WriteNumber($"[{value.FrequentAlarmJudgmentNumberChannelChange.ReadNumber()}]频繁变道报警判断次数", value.FrequentAlarmJudgmentNumberChannelChange); + value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm.ReadNumber()}]频繁变道报警分级速度阈值", value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm); + value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm.ReadNumber()}]频繁变道报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm); + value.FrequentChannelChangeAlarmPhotos = reader.ReadByte(); + writer.WriteNumber($"[{value.FrequentChannelChangeAlarmPhotos.ReadNumber()}]频繁变道报警拍照张数", value.FrequentChannelChangeAlarmPhotos); + value.FrequentLaneChangeAlarmInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.FrequentLaneChangeAlarmInterval.ReadNumber()}]频繁变道报警拍照间隔", value.FrequentLaneChangeAlarmInterval); + value.GradedSpeedThresholdLaneDeviationAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.GradedSpeedThresholdLaneDeviationAlarm.ReadNumber()}]车道偏离报警分级速度阈值", value.GradedSpeedThresholdLaneDeviationAlarm); + value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm.ReadNumber()}]车道偏离报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm); + value.LaneDepartureAlarmPhoto = reader.ReadByte(); + writer.WriteNumber($"[{value.LaneDepartureAlarmPhoto.ReadNumber()}]车道偏离报警拍照张数", value.LaneDepartureAlarmPhoto); + value.LaneDepartureAlarmPhotoInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.LaneDepartureAlarmPhotoInterval.ReadNumber()}]车道偏离报警拍照间隔", value.LaneDepartureAlarmPhotoInterval); + value.ForwardCollisionWarningTimeThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.ForwardCollisionWarningTimeThreshold.ReadNumber()}]前向碰撞报警时间阈值", value.ForwardCollisionWarningTimeThreshold); + value.HierarchicalSpeedThresholdForwardCollisionWarning = reader.ReadByte(); + writer.WriteNumber($"[{value.HierarchicalSpeedThresholdForwardCollisionWarning.ReadNumber()}]前向碰撞报警分级速度阈值", value.HierarchicalSpeedThresholdForwardCollisionWarning); + value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm.ReadNumber()}]前向碰撞报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm); + value.ForwardCollisionAlarmPhotographs = reader.ReadByte(); + writer.WriteNumber($"[{value.ForwardCollisionAlarmPhotographs.ReadNumber()}]前向碰撞报警拍照张数", value.ForwardCollisionAlarmPhotographs); + value.ForwardCollisionAlarmInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.ForwardCollisionAlarmInterval.ReadNumber()}]前向碰撞报警拍照间隔", value.ForwardCollisionAlarmInterval); + value.PedestrianCollisionAlarmTimeThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.PedestrianCollisionAlarmTimeThreshold.ReadNumber()}]行人碰撞报警时间阈值", value.PedestrianCollisionAlarmTimeThreshold); + value.PedestrianCollisionAlarmEnablingSpeedThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.PedestrianCollisionAlarmEnablingSpeedThreshold.ReadNumber()}]行人碰撞报警使能速度阈值", value.PedestrianCollisionAlarmEnablingSpeedThreshold); + value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm.ReadNumber()}]行人碰撞报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm); + value.PedestrianCollisionAlarmPhotos = reader.ReadByte(); + writer.WriteNumber($"[{value.PedestrianCollisionAlarmPhotos.ReadNumber()}]行人碰撞报警拍照张数", value.PedestrianCollisionAlarmPhotos); + value.PedestrianCollisionAlarmInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.PedestrianCollisionAlarmInterval.ReadNumber()}]行人碰撞报警拍照间隔", value.PedestrianCollisionAlarmInterval); + value.VehicleDistanceMonitoringAlarmDistanceThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.VehicleDistanceMonitoringAlarmDistanceThreshold.ReadNumber()}]车距监控报警距离阈值", value.VehicleDistanceMonitoringAlarmDistanceThreshold); + value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold.ReadNumber()}]车距监控报警分级速度阈值", value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold); + value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity.ReadNumber()}]车距过近报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity); + value.AlarmPhotoVehicleCloseDistance = reader.ReadByte(); + writer.WriteNumber($"[{value.AlarmPhotoVehicleCloseDistance.ReadNumber()}]车距过近报警拍照张数", value.AlarmPhotoVehicleCloseDistance); + value.AlarmPhotoVehicleCloseDistanceInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.AlarmPhotoVehicleCloseDistanceInterval.ReadNumber()}]车距过近报警拍照间隔", value.AlarmPhotoVehicleCloseDistanceInterval); + value.RoadSignRecognitionPhotographs = reader.ReadByte(); + writer.WriteNumber($"[{value.RoadSignRecognitionPhotographs.ReadNumber()}]道路标志识别拍照张数", value.RoadSignRecognitionPhotographs); + value.RoadSignRecognitionPhotographsInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.RoadSignRecognitionPhotographsInterval.ReadNumber()}]道路标志识别拍照间隔", value.RoadSignRecognitionPhotographsInterval); + value.Placeholder2 = reader.ReadArray(4).ToArray(); + writer.WriteString("保留字段", value.Placeholder2.ToHexString()); + } + /// + /// + /// + /// + /// + /// + public JT808_0x8103_0xF364 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0xF364 value = new JT808_0x8103_0xF364(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.AlarmJudgeSpeedThreshold = reader.ReadByte(); + value.WarningVolume = reader.ReadByte(); + value.ActivePhotographyStrategy = reader.ReadByte(); + value.ActivelyTimePhotoInterval = reader.ReadUInt16(); + value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16(); + value.SingleInitiativePhotos = reader.ReadByte(); + value.SingleInitiativePhotosInterval = reader.ReadByte(); + value.PhotoResolution = reader.ReadByte(); + value.VideoRecordingResolution = reader.ReadByte(); + value.AlarmEnable = reader.ReadUInt32(); + value.EventEnable = reader.ReadUInt32(); + value.Placeholder1 = reader.ReadByte(); + value.DistanceThresholdObstacleAlarm = reader.ReadByte(); + value.HierarchicalSpeedThresholdObstacleAlarm = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterObstacleAlarm = reader.ReadByte(); + value.BarrierAlarmPhotographs = reader.ReadByte(); + value.ObstacleAlarmInterval = reader.ReadByte(); + value.FrequentChannelChangeAlarmJudgmentTimePeriod = reader.ReadByte(); + value.FrequentAlarmJudgmentNumberChannelChange = reader.ReadByte(); + value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm = reader.ReadByte(); + value.FrequentChannelChangeAlarmPhotos = reader.ReadByte(); + value.FrequentLaneChangeAlarmInterval = reader.ReadByte(); + value.GradedSpeedThresholdLaneDeviationAlarm = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm = reader.ReadByte(); + value.LaneDepartureAlarmPhoto = reader.ReadByte(); + value.LaneDepartureAlarmPhotoInterval = reader.ReadByte(); + value.ForwardCollisionWarningTimeThreshold = reader.ReadByte(); + value.HierarchicalSpeedThresholdForwardCollisionWarning = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm = reader.ReadByte(); + value.ForwardCollisionAlarmPhotographs = reader.ReadByte(); + value.ForwardCollisionAlarmInterval = reader.ReadByte(); + value.PedestrianCollisionAlarmTimeThreshold = reader.ReadByte(); + value.PedestrianCollisionAlarmEnablingSpeedThreshold = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm = reader.ReadByte(); + value.PedestrianCollisionAlarmPhotos = reader.ReadByte(); + value.PedestrianCollisionAlarmInterval = reader.ReadByte(); + value.VehicleDistanceMonitoringAlarmDistanceThreshold = reader.ReadByte(); + value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity = reader.ReadByte(); + value.AlarmPhotoVehicleCloseDistance = reader.ReadByte(); + value.AlarmPhotoVehicleCloseDistanceInterval = reader.ReadByte(); + value.RoadSignRecognitionPhotographs = reader.ReadByte(); + value.RoadSignRecognitionPhotographsInterval = reader.ReadByte(); + value.Placeholder2 = reader.ReadArray(4).ToArray(); + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF364 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.Skip(1, out int ParamLengthPosition); + writer.WriteByte(value.AlarmJudgeSpeedThreshold); + writer.WriteByte(value.WarningVolume); + writer.WriteByte(value.ActivePhotographyStrategy); + writer.WriteUInt16(value.ActivelyTimePhotoInterval); + writer.WriteUInt16(value.ActiveDistancePhotographyDistanceInterval); + writer.WriteByte(value.SingleInitiativePhotos); + writer.WriteByte(value.SingleInitiativePhotosInterval); + writer.WriteByte(value.PhotoResolution); + writer.WriteByte(value.VideoRecordingResolution); + writer.WriteUInt32(value.AlarmEnable); + writer.WriteUInt32(value.EventEnable); + writer.WriteByte(value.Placeholder1); + writer.WriteByte(value.DistanceThresholdObstacleAlarm); + writer.WriteByte(value.HierarchicalSpeedThresholdObstacleAlarm); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterObstacleAlarm); + writer.WriteByte(value.BarrierAlarmPhotographs); + writer.WriteByte(value.ObstacleAlarmInterval); + writer.WriteByte(value.FrequentChannelChangeAlarmJudgmentTimePeriod); + writer.WriteByte(value.FrequentAlarmJudgmentNumberChannelChange); + writer.WriteByte(value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm); + writer.WriteByte(value.FrequentChannelChangeAlarmPhotos); + writer.WriteByte(value.FrequentLaneChangeAlarmInterval); + writer.WriteByte(value.GradedSpeedThresholdLaneDeviationAlarm); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm); + writer.WriteByte(value.LaneDepartureAlarmPhoto); + writer.WriteByte(value.LaneDepartureAlarmPhotoInterval); + writer.WriteByte(value.ForwardCollisionWarningTimeThreshold); + writer.WriteByte(value.HierarchicalSpeedThresholdForwardCollisionWarning); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm); + writer.WriteByte(value.ForwardCollisionAlarmPhotographs); + writer.WriteByte(value.ForwardCollisionAlarmInterval); + writer.WriteByte(value.PedestrianCollisionAlarmTimeThreshold); + writer.WriteByte(value.PedestrianCollisionAlarmEnablingSpeedThreshold); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm); + writer.WriteByte(value.PedestrianCollisionAlarmPhotos); + writer.WriteByte(value.PedestrianCollisionAlarmInterval); + writer.WriteByte(value.VehicleDistanceMonitoringAlarmDistanceThreshold); + writer.WriteByte(value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity); + writer.WriteByte(value.AlarmPhotoVehicleCloseDistance); + writer.WriteByte(value.AlarmPhotoVehicleCloseDistanceInterval); + writer.WriteByte(value.RoadSignRecognitionPhotographs); + writer.WriteByte(value.RoadSignRecognitionPhotographsInterval); + writer.WriteArray(value.Placeholder2); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ParamLengthPosition - 1), ParamLengthPosition); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF365.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF365.cs new file mode 100644 index 0000000..09231d9 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF365.cs @@ -0,0 +1,365 @@ +using JT808.Protocol.Extensions.YueBiao.Enums; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 驾驶员状态监测系统参数 + /// + public class JT808_0x8103_0xF365 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 驾驶员状态监测系统参数 + /// + public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF365; + /// + /// 驾驶员状态监测系统参数长度 + /// + public override byte ParamLength { get; set; } + /// + /// 报警判断速度阈值 + /// + public byte AlarmJudgeSpeedThreshold { get; set; } + /// + /// 报警提示音量 + /// + public byte WarningVolume { get; set; } + /// + /// 主动拍照策略 + /// + public byte ActivePhotographyStrategy { get; set; } + /// + /// 主动定时拍照时间间隔 + /// + public ushort ActivelyTimePhotoInterval { get; set; } + /// + /// 主动定距拍照距离间隔 + /// + public ushort ActiveDistancePhotographyDistanceInterval { get; set; } + /// + /// 单次主动拍照张数 + /// + public byte SingleInitiativePhotos { get; set; } + /// + /// 单次主动拍照时间间隔 + /// + public byte SingleInitiativePhotosInterval { get; set; } + /// + /// 拍照分辨率 + /// + public byte PhotoResolution { get; set; } + /// + /// 视频录制分辨率 + /// + public byte VideoRecordingResolution { get; set; } + /// + /// 报警使能 + /// + public uint AlarmEnable { get; set; } + /// + /// 事件使能 + /// + public uint EventEnable { get; set; } + /// + /// 吸烟报警判断时间间隔 + /// + public ushort TimeIntervalSmokingAlarmJudgment { get; set; } + /// + /// 接打电话报警判断时间间隔 + /// + public ushort CallAlarmDetermineTimeInterval{ get; set; } + /// + /// 预留字段 + /// + public byte[] Reserve { get; set; } = new byte[3]; + /// + /// 疲劳驾驶报警分级速度阈值 + /// + public byte GradedSpeedThresholdFatigueDrivingAlarm { get; set; } + /// + /// 疲劳驾驶报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm { get; set; } + /// + /// 疲劳驾驶报警拍照张数 + /// + public byte FatigueDrivingAlarmPhotograph { get; set; } + /// + /// 疲劳驾驶报警拍照间隔时间 + /// + public byte FatigueDrivingAlarmPhotographInterval { get; set; } + /// + /// 接打电话报警分级速度阈值 + /// + public byte ClassifiedSpeedThresholdCallAlarm{ get; set; } + /// + /// 接打电话报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterCallAlarm{ get; set; } + /// + /// 接打电话报警拍驾驶员面部特征照片张数 + /// + public byte CallAlarmTakePicturesDriverFacialFeatures{ get; set; } + /// + /// 接打电话报警拍驾驶员面部特征照片间隔时间 + /// + public byte CallAlarmTakePicturesDriverFacialFeaturesInterval { get; set; } + /// + /// 抽烟报警分级车速阈值 + /// + public byte ClassifiedSpeedThresholdSmokingAlarm{ get; set; } + /// + /// 抽烟报警前后视频录制时间 + /// + public byte VideoRecordingTimeBeforeAndAfterSmokingAlarm{ get; set; } + /// + /// 抽烟报警拍驾驶员面部特征照片张数 + /// + public byte SmokingAlarmPhotographsDriverFaceCharacteristics { get; set; } + /// + /// 抽烟报警拍驾驶员面部特征照片间隔时间 + /// + public byte SmokingAlarmPhotographsDriverFaceCharacteristicsInterval { get; set; } + /// + /// 分神驾驶报警分级车速阈值 + /// + public byte ClassifiedSpeedThresholdDistractedDrivingAlarm { get; set; } + /// + /// 分神驾驶报警拍照张数 + /// + public byte DistractedDrivingAlarmPhotography{ get; set; } + /// + /// 分神驾驶报警拍照间隔时间 + /// + public byte DistractedDrivingAlarmPhotographyInterval { get; set; } + /// + /// 驾驶行为异常视频录制时间 + /// + public byte VideoRecordingTimeAbnormalDrivingBehavior{ get; set; } + /// + /// 驾驶行为异常抓拍照片张数 + /// + public byte PhotographsAbnormalDrivingBehavior{ get; set; } + /// + /// 驾驶行为异常拍照间隔 + /// + public byte PictureIntervalAbnormalDrivingBehavior{ get; set; } + /// + /// 驾驶员身份识别触发 + /// + public byte DriverIdentificationTrigger { get; set; } + /// + /// 保留字段 + /// + public byte[] Retain { get; set; } = new byte[2]; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x8103_0xF365 value = new JT808_0x8103_0xF365(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数ID", value.ParamId); + writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength); + value.AlarmJudgeSpeedThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.AlarmJudgeSpeedThreshold.ReadNumber()}]报警判断速度阈值", value.AlarmJudgeSpeedThreshold); + value.WarningVolume = reader.ReadByte(); + writer.WriteNumber($"[{value.WarningVolume.ReadNumber()}]报警提示音量", value.WarningVolume); + value.ActivePhotographyStrategy = reader.ReadByte(); + var activePhotographyStrategy = (ActivePhotographyStrategyType)ActivePhotographyStrategy; + writer.WriteNumber($"[{value.ActivePhotographyStrategy.ReadNumber()}]主动拍照策略-{activePhotographyStrategy.ToString()}", value.ActivePhotographyStrategy); + value.ActivelyTimePhotoInterval = reader.ReadUInt16(); + writer.WriteNumber($"[{value.ActivelyTimePhotoInterval.ReadNumber()}]主动定时拍照时间间隔", value.ActivelyTimePhotoInterval); + value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16(); + writer.WriteNumber($"[{value.ActiveDistancePhotographyDistanceInterval.ReadNumber()}]主动定距拍照距离间隔", value.ActiveDistancePhotographyDistanceInterval); + value.SingleInitiativePhotos = reader.ReadByte(); + writer.WriteNumber($"[{value.SingleInitiativePhotos.ReadNumber()}]单次主动拍照张数", value.SingleInitiativePhotos); + value.SingleInitiativePhotosInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.SingleInitiativePhotosInterval.ReadNumber()}]单次主动拍照时间间隔", value.SingleInitiativePhotosInterval); + value.PhotoResolution = reader.ReadByte(); + var photoResolutionType = (PhotoResolutionType)value.PhotoResolution; + writer.WriteNumber($"[{value.PhotoResolution.ReadNumber()}]拍照分辨率-{photoResolutionType.ToString()}", value.PhotoResolution); + value.VideoRecordingResolution = reader.ReadByte(); + var videoRecordingResolution = (VideoRecordingResolutionType)value.VideoRecordingResolution; + writer.WriteNumber($"[{value.VideoRecordingResolution.ReadNumber()}]视频录制分辨率-{videoRecordingResolution.ToString()}", value.VideoRecordingResolution); + value.AlarmEnable = reader.ReadUInt32(); + writer.WriteNumber($"[{value.AlarmEnable.ReadNumber()}]报警使能", value.AlarmEnable); + var alarmEnableBits = Convert.ToString(value.AlarmEnable, 2).PadLeft(32, '0').AsSpan(); + writer.WriteStartObject("报警使能对象"); + writer.WriteString("[bit30~bit31]预留", alarmEnableBits.Slice(30, 2).ToString()); + writer.WriteString("[bit17~bit29]用户自定义", alarmEnableBits.Slice(17, 13).ToString()); + writer.WriteString("[bit16]道路标识超限报警", alarmEnableBits[16] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit12~bit15]道路标识超限报警", alarmEnableBits.Slice(12, 4).ToString()); + writer.WriteString("[bit11]车距过近二级报警", alarmEnableBits[11] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit10]车距过近一级报警", alarmEnableBits[10] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit9]行人碰撞二级报警", alarmEnableBits[9] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit8]行人碰撞一级报警", alarmEnableBits[8] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit7]前向碰撞二级报警", alarmEnableBits[7] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit6]前向碰撞一级报警", alarmEnableBits[6] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit5]车道偏离二级报警", alarmEnableBits[5] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit4]车道偏离一级报警", alarmEnableBits[4] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit3]频繁变道二级报警", alarmEnableBits[3] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit2]频繁变道一级报警", alarmEnableBits[2] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit1]障碍检测二级报警", alarmEnableBits[1] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit0]障碍检测一级报警", alarmEnableBits[0] == '0' ? "关闭" : "打开"); + writer.WriteEndObject(); + value.EventEnable = reader.ReadUInt32(); + writer.WriteNumber($"[{value.EventEnable.ReadNumber()}]事件使能", value.EventEnable); + var eventEnableBits = Convert.ToString(value.EventEnable, 2).PadLeft(32, '0').AsSpan(); + writer.WriteStartObject("事件使能对象"); + writer.WriteString("[bit30~bit31]预留", eventEnableBits.Slice(30, 2).ToString()); + writer.WriteString("[bit2~bit29]用户自定义", alarmEnableBits.Slice(2, 28).ToString()); + writer.WriteString("[bit1]主动拍照", alarmEnableBits[1] == '0' ? "关闭" : "打开"); + writer.WriteString("[bit0]道路标识识别", alarmEnableBits[0] == '0' ? "关闭" : "打开"); + writer.WriteEndObject(); + value.TimeIntervalSmokingAlarmJudgment = reader.ReadUInt16(); + writer.WriteNumber($"[{value.TimeIntervalSmokingAlarmJudgment.ReadNumber()}]吸烟报警判断时间间隔", value.TimeIntervalSmokingAlarmJudgment); + value.CallAlarmDetermineTimeInterval = reader.ReadUInt16(); + writer.WriteNumber($"[{value.CallAlarmDetermineTimeInterval.ReadNumber()}]接打电话报警判断时间间隔", value.CallAlarmDetermineTimeInterval); + value.Reserve = reader.ReadArray(3).ToArray(); + writer.WriteString("预留字段", value.Reserve.ToHexString()); + value.GradedSpeedThresholdFatigueDrivingAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.GradedSpeedThresholdFatigueDrivingAlarm.ReadNumber()}]疲劳驾驶报警分级速度阈值", value.GradedSpeedThresholdFatigueDrivingAlarm); + value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm.ReadNumber()}]疲劳驾驶报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm); + value.FatigueDrivingAlarmPhotograph = reader.ReadByte(); + writer.WriteNumber($"[{value.FatigueDrivingAlarmPhotograph.ReadNumber()}]疲劳驾驶报警拍照张数", value.FatigueDrivingAlarmPhotograph); + value.FatigueDrivingAlarmPhotographInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.FatigueDrivingAlarmPhotographInterval.ReadNumber()}]疲劳驾驶报警拍照间隔时间", value.FatigueDrivingAlarmPhotographInterval); + value.ClassifiedSpeedThresholdCallAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.ClassifiedSpeedThresholdCallAlarm.ReadNumber()}]接打电话报警分级速度阈值", value.ClassifiedSpeedThresholdCallAlarm); + value.VideoRecordingTimeBeforeAndAfterCallAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterCallAlarm.ReadNumber()}]接打电话报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterCallAlarm); + value.CallAlarmTakePicturesDriverFacialFeatures = reader.ReadByte(); + writer.WriteNumber($"[{value.CallAlarmTakePicturesDriverFacialFeatures.ReadNumber()}]接打电话报警拍驾驶员面部特征照片张数", value.CallAlarmTakePicturesDriverFacialFeatures); + value.CallAlarmTakePicturesDriverFacialFeaturesInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.CallAlarmTakePicturesDriverFacialFeaturesInterval.ReadNumber()}]接打电话报警拍驾驶员面部特征照片间隔时间", value.CallAlarmTakePicturesDriverFacialFeaturesInterval); + value.ClassifiedSpeedThresholdSmokingAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.ClassifiedSpeedThresholdSmokingAlarm.ReadNumber()}]抽烟报警分级车速阈值", value.ClassifiedSpeedThresholdSmokingAlarm); + value.VideoRecordingTimeBeforeAndAfterSmokingAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterSmokingAlarm.ReadNumber()}]抽烟报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterSmokingAlarm); + value.SmokingAlarmPhotographsDriverFaceCharacteristics = reader.ReadByte(); + writer.WriteNumber($"[{value.SmokingAlarmPhotographsDriverFaceCharacteristics.ReadNumber()}]抽烟报警拍驾驶员面部特征照片张数", value.SmokingAlarmPhotographsDriverFaceCharacteristics); + value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval.ReadNumber()}]抽烟报警拍驾驶员面部特征照片间隔时间", value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval); + value.ClassifiedSpeedThresholdDistractedDrivingAlarm = reader.ReadByte(); + writer.WriteNumber($"[{value.ClassifiedSpeedThresholdDistractedDrivingAlarm.ReadNumber()}]分神驾驶报警分级车速阈值", value.ClassifiedSpeedThresholdDistractedDrivingAlarm); + value.DistractedDrivingAlarmPhotography = reader.ReadByte(); + writer.WriteNumber($"[{value.DistractedDrivingAlarmPhotography.ReadNumber()}]分神驾驶报警拍照张数", value.DistractedDrivingAlarmPhotography); + value.DistractedDrivingAlarmPhotographyInterval = reader.ReadByte(); + writer.WriteNumber($"[{value.DistractedDrivingAlarmPhotographyInterval.ReadNumber()}]分神驾驶报警拍照间隔时间", value.DistractedDrivingAlarmPhotographyInterval); + value.VideoRecordingTimeAbnormalDrivingBehavior = reader.ReadByte(); + writer.WriteNumber($"[{value.VideoRecordingTimeAbnormalDrivingBehavior.ReadNumber()}]驾驶行为异常视频录制时间", value.VideoRecordingTimeAbnormalDrivingBehavior); + value.PhotographsAbnormalDrivingBehavior = reader.ReadByte(); + writer.WriteNumber($"[{value.PhotographsAbnormalDrivingBehavior.ReadNumber()}]驾驶行为异常抓拍照片张数", value.PhotographsAbnormalDrivingBehavior); + value.PictureIntervalAbnormalDrivingBehavior = reader.ReadByte(); + writer.WriteNumber($"[{value.PictureIntervalAbnormalDrivingBehavior.ReadNumber()}]驾驶行为异常拍照间隔", value.PictureIntervalAbnormalDrivingBehavior); + value.DriverIdentificationTrigger = reader.ReadByte(); + writer.WriteNumber($"[{value.DriverIdentificationTrigger.ReadNumber()}]驾驶员身份识别触发", value.DriverIdentificationTrigger); + value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); + writer.WriteString("保留字段", value.Retain.ToHexString()); + } + /// + /// + /// + /// + /// + /// + public JT808_0x8103_0xF365 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0xF365 value = new JT808_0x8103_0xF365(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.AlarmJudgeSpeedThreshold = reader.ReadByte(); + value.WarningVolume = reader.ReadByte(); + value.ActivePhotographyStrategy = reader.ReadByte(); + value.ActivelyTimePhotoInterval = reader.ReadUInt16(); + value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16(); + value.SingleInitiativePhotos = reader.ReadByte(); + value.SingleInitiativePhotosInterval = reader.ReadByte(); + value.PhotoResolution = reader.ReadByte(); + value.VideoRecordingResolution = reader.ReadByte(); + value.AlarmEnable = reader.ReadUInt32(); + value.EventEnable = reader.ReadUInt32(); + value.TimeIntervalSmokingAlarmJudgment = reader.ReadUInt16(); + value.CallAlarmDetermineTimeInterval = reader.ReadUInt16(); + value.Reserve = reader.ReadArray(3).ToArray(); + value.GradedSpeedThresholdFatigueDrivingAlarm = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm = reader.ReadByte(); + value.FatigueDrivingAlarmPhotograph = reader.ReadByte(); + value.FatigueDrivingAlarmPhotographInterval = reader.ReadByte(); + value.ClassifiedSpeedThresholdCallAlarm = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterCallAlarm = reader.ReadByte(); + value.CallAlarmTakePicturesDriverFacialFeatures = reader.ReadByte(); + value.CallAlarmTakePicturesDriverFacialFeaturesInterval = reader.ReadByte(); + value.ClassifiedSpeedThresholdSmokingAlarm = reader.ReadByte(); + value.VideoRecordingTimeBeforeAndAfterSmokingAlarm = reader.ReadByte(); + value.SmokingAlarmPhotographsDriverFaceCharacteristics = reader.ReadByte(); + value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval = reader.ReadByte(); + value.ClassifiedSpeedThresholdDistractedDrivingAlarm = reader.ReadByte(); + value.DistractedDrivingAlarmPhotography = reader.ReadByte(); + value.DistractedDrivingAlarmPhotographyInterval = reader.ReadByte(); + value.VideoRecordingTimeAbnormalDrivingBehavior = reader.ReadByte(); + value.PhotographsAbnormalDrivingBehavior = reader.ReadByte(); + value.PictureIntervalAbnormalDrivingBehavior = reader.ReadByte(); + value.DriverIdentificationTrigger = reader.ReadByte(); + value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF365 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.Skip(1, out int ParamLengthPosition); + writer.WriteByte(value.AlarmJudgeSpeedThreshold); + writer.WriteByte(value.WarningVolume); + writer.WriteByte(value.ActivePhotographyStrategy); + writer.WriteUInt16(value.ActivelyTimePhotoInterval); + writer.WriteUInt16(value.ActiveDistancePhotographyDistanceInterval); + writer.WriteByte(value.SingleInitiativePhotos); + writer.WriteByte(value.SingleInitiativePhotosInterval); + writer.WriteByte(value.PhotoResolution); + writer.WriteByte(value.VideoRecordingResolution); + writer.WriteUInt32(value.AlarmEnable); + writer.WriteUInt32(value.EventEnable); + writer.WriteUInt16(value.TimeIntervalSmokingAlarmJudgment); + writer.WriteUInt16(value.CallAlarmDetermineTimeInterval); + writer.WriteArray(value.Reserve); + writer.WriteByte(value.GradedSpeedThresholdFatigueDrivingAlarm); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm); + writer.WriteByte(value.FatigueDrivingAlarmPhotograph); + writer.WriteByte(value.FatigueDrivingAlarmPhotographInterval); + writer.WriteByte(value.ClassifiedSpeedThresholdCallAlarm); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterCallAlarm); + writer.WriteByte(value.CallAlarmTakePicturesDriverFacialFeatures); + writer.WriteByte(value.CallAlarmTakePicturesDriverFacialFeaturesInterval); + writer.WriteByte(value.ClassifiedSpeedThresholdSmokingAlarm); + writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterSmokingAlarm); + writer.WriteByte(value.SmokingAlarmPhotographsDriverFaceCharacteristics); + writer.WriteByte(value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval); + writer.WriteByte(value.ClassifiedSpeedThresholdDistractedDrivingAlarm); + writer.WriteByte(value.DistractedDrivingAlarmPhotography); + writer.WriteByte(value.DistractedDrivingAlarmPhotographyInterval); + writer.WriteByte(value.VideoRecordingTimeAbnormalDrivingBehavior); + writer.WriteByte(value.PhotographsAbnormalDrivingBehavior); + writer.WriteByte(value.PictureIntervalAbnormalDrivingBehavior); + writer.WriteByte(value.DriverIdentificationTrigger); + writer.WriteArray(value.Retain); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ParamLengthPosition - 1), ParamLengthPosition); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF366.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF366.cs new file mode 100644 index 0000000..2635e8d --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF366.cs @@ -0,0 +1,151 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 胎压监测系统参数 + /// + public class JT808_0x8103_0xF366 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 胎压监测系统参数Id + /// + public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF366; + /// + /// 胎压监测系统参数长度 + /// + public override byte ParamLength { get; set; } = 46; + /// + /// 轮胎规格型号 12位 + /// + public string TyreSpecificationType { get; set; } + /// + /// 胎压单位 + /// + public ushort TyrePressureUnit { get; set; } + /// + /// 正常胎压值 + /// + public ushort NormalFetalPressure { get; set; } + /// + /// 胎压不平衡门限 + /// + public ushort ThresholdUnbalancedTirePressure { get; set; } + /// + /// 慢漏气门限 + /// + public ushort SlowLeakageThreshold { get; set; } + /// + /// 低压阈值 + /// + public ushort LowVoltageThreshold { get; set; } + /// + /// 高压阈值 + /// + public ushort HighVoltageThreshold { get; set; } + /// + /// 高温阈值 + /// + public ushort HighTemperatureThreshold { get; set; } + /// + /// 电压阈值 + /// + public ushort VoltageThreshold { get; set; } + /// + /// 定时上报时间间隔 + /// + public ushort TimedReportingInterval { get; set; } + /// + /// 保留项 + /// + public byte[] Retain { get; set; } = new byte[6]; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x8103_0xF366 value = new JT808_0x8103_0xF366(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数ID", value.ParamId); + writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength); + string tyreSpecificationTypeHex = reader.ReadVirtualArray(12).ToArray().ToHexString(); + value.TyreSpecificationType = reader.ReadString(12); + writer.WriteString($"[{tyreSpecificationTypeHex}]轮胎规格型号", value.TyreSpecificationType); + value.TyrePressureUnit = reader.ReadUInt16(); + writer.WriteNumber($"[{value.TyrePressureUnit.ReadNumber()}]胎压单位", value.TyrePressureUnit); + value.NormalFetalPressure = reader.ReadUInt16(); + writer.WriteNumber($"[{value.NormalFetalPressure.ReadNumber()}]正常胎压值", value.NormalFetalPressure); + value.ThresholdUnbalancedTirePressure = reader.ReadUInt16(); + writer.WriteNumber($"[{value.ThresholdUnbalancedTirePressure.ReadNumber()}]胎压不平衡门限", value.ThresholdUnbalancedTirePressure); + value.SlowLeakageThreshold = reader.ReadUInt16(); + writer.WriteNumber($"[{value.SlowLeakageThreshold.ReadNumber()}]慢漏气门限", value.SlowLeakageThreshold); + value.LowVoltageThreshold = reader.ReadUInt16(); + writer.WriteNumber($"[{value.LowVoltageThreshold.ReadNumber()}]低压阈值", value.LowVoltageThreshold); + value.HighVoltageThreshold = reader.ReadUInt16(); + writer.WriteNumber($"[{value.HighVoltageThreshold.ReadNumber()}]高压阈值", value.HighVoltageThreshold); + value.HighTemperatureThreshold = reader.ReadUInt16(); + writer.WriteNumber($"[{value.HighTemperatureThreshold.ReadNumber()}]高温阈值", value.HighTemperatureThreshold); + value.VoltageThreshold = reader.ReadUInt16(); + writer.WriteNumber($"[{value.VoltageThreshold.ReadNumber()}]电压阈值", value.VoltageThreshold); + value.TimedReportingInterval = reader.ReadUInt16(); + writer.WriteNumber($"[{value.TimedReportingInterval.ReadNumber()}]定时上报时间间隔", value.TimedReportingInterval); + value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); + writer.WriteString("保留项", value.Retain.ToHexString()); + } + /// + /// + /// + /// + /// + /// + public JT808_0x8103_0xF366 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0xF366 value = new JT808_0x8103_0xF366(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.TyreSpecificationType = reader.ReadString(12); + value.TyrePressureUnit = reader.ReadUInt16(); + value.NormalFetalPressure = reader.ReadUInt16(); + value.ThresholdUnbalancedTirePressure = reader.ReadUInt16(); + value.SlowLeakageThreshold = reader.ReadUInt16(); + value.LowVoltageThreshold = reader.ReadUInt16(); + value.HighVoltageThreshold = reader.ReadUInt16(); + value.HighTemperatureThreshold = reader.ReadUInt16(); + value.VoltageThreshold = reader.ReadUInt16(); + value.TimedReportingInterval = reader.ReadUInt16(); + value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF366 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.Skip(1, out int ParamLengthPosition); + writer.WriteString(value.TyreSpecificationType); + writer.WriteUInt16(value.TyrePressureUnit); + writer.WriteUInt16(value.NormalFetalPressure); + writer.WriteUInt16(value.ThresholdUnbalancedTirePressure); + writer.WriteUInt16(value.SlowLeakageThreshold); + writer.WriteUInt16(value.LowVoltageThreshold); + writer.WriteUInt16(value.HighVoltageThreshold); + writer.WriteUInt16(value.HighTemperatureThreshold); + writer.WriteUInt16(value.VoltageThreshold); + writer.WriteUInt16(value.TimedReportingInterval); + writer.WriteArray(value.Retain); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ParamLengthPosition - 1), ParamLengthPosition); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF367.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF367.cs new file mode 100644 index 0000000..4d1afcb --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF367.cs @@ -0,0 +1,77 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 盲区监测系统参数 + /// + public class JT808_0x8103_0xF367 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 盲区监测系统参数Id + /// + public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF367; + /// + /// 盲区监测系统参数长度 + /// + public override byte ParamLength { get; set; } = 2; + /// + /// 后方接近报警时间阈值 + /// + public byte RearApproachAlarmTimeThreshold { get; set; } + /// + /// 侧后方接近报警时间阈值 + /// + public byte LateralRearApproachAlarmTimeThreshold { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x8103_0xF367 value = new JT808_0x8103_0xF367(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + writer.WriteNumber($"[{ value.ParamId.ReadNumber()}]参数ID", value.ParamId); + writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength); + value.RearApproachAlarmTimeThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.RearApproachAlarmTimeThreshold.ReadNumber()}]后方接近报警时间阈值", value.RearApproachAlarmTimeThreshold); + value.LateralRearApproachAlarmTimeThreshold = reader.ReadByte(); + writer.WriteNumber($"[{value.LateralRearApproachAlarmTimeThreshold.ReadNumber()}]侧后方接近报警时间阈值", value.LateralRearApproachAlarmTimeThreshold); + } + /// + /// + /// + /// + /// + /// + public JT808_0x8103_0xF367 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0xF367 value = new JT808_0x8103_0xF367(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.RearApproachAlarmTimeThreshold = reader.ReadByte(); + value.LateralRearApproachAlarmTimeThreshold = reader.ReadByte(); + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF367 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.WriteByte(2); + writer.WriteByte(value.RearApproachAlarmTimeThreshold); + writer.WriteByte(value.LateralRearApproachAlarmTimeThreshold); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF7.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF7.cs new file mode 100644 index 0000000..5627e69 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF7.cs @@ -0,0 +1,90 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System.Collections.Generic; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 状态查询 + /// + public class JT808_0x8900_0xF7 : JT808_0x8900_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 查询基本信息类型 + /// 外设状态信息:外设工作状态、设备报警信息 + /// + public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF7; + /// + /// 外设ID列表总数 + /// + public byte USBCount { get; set; } + /// + /// 外设ID + /// + public List MultipleUSB { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x8900_0xF7 value = new JT808_0x8900_0xF7(); + value.USBCount = reader.ReadByte(); + writer.WriteNumber($"[{value.USBCount.ReadNumber()}]外设ID列表总数", value.USBCount); + if (value.USBCount > 0) + { + writer.WriteStartArray("外设ID列表"); + for (int i = 0; i < value.USBCount; i++) + { + writer.WriteStartObject(); + byte usbId = reader.ReadByte(); + writer.WriteNumber($"[{usbId.ReadNumber()}]外设ID", usbId); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + /// + /// + /// + /// + /// + /// + public JT808_0x8900_0xF7 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8900_0xF7 value = new JT808_0x8900_0xF7(); + value.USBCount = reader.ReadByte(); + if (value.USBCount > 0) + { + value.MultipleUSB = new List(); + for (int i = 0; i < value.USBCount; i++) + { + value.MultipleUSB.Add(reader.ReadByte()); + } + } + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900_0xF7 value, IJT808Config config) + { + if (value.MultipleUSB != null && value.MultipleUSB.Count > 0) + { + writer.WriteByte((byte)value.MultipleUSB.Count); + foreach (var item in value.MultipleUSB) + { + writer.WriteByte(item); + } + } + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF8.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF8.cs new file mode 100644 index 0000000..1fea038 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF8.cs @@ -0,0 +1,90 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessageBody; +using JT808.Protocol.MessagePack; +using System.Collections.Generic; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 信息查询 + /// + public class JT808_0x8900_0xF8 : JT808_0x8900_BodyBase, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 查询基本信息透传类型 + /// 外设传感器的基本信息:公司信息、 产品代码、 版本号、 外设 ID、 客户代码。对应的消息内容见表 + /// + public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF8; + /// + /// 外设ID列表总数 + /// + public byte USBCount { get; set; } + /// + /// 外设ID + /// + public List MultipleUSB { get; set; } + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x8900_0xF8 value = new JT808_0x8900_0xF8(); + value.USBCount = reader.ReadByte(); + writer.WriteNumber($"[{value.USBCount.ReadNumber()}]外设ID列表总数", value.USBCount); + if (value.USBCount > 0) + { + writer.WriteStartArray("外设ID列表"); + for (int i = 0; i < value.USBCount; i++) + { + writer.WriteStartObject(); + byte usbId = reader.ReadByte(); + writer.WriteNumber($"[{usbId.ReadNumber()}]外设ID", usbId); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + /// + /// + /// + /// + /// + /// + public JT808_0x8900_0xF8 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8900_0xF8 value = new JT808_0x8900_0xF8(); + value.USBCount = reader.ReadByte(); + if (value.USBCount > 0) + { + value.MultipleUSB = new List(); + for (int i = 0; i < value.USBCount; i++) + { + value.MultipleUSB.Add(reader.ReadByte()); + } + } + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900_0xF8 value, IJT808Config config) + { + if (value.MultipleUSB != null && value.MultipleUSB.Count > 0) + { + writer.WriteByte((byte)value.MultipleUSB.Count); + foreach (var item in value.MultipleUSB) + { + writer.WriteByte(item); + } + } + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9208.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9208.cs new file mode 100644 index 0000000..1dfd08a --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9208.cs @@ -0,0 +1,143 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; +using System; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 报警附件上传指令 + /// + public class JT808_0x9208: JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// Description + /// + public override string Description => "报警附件上传指令"; + /// + /// 服务IP地址长度 + /// + public byte AttachmentServerIPLength { get; set; } + /// + /// 服务IP地址 + /// + public string AttachmentServerIP { get; set; } + /// + /// TCP端口 + /// + public ushort AttachmentServerIPTcpPort { get; set; } + /// + /// UDP端口 + /// + public ushort AttachmentServerIPUdpPort { get; set; } + /// + /// 报警标识号 + /// + public AlarmIdentificationProperty AlarmIdentification { get; set; } + /// + /// 平台给报警分配的唯一编号 + /// 32 + /// + public string AlarmId { get; set; } + /// + /// 预留 + /// + public byte[] Retain { get; set; } = new byte[16]; + /// + /// 报警附件上传指令Id + /// + public override ushort MsgId => 0x9208; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x9208 value = new JT808_0x9208(); + value.AttachmentServerIPLength = reader.ReadByte(); + writer.WriteNumber($"[{value.AttachmentServerIPLength.ReadNumber()}]服务IP地址长度", value.AttachmentServerIPLength); + string attachmentServerIPHex = reader.ReadVirtualArray(value.AttachmentServerIPLength).ToArray().ToHexString(); + value.AttachmentServerIP = reader.ReadString(value.AttachmentServerIPLength); + writer.WriteString($"[{AttachmentServerIP}]服务IP地址", value.AttachmentServerIP); + value.AttachmentServerIPTcpPort = reader.ReadUInt16(); + writer.WriteNumber($"[{value.AttachmentServerIPTcpPort.ReadNumber()}]TCP端口", value.AttachmentServerIPTcpPort); + value.AttachmentServerIPUdpPort = reader.ReadUInt16(); + writer.WriteNumber($"[{value.AttachmentServerIPUdpPort.ReadNumber()}]UDP端口", value.AttachmentServerIPUdpPort); + value.AlarmIdentification = new AlarmIdentificationProperty(); + string terminalIdHex = reader.ReadVirtualArray(30).ToArray().ToHexString(); + value.AlarmIdentification.TerminalId = reader.ReadString(30); + value.AlarmIdentification.Time = reader.ReadDateTime6(); + value.AlarmIdentification.SN = reader.ReadByte(); + value.AlarmIdentification.AttachCount = reader.ReadByte(); + value.AlarmIdentification.Retain1 = reader.ReadByte(); + value.AlarmIdentification.Retain2 = reader.ReadByte(); + writer.WriteString($"[{terminalIdHex}]终端ID", value.AlarmIdentification.TerminalId); + writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss")); + writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN); + writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount); + writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1); + writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2); + string alarmIdHex = reader.ReadVirtualArray(32).ToArray().ToHexString(); + value.AlarmId = reader.ReadString(32); + writer.WriteString($"[{alarmIdHex}]平台给报警分配的唯一编号", value.AlarmId); + string retainHex = reader.ReadVirtualArray(16).ToArray().ToHexString(); + writer.WriteString($"预留", retainHex); + } + /// + /// + /// + /// + /// + /// + public JT808_0x9208 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x9208 value = new JT808_0x9208(); + value.AttachmentServerIPLength = reader.ReadByte(); + value.AttachmentServerIP = reader.ReadString(value.AttachmentServerIPLength); + value.AttachmentServerIPTcpPort = reader.ReadUInt16(); + value.AttachmentServerIPUdpPort = reader.ReadUInt16(); + value.AlarmIdentification = new AlarmIdentificationProperty + { + TerminalId = reader.ReadString(30), + Time = reader.ReadDateTime6(), + SN = reader.ReadByte(), + AttachCount = reader.ReadByte(), + Retain1 = reader.ReadByte(), + Retain2 = reader.ReadByte() + }; + value.AlarmId = reader.ReadString(32); + value.Retain = reader.ReadArray(16).ToArray(); + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9208 value, IJT808Config config) + { + writer.Skip(1, out int AttachmentServerIPLengthPosition); + writer.WriteString(value.AttachmentServerIP); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - AttachmentServerIPLengthPosition - 1), AttachmentServerIPLengthPosition); + writer.WriteUInt16(value.AttachmentServerIPTcpPort); + writer.WriteUInt16(value.AttachmentServerIPUdpPort); + if (value.AlarmIdentification == null) + { + throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空"); + } + writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0')); + writer.WriteDateTime6(value.AlarmIdentification.Time); + writer.WriteByte(value.AlarmIdentification.SN); + writer.WriteByte(value.AlarmIdentification.AttachCount); + writer.WriteByte(value.AlarmIdentification.Retain1); + writer.WriteByte(value.AlarmIdentification.Retain2); + writer.WriteString(value.AlarmId); + writer.WriteArray(value.Retain); + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9212.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9212.cs new file mode 100644 index 0000000..0e4bf41 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9212.cs @@ -0,0 +1,139 @@ +using JT808.Protocol.Extensions.YueBiao.Metadata; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; +using System.Collections.Generic; +using System.Text.Json; + +namespace JT808.Protocol.Extensions.YueBiao.MessageBody +{ + /// + /// 文件上传完成消息应答 + /// + public class JT808_0x9212: JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze + { + /// + /// 文件上传完成消息应答 + /// + public override string Description => "文件上传完成消息应答"; + /// + /// 文件名称长度 + /// + public byte FileNameLength { get; set; } + /// + /// 文件名称 + /// + public string FileName { get; set; } + /// + /// 文件类型 + /// + public byte FileType { get; set; } + /// + /// 上传结果 + /// + public byte UploadResult { get; set; } + /// + /// 补传数据包数量 + /// 需要补传的数据包数量,无补传时该值为0 + /// + public byte DataPackageCount { get; set; } + /// + /// 补传数据包列表 + /// + public List DataPackages { get; set; } + /// + /// 文件上传完成消息应答Id + /// + public override ushort MsgId => 0x9212; + /// + /// + /// + /// + /// + /// + public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) + { + JT808_0x9212 value = new JT808_0x9212(); + value.FileNameLength = reader.ReadByte(); + writer.WriteNumber($"[{value.FileNameLength.ReadNumber()}]文件名称长度", value.FileNameLength); + string fileNameHex = reader.ReadVirtualArray(value.FileNameLength).ToArray().ToHexString(); + value.FileName = reader.ReadString(value.FileNameLength); + writer.WriteString($"[{fileNameHex}]文件名称", value.FileName); + value.FileType = reader.ReadByte(); + writer.WriteNumber($"[{value.FileType.ReadNumber()}]文件类型", value.FileType); + value.UploadResult = reader.ReadByte(); + writer.WriteNumber($"[{value.UploadResult.ReadNumber()}]上传结果", value.UploadResult); + value.DataPackageCount = reader.ReadByte(); + writer.WriteNumber($"[{value.DataPackageCount.ReadNumber()}]补传数据包数量", value.DataPackageCount); + if (value.DataPackageCount > 0) + { + writer.WriteStartArray("补传数据包列表"); + for (int i = 0; i < value.DataPackageCount; i++) + { + writer.WriteStartObject(); + DataPackageProperty dataPackageProperty = new DataPackageProperty(); + dataPackageProperty.Offset = reader.ReadUInt32(); + writer.WriteNumber($"[{dataPackageProperty.Offset.ReadNumber()}]数据偏移量", dataPackageProperty.Offset); + dataPackageProperty.Length = reader.ReadUInt32(); + writer.WriteNumber($"[{dataPackageProperty.Length.ReadNumber()}]数据长度", dataPackageProperty.Length); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + /// + /// + /// + /// + /// + /// + public JT808_0x9212 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x9212 value = new JT808_0x9212(); + value.FileNameLength = reader.ReadByte(); + value.FileName = reader.ReadString(value.FileNameLength); + value.FileType = reader.ReadByte(); + value.UploadResult = reader.ReadByte(); + value.DataPackageCount = reader.ReadByte(); + if (value.DataPackageCount > 0) + { + value.DataPackages = new List(); + for (int i = 0; i < value.DataPackageCount; i++) + { + DataPackageProperty dataPackageProperty = new DataPackageProperty(); + dataPackageProperty.Offset = reader.ReadUInt32(); + dataPackageProperty.Length = reader.ReadUInt32(); + value.DataPackages.Add(dataPackageProperty); + } + } + return value; + } + /// + /// + /// + /// + /// + /// + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9212 value, IJT808Config config) + { + writer.Skip(1, out int FileNameLengthPosition); + writer.WriteString(value.FileName); + writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition); + writer.WriteByte(value.FileType); + writer.WriteByte(value.UploadResult); + if (value.DataPackages != null && value.DataPackages.Count > 0) + { + writer.WriteByte((byte)value.DataPackages.Count); + foreach (var item in value.DataPackages) + { + writer.WriteUInt32(item.Offset); + writer.WriteUInt32(item.Length); + } + } + else + { + writer.WriteByte(0); + } + } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmIdentificationProperty.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmIdentificationProperty.cs new file mode 100644 index 0000000..bb07ceb --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmIdentificationProperty.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Metadata +{ + /// + /// 报警标识号 + /// 报警附件信息消息数据格式 + /// + public class AlarmIdentificationProperty + { + /// + /// 终端ID + /// 30 + /// + public string TerminalId { get; set; } + /// + /// YY-MM-DD-hh-mm-ss + /// BCD[6] + /// + public DateTime Time { get; set; } + /// + /// 序号 + /// + public byte SN { get; set; } + /// + /// 附件数量 + /// + public byte AttachCount { get; set; } + /// + /// 预留1 + /// + public byte Retain1 { get; set; } + /// + /// 预留2 + /// + public byte Retain2 { get; set; } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmOrEventProperty.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmOrEventProperty.cs new file mode 100644 index 0000000..b5d4ce1 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmOrEventProperty.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Metadata +{ + /// + /// 胎压监测系统报警/事件信息 + /// + public class AlarmOrEventProperty + { + /// + /// 胎压报警位置 + /// + public byte TirePressureAlarmPosition { get; set; } + /// + /// 报警/事件类型 + /// + public ushort AlarmOrEventType { get; set; } + /// + /// 胎压 + /// + public ushort TirePressure { get; set; } + /// + /// 胎温 + /// + public ushort TireTemperature { get; set; } + /// + /// 电池电量 + /// + public ushort BatteryLevel { get; set; } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AttachProperty.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AttachProperty.cs new file mode 100644 index 0000000..d7b3bec --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AttachProperty.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Metadata +{ + /// + /// 附件信息 + /// + public class AttachProperty + { + /// + /// 文件名称长度 + /// + public byte FileNameLength { get; set; } + /// + /// 文件名称 + /// 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名 + /// + public string FileName{ get; set; } + /// + /// 文件大小 + /// + public uint FileSize { get; set; } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/DataPackageProperty.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/DataPackageProperty.cs new file mode 100644 index 0000000..4ad2820 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/DataPackageProperty.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Metadata +{ + /// + /// 补传数据包信息 + /// + public class DataPackageProperty + { + /// + /// 数据偏移量 + /// + public uint Offset { get; set; } + /// + /// 数据长度 + /// + public uint Length { get; set; } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF7_USB.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF7_USB.cs new file mode 100644 index 0000000..9661b6b --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF7_USB.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Metadata +{ + /// + /// + /// + public class JT808_0x0900_0xF7_USB + { + /// + /// 外设ID + /// + /// + public byte USBID { get; set; } + /// + /// 消息长度 + /// + public byte MessageLength { get; set; } + /// + /// 工作状态 + /// + /// + public byte WorkingCondition { get; set; } + /// + /// 报警状态 + /// + public uint AlarmStatus { get; set; } + } +} diff --git a/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF8_USB.cs b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF8_USB.cs new file mode 100644 index 0000000..703a378 --- /dev/null +++ b/src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF8_USB.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.YueBiao.Metadata +{ + /// + /// + /// + public class JT808_0x0900_0xF8_USB + { + /// + /// 外设ID + /// + /// + public byte USBID { get; set; } + /// + /// 消息长度 + /// + public byte MessageLength { get; set; } + /// + /// 公司名称长度 + /// + public byte CompantNameLength { get; set; } + /// + /// 公司名称 + /// + public string CompantName { get; set; } + /// + /// 产品型号长度 + /// + public byte ProductModelLength { get; set; } + /// + /// 产品型号 + /// + public string ProductModel { get; set; } + /// + /// 硬件版本号长度 + /// + public byte HardwareVersionNumberLength { get; set; } + /// + /// 硬件版本号 + /// ASCII + /// + public string HardwareVersionNumber { get; set; } + /// + /// 软件版本号长度 + /// + public byte SoftwareVersionNumberLength { get; set; } + /// + /// 软件版本号 + /// ASCII + /// + public string SoftwareVersionNumber { get; set; } + /// + /// 设备ID长度 + /// + public byte DevicesIDLength { get; set; } + /// + /// 设备ID + /// + public string DevicesID { get; set; } + /// + /// 客户代码长度 + /// + public byte CustomerCodeLength { get; set; } + /// + /// 客户代码 + /// + public string CustomerCode { get; set; } + } +} diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index 9d70f32..73cd840 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -9726,6 +9726,13 @@ 附加信息长度 + + + 附加信息长度扩展 + 4个字节 + 注意:只适用于已知的协议才行 + + 自定义位置附加信息 diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_BodyBase.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_BodyBase.cs index c33f307..0980e62 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0200_BodyBase.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_BodyBase.cs @@ -17,5 +17,11 @@ namespace JT808.Protocol.MessageBody /// 附加信息长度 /// public abstract byte AttachInfoLength { get; set; } + /// + /// 附加信息长度扩展 + /// 4个字节 + /// 注意:只适用于已知的协议才行 + /// + public virtual uint AttachInfoLengthExtend { get; set; } } }