@@ -84,5 +84,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test | |||
Assert.Equal(18, jT808_0X0200_0X65.Fatigue); | |||
Assert.Equal(19, jT808_0X0200_0X65.VehicleState); | |||
} | |||
[Fact] | |||
public void Json() | |||
{ | |||
var json = JT808Serializer.Analyze<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C00001807151010106520000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); | |||
} | |||
} | |||
} |
@@ -72,6 +72,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
Assert.Equal("000000010000000200BA7F0E07E4F11C0028003C0000180715101010663B000000010C1100070000000D0000000E191211183100001334343434343434191210183100030200020400010003000500020900060008000A0007", hex); | |||
} | |||
[Fact] | |||
public void Deserialize() | |||
{ | |||
@@ -103,5 +104,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test | |||
Assert.Equal(17, jT808_0X0200_0X66.Speed); | |||
Assert.Equal(19, jT808_0X0200_0X66.VehicleState); | |||
} | |||
[Fact] | |||
public void Json() | |||
{ | |||
var json = JT808Serializer.Analyze<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C0000180715101010663B000000010C1100070000000D0000000E191211183100001334343434343434191210183100030200020400010003000500020900060008000A0007".ToHexBytes()); | |||
} | |||
} | |||
} |
@@ -80,5 +80,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test | |||
Assert.Equal(17, jT808_0X0200_0X67.Speed); | |||
Assert.Equal(19, jT808_0X0200_0X67.VehicleState); | |||
} | |||
[Fact] | |||
public void Json() | |||
{ | |||
var json = JT808Serializer.Analyze<JT808_0x0200>("000000010000000200BA7F0E07E4F11C0028003C0000180715101010671A000000010C09081100070000000D0000000E191211183100001334343434343434191210183100030200".ToHexBytes()); | |||
} | |||
} | |||
} |
@@ -195,7 +195,7 @@ | |||
</member> | |||
<member name="P:JT808.Protocol.Extensions.JTActiveSafety.MessageBody.JT808_0x0200_0x65.AlarmLevel"> | |||
<summary> | |||
报警/事件类型 | |||
报警级别 | |||
</summary> | |||
</member> | |||
<member name="P:JT808.Protocol.Extensions.JTActiveSafety.MessageBody.JT808_0x0200_0x65.Fatigue"> | |||
@@ -227,6 +227,25 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
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 | |||
{ | |||
TerminalID = reader.ReadString(7), | |||
@@ -1,17 +1,19 @@ | |||
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 | |||
{ | |||
/// <summary> | |||
/// 驾驶员状态监测系统报警信息 | |||
/// </summary> | |||
public class JT808_0x0200_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x65> | |||
public class JT808_0x0200_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x65>, IJT808Analyze | |||
{ | |||
public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x65; | |||
public override byte AttachInfoLength { get; set; } = 32; | |||
@@ -28,7 +30,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
/// </summary> | |||
public byte AlarmOrEventType{ get; set; } | |||
/// <summary> | |||
/// 报警/事件类型 | |||
/// 报警级别 | |||
/// </summary> | |||
public byte AlarmLevel { get; set; } | |||
/// <summary> | |||
@@ -70,24 +72,169 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
/// </summary> | |||
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: | |||
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.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 | |||
{ | |||
TerminalID = reader.ReadString(7), | |||
Time = reader.ReadDateTime6(), | |||
SN = reader.ReadByte(), | |||
AttachCount = reader.ReadByte(), | |||
Retain = reader.ReadByte() | |||
}; | |||
writer.WriteString($"[{value.AlarmIdentification.TerminalID}]终端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.Retain.ReadNumber()}]预留", value.AlarmIdentification.Retain); | |||
} | |||
public JT808_0x0200_0x65 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x0200_0x65 jT808_0X0200_0X65 = new JT808_0x0200_0x65(); | |||
jT808_0X0200_0X65.AttachInfoId = reader.ReadByte(); | |||
jT808_0X0200_0X65.AttachInfoLength = reader.ReadByte(); | |||
jT808_0X0200_0X65.AlarmId = reader.ReadUInt32(); | |||
jT808_0X0200_0X65.FlagState = reader.ReadByte(); | |||
jT808_0X0200_0X65.AlarmOrEventType = reader.ReadByte(); | |||
jT808_0X0200_0X65.AlarmLevel = reader.ReadByte(); | |||
jT808_0X0200_0X65.Fatigue = reader.ReadByte(); | |||
jT808_0X0200_0X65.Retain = reader.ReadArray(4).ToArray(); | |||
jT808_0X0200_0X65.Speed = reader.ReadByte(); | |||
jT808_0X0200_0X65.Altitude = reader.ReadUInt16(); | |||
jT808_0X0200_0X65.Latitude = (int)reader.ReadUInt32(); | |||
jT808_0X0200_0X65.Longitude = (int)reader.ReadUInt32(); | |||
jT808_0X0200_0X65.AlarmTime = reader.ReadDateTime6(); | |||
jT808_0X0200_0X65.VehicleState = reader.ReadUInt16(); | |||
jT808_0X0200_0X65.AlarmIdentification = new AlarmIdentificationProperty | |||
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(7), | |||
Time = reader.ReadDateTime6(), | |||
@@ -95,7 +242,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
AttachCount = reader.ReadByte(), | |||
Retain = reader.ReadByte() | |||
}; | |||
return jT808_0X0200_0X65; | |||
return value; | |||
} | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x65 value, IJT808Config config) | |||
@@ -1,17 +1,19 @@ | |||
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 | |||
{ | |||
/// <summary> | |||
/// 胎压监测系统报警信息 | |||
/// </summary> | |||
public class JT808_0x0200_0x66 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x66> | |||
public class JT808_0x0200_0x66 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x66>, IJT808Analyze | |||
{ | |||
public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x66; | |||
public override byte AttachInfoLength { get; set; } | |||
@@ -62,20 +64,170 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
/// </summary> | |||
public List<AlarmOrEventProperty> 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 | |||
{ | |||
TerminalID = reader.ReadString(7), | |||
Time = reader.ReadDateTime6(), | |||
SN = reader.ReadByte(), | |||
AttachCount = reader.ReadByte(), | |||
Retain = reader.ReadByte() | |||
}; | |||
writer.WriteString($"[{value.AlarmIdentification.TerminalID}]终端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.Retain.ReadNumber()}]预留", value.AlarmIdentification.Retain); | |||
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 jT808_0X0200_0X66 = new JT808_0x0200_0x66(); | |||
jT808_0X0200_0X66.AttachInfoId = reader.ReadByte(); | |||
jT808_0X0200_0X66.AttachInfoLength = reader.ReadByte(); | |||
jT808_0X0200_0X66.AlarmId = reader.ReadUInt32(); | |||
jT808_0X0200_0X66.FlagState = reader.ReadByte(); | |||
jT808_0X0200_0X66.Speed = reader.ReadByte(); | |||
jT808_0X0200_0X66.Altitude = reader.ReadUInt16(); | |||
jT808_0X0200_0X66.Latitude = (int)reader.ReadUInt32(); | |||
jT808_0X0200_0X66.Longitude = (int)reader.ReadUInt32(); | |||
jT808_0X0200_0X66.AlarmTime = reader.ReadDateTime6(); | |||
jT808_0X0200_0X66.VehicleState = reader.ReadUInt16(); | |||
jT808_0X0200_0X66.AlarmIdentification = new AlarmIdentificationProperty | |||
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(7), | |||
Time = reader.ReadDateTime6(), | |||
@@ -83,11 +235,11 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
AttachCount = reader.ReadByte(), | |||
Retain = reader.ReadByte() | |||
}; | |||
jT808_0X0200_0X66.AlarmOrEventCount = reader.ReadByte(); | |||
if (jT808_0X0200_0X66.AlarmOrEventCount > 0) | |||
value.AlarmOrEventCount = reader.ReadByte(); | |||
if (value.AlarmOrEventCount > 0) | |||
{ | |||
jT808_0X0200_0X66.AlarmOrEvents = new List<AlarmOrEventProperty>(); | |||
for (int i = 0; i < jT808_0X0200_0X66.AlarmOrEventCount; i++) | |||
value.AlarmOrEvents = new List<AlarmOrEventProperty>(); | |||
for (int i = 0; i < value.AlarmOrEventCount; i++) | |||
{ | |||
AlarmOrEventProperty alarmOrEventProperty = new AlarmOrEventProperty(); | |||
alarmOrEventProperty.TirePressureAlarmPosition = reader.ReadByte(); | |||
@@ -95,10 +247,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
alarmOrEventProperty.TirePressure = reader.ReadUInt16(); | |||
alarmOrEventProperty.TireTemperature = reader.ReadUInt16(); | |||
alarmOrEventProperty.BatteryLevel = reader.ReadUInt16(); | |||
jT808_0X0200_0X66.AlarmOrEvents.Add(alarmOrEventProperty); | |||
value.AlarmOrEvents.Add(alarmOrEventProperty); | |||
} | |||
} | |||
return jT808_0X0200_0X66; | |||
return value; | |||
} | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x66 value, IJT808Config config) | |||
@@ -1,17 +1,19 @@ | |||
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 | |||
{ | |||
/// <summary> | |||
/// 盲区监测系统报警信息 | |||
/// </summary> | |||
public class JT808_0x0200_0x67 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x67> | |||
public class JT808_0x0200_0x67 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x67>, IJT808Analyze | |||
{ | |||
public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x67; | |||
public override byte AttachInfoLength { get; set; } = 26; | |||
@@ -62,22 +64,163 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
/// </summary> | |||
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 | |||
{ | |||
TerminalID = reader.ReadString(7), | |||
Time = reader.ReadDateTime6(), | |||
SN = reader.ReadByte(), | |||
AttachCount = reader.ReadByte(), | |||
Retain = reader.ReadByte() | |||
}; | |||
writer.WriteString($"[{value.AlarmIdentification.TerminalID}]终端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.Retain.ReadNumber()}]预留", value.AlarmIdentification.Retain); | |||
} | |||
public JT808_0x0200_0x67 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) | |||
{ | |||
JT808_0x0200_0x67 jT808_0X0200_0X67 = new JT808_0x0200_0x67(); | |||
jT808_0X0200_0X67.AttachInfoId = reader.ReadByte(); | |||
jT808_0X0200_0X67.AttachInfoLength = reader.ReadByte(); | |||
jT808_0X0200_0X67.AlarmId = reader.ReadUInt32(); | |||
jT808_0X0200_0X67.FlagState = reader.ReadByte(); | |||
jT808_0X0200_0X67.AlarmOrEventType = reader.ReadByte(); | |||
jT808_0X0200_0X67.AlarmLevel = reader.ReadByte(); | |||
jT808_0X0200_0X67.Speed = reader.ReadByte(); | |||
jT808_0X0200_0X67.Altitude = reader.ReadUInt16(); | |||
jT808_0X0200_0X67.Latitude = (int)reader.ReadUInt32(); | |||
jT808_0X0200_0X67.Longitude = (int)reader.ReadUInt32(); | |||
jT808_0X0200_0X67.AlarmTime = reader.ReadDateTime6(); | |||
jT808_0X0200_0X67.VehicleState = reader.ReadUInt16(); | |||
jT808_0X0200_0X67.AlarmIdentification = new AlarmIdentificationProperty | |||
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(7), | |||
Time = reader.ReadDateTime6(), | |||
@@ -85,7 +228,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
AttachCount = reader.ReadByte(), | |||
Retain = reader.ReadByte() | |||
}; | |||
return jT808_0X0200_0X67; | |||
return value; | |||
} | |||
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x67 value, IJT808Config config) | |||