diff --git a/README.md b/README.md index 0894f69..033d44f 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,11 @@ JTActiveSafety协议、道路运输车辆主动安全智能防控系统-主动 | 12 | 0x8103_0xF366 | √ | √ | 胎压监测系统参数 | | 13 | 0x8103_0xF367 | √ | √ | 盲区监测系统参数 | | 14 | 0x0900 | √ | √ | 上传基本信息 | -| 15 | 0x0900_USB_0xF7 | √ | √ | 外设工作状态 | -| 16 | 0x0900_USB_0xF8 | √ | √ | 外设系统信息 | +| 15 | 0x0900_0xF7 | √ | √ | 外设工作状态 | +| 16 | 0x0900_0xF8 | √ | √ | 外设系统信息 | | 17 | 0x8900 | √ | √ | 查询基本信息 | +| 18 | 0x8900_0xF7 | √ | √ | 外设工作状态 | +| 19 | 0x8900_0xF8 | √ | √ | 外设系统信息 | ### 使用方法 diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_JTActiveSafety_0x0900_Test.cs b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0900_Test.cs similarity index 90% rename from src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_JTActiveSafety_0x0900_Test.cs rename to src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0900_Test.cs index b4d71d4..1cffc5e 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_JTActiveSafety_0x0900_Test.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x0900_Test.cs @@ -9,10 +9,10 @@ using Xunit; namespace JT808.Protocol.Extensions.JTActiveSafety.Test { - public class JT808_JTActiveSafety_0x0900_Test + public class JT808_0x0900_Test { JT808Serializer JT808Serializer; - public JT808_JTActiveSafety_0x0900_Test() + public JT808_0x0900_Test() { ServiceCollection serviceDescriptors = new ServiceCollection(); serviceDescriptors.AddJT808Configure() @@ -62,6 +62,12 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test Assert.Equal(1u, jT808_0x0900_0xF7.USBMessages[1].AlarmStatus); } + [Fact] + public void Test_0xF7_3() + { + var json = JT808Serializer.Analyze("020105020000000102050200000001".ToHexBytes()); + } + [Fact] public void Test_0xF8_1() { @@ -104,5 +110,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test Assert.Equal("SoftwareVersionNumber", jT808_0x0900_0xF8.USBMessages[0].SoftwareVersionNumber); Assert.Equal("SoftwareVersionNumber".Length, jT808_0x0900_0xF8.USBMessages[0].SoftwareVersionNumberLength); } + + [Fact] + public void Test_0xF8_3() + { + var json = JT808Serializer.Analyze("01015C0B436F6D70616E744E616D650C50726F647563744D6F64656C15486172647761726556657273696F6E4E756D62657215536F66747761726556657273696F6E4E756D626572094465766963657349440C437573746F6D6572436F6465".ToHexBytes()); + } } } diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_JTActiveSafety_0x8900_Test.cs b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x8900_Test.cs similarity index 93% rename from src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_JTActiveSafety_0x8900_Test.cs rename to src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x8900_Test.cs index 9afbcc0..4e1e396 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_JTActiveSafety_0x8900_Test.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x8900_Test.cs @@ -8,10 +8,10 @@ using Xunit; namespace JT808.Protocol.Extensions.JTActiveSafety.Test { - public class JT808_JTActiveSafety_0x8900_Test + public class JT808_0x8900_Test { JT808Serializer JT808Serializer; - public JT808_JTActiveSafety_0x8900_Test() + public JT808_0x8900_Test() { ServiceCollection serviceDescriptors = new ServiceCollection(); serviceDescriptors.AddJT808Configure() diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/Enums/WorkingConditionType.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/Enums/WorkingConditionType.cs new file mode 100644 index 0000000..49cc21d --- /dev/null +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/Enums/WorkingConditionType.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Extensions.JTActiveSafety.Enums +{ + /// + /// 工作状态 + /// + public enum WorkingConditionType:byte + { + 正常工作=0x01, + 待机状态=0x02, + 升级维护=0x03, + 设备异常 = 0x04, + 断开连接 = 0x10, + } +} diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml b/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml index 6fe2caf..1a13e08 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml @@ -36,6 +36,11 @@ 盲点监测系统 + + + 工作状态 + + 附加信息ID 高级驾驶辅助系统报警信息 @@ -1133,6 +1138,7 @@ 工作状态 + diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF7.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF7.cs index 95010ab..401de44 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF7.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF7.cs @@ -1,14 +1,17 @@ -using JT808.Protocol.Extensions.JTActiveSafety.Metadata; +using JT808.Protocol.Extensions.JTActiveSafety.Enums; +using JT808.Protocol.Extensions.JTActiveSafety.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.JTActiveSafety.MessageBody { - public class JT808_0x0900_0xF7 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter + public class JT808_0x0900_0xF7 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter, IJT808Analyze { public override byte PassthroughType { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0900_0xF7; /// @@ -18,6 +21,46 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody 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(); diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF8.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF8.cs index 838f126..3b3b5ed 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF8.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x0900_0xF8.cs @@ -1,14 +1,16 @@ using JT808.Protocol.Extensions.JTActiveSafety.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.JTActiveSafety.MessageBody { - public class JT808_0x0900_0xF8 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter + public class JT808_0x0900_0xF8 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter, IJT808Analyze { public override byte PassthroughType { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0900_0xF8; /// @@ -16,6 +18,67 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody /// 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}]设备ID", item.CustomerCode); + + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + } + public JT808_0x0900_0xF8 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0900_0xF8 value = new JT808_0x0900_0xF8(); diff --git a/src/JT808.Protocol.Extensions.JTActiveSafety/Metadata/JT808_0x0900_0xF7_USB.cs b/src/JT808.Protocol.Extensions.JTActiveSafety/Metadata/JT808_0x0900_0xF7_USB.cs index efe30d5..f040aef 100644 --- a/src/JT808.Protocol.Extensions.JTActiveSafety/Metadata/JT808_0x0900_0xF7_USB.cs +++ b/src/JT808.Protocol.Extensions.JTActiveSafety/Metadata/JT808_0x0900_0xF7_USB.cs @@ -17,6 +17,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Metadata public byte MessageLength { get; set; } /// /// 工作状态 + /// /// public byte WorkingCondition { get; set; } ///