/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_CarDVR_Up_0x09 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_CarDVR_Up_0x09 value = new JT808_CarDVR_Up_0x09(); value.JT808_CarDVR_Up_0x09_PositionPerHours = new List <JT808_CarDVR_Up_0x09_PositionPerHour>(); var count = (reader.ReadCurrentRemainContentLength() - 1) / 666;//记录块个数, -1 去掉校验位 for (int i = 0; i < count; i++) { JT808_CarDVR_Up_0x09_PositionPerHour jT808_CarDVR_Up_0x09_PositionPerHour = new JT808_CarDVR_Up_0x09_PositionPerHour() { StartTime = reader.ReadDateTime_yyMMddHHmmss(), JT808_CarDVR_Up_0x09_PositionPerMinutes = new List <JT808_CarDVR_Up_0x09_PositionPerMinute>() }; for (int j = 0; j < 60; j++)//60钟 { jT808_CarDVR_Up_0x09_PositionPerHour.JT808_CarDVR_Up_0x09_PositionPerMinutes.Add(new JT808_CarDVR_Up_0x09_PositionPerMinute { GpsLng = reader.ReadInt32(), GpsLat = reader.ReadInt32(), Height = reader.ReadInt16(), AvgSpeedAfterStartTime = reader.ReadByte() }); } value.JT808_CarDVR_Up_0x09_PositionPerHours.Add(jT808_CarDVR_Up_0x09_PositionPerHour); } return(value); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_CarDVR_Up_0x10 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_CarDVR_Up_0x10 value = new JT808_CarDVR_Up_0x10(); value.JT808_CarDVR_Up_0x10_AccidentSuspectins = new List <JT808_CarDVR_Up_0x10_AccidentSuspectin>(); var count = (reader.ReadCurrentRemainContentLength() - 1) / 234;//记录块个数, -1 去掉校验位 for (int i = 0; i < count; i++) { JT808_CarDVR_Up_0x10_AccidentSuspectin jT808_CarDVR_Up_0x10_AccidentSuspectin = new JT808_CarDVR_Up_0x10_AccidentSuspectin(); jT808_CarDVR_Up_0x10_AccidentSuspectin.EndTime = reader.ReadDateTime_yyMMddHHmmss(); jT808_CarDVR_Up_0x10_AccidentSuspectin.DriverLicenseNo = reader.ReadASCII(18); jT808_CarDVR_Up_0x10_AccidentSuspectin.JT808_CarDVR_Up_0x10_DrivingStatuss = new List <JT808_CarDVR_Up_0x10_DrivingStatus>(); for (int j = 0; j < 100; j++)//100组 { jT808_CarDVR_Up_0x10_AccidentSuspectin.JT808_CarDVR_Up_0x10_DrivingStatuss.Add(new JT808_CarDVR_Up_0x10_DrivingStatus { Speed = reader.ReadByte(), StatusSignal = reader.ReadByte() }); } jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLng = reader.ReadInt32(); jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLat = reader.ReadInt32(); jT808_CarDVR_Up_0x10_AccidentSuspectin.Height = reader.ReadInt16(); value.JT808_CarDVR_Up_0x10_AccidentSuspectins.Add(jT808_CarDVR_Up_0x10_AccidentSuspectin); } return(value); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="writer"></param> /// <param name="config"></param> public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); var count = (reader.ReadCurrentRemainContentLength() - 1) / 666;//记录块个数, -1 去掉校验位 for (int i = 0; i < count; i++) { JT808_CarDVR_Up_0x09_PositionPerHour jT808_CarDVR_Up_0x09_PositionPerHour = new JT808_CarDVR_Up_0x09_PositionPerHour(); writer.WriteStartObject(); writer.WriteStartObject($"指定的结束时间之前最近的第{i+1}小时的位置信息记录"); var hex = reader.ReadVirtualArray(6); jT808_CarDVR_Up_0x09_PositionPerHour.StartTime = reader.ReadDateTime_yyMMddHHmmss(); writer.WriteString($"[{hex.ToArray().ToHexString()}]开始时间", jT808_CarDVR_Up_0x09_PositionPerHour.StartTime); for (int j = 0; j < 60; j++)//60钟 { JT808_CarDVR_Up_0x09_PositionPerMinute jT808_CarDVR_Up_0X09_PositionPerMinute = new JT808_CarDVR_Up_0x09_PositionPerMinute(); writer.WriteStartObject($"开始时间之后第{j+1}分钟的平均速度和位置信息"); jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLng = reader.ReadInt32(); writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLng.ReadNumber()}]经度", jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLng); jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLat = reader.ReadInt32(); writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLat.ReadNumber()}]纬度", jT808_CarDVR_Up_0X09_PositionPerMinute.GpsLat); jT808_CarDVR_Up_0X09_PositionPerMinute.Height = reader.ReadInt16(); writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.Height.ReadNumber()}]高度", jT808_CarDVR_Up_0X09_PositionPerMinute.Height); jT808_CarDVR_Up_0X09_PositionPerMinute.AvgSpeedAfterStartTime = reader.ReadByte(); writer.WriteNumber($"[{jT808_CarDVR_Up_0X09_PositionPerMinute.AvgSpeedAfterStartTime.ReadNumber()}]平均速度", jT808_CarDVR_Up_0X09_PositionPerMinute.AvgSpeedAfterStartTime); writer.WriteEndObject(); } writer.WriteEndObject(); writer.WriteEndObject(); } writer.WriteEndArray(); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x8108 value = new JT808_0x8108(); value.UpgradeType = (JT808UpgradeType)reader.ReadByte(); writer.WriteNumber($"[{ ((byte)value.UpgradeType).ReadNumber()}]升级类型-{value.UpgradeType.ToString()}", (byte)value.UpgradeType); if (reader.Version == JT808Version.JTT2019) { var makerIdBuffer = reader.ReadVirtualArray(11).ToArray(); value.MakerId = reader.ReadString(11); writer.WriteString($"[{makerIdBuffer.ToHexString()}]制造商ID", value.MakerId); } else { var makerIdBuffer = reader.ReadVirtualArray(5).ToArray(); value.MakerId = reader.ReadString(5); writer.WriteString($"[{makerIdBuffer.ToHexString()}]制造商ID", value.MakerId); } value.VersionNumLength = reader.ReadByte(); writer.WriteNumber($"[{value.VersionNumLength.ReadNumber()}]版本号长度", value.VersionNumLength); var versionNumBuffer = reader.ReadVirtualArray(value.VersionNumLength).ToArray(); value.VersionNum = reader.ReadString(value.VersionNumLength); writer.WriteString($"[{versionNumBuffer.ToHexString()}]版本号", value.VersionNum); value.UpgradePackageLength = reader.ReadInt32(); writer.WriteNumber($"[{value.UpgradePackageLength.ReadNumber()}]升级数据包长度", value.UpgradePackageLength); value.UpgradePackage = reader.ReadArray(value.UpgradePackageLength).ToArray(); writer.WriteString($"升级数据包", value.UpgradePackage.ToHexString()); }
public JT808_0x8202 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8202 jT808_0X8202 = new JT808_0x8202(); jT808_0X8202.Interval = reader.ReadUInt16(); jT808_0X8202.LocationTrackingValidity = reader.ReadInt32(); return(jT808_0X8202); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_CarDVR_Up_0x10 value = new JT808_CarDVR_Up_0x10(); writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); var count = (reader.ReadCurrentRemainContentLength() - 1) / 234;//记录块个数, -1 去掉校验位 for (int i = 0; i < count; i++) { JT808_CarDVR_Up_0x10_AccidentSuspectin jT808_CarDVR_Up_0x10_AccidentSuspectin = new JT808_CarDVR_Up_0x10_AccidentSuspectin(); writer.WriteStartObject(); writer.WriteStartObject($"指定的结束时间之前最近的第{i+1}条事故疑点记录"); var hex = reader.ReadVirtualArray(6); jT808_CarDVR_Up_0x10_AccidentSuspectin.EndTime = reader.ReadDateTime6(); writer.WriteString($"[{hex.ToArray().ToHexString()}]行驶结束时间", jT808_CarDVR_Up_0x10_AccidentSuspectin.EndTime); hex = reader.ReadVirtualArray(18); jT808_CarDVR_Up_0x10_AccidentSuspectin.DriverLicenseNo = reader.ReadASCII(18); writer.WriteString($"[{hex.ToArray().ToHexString()}]机动车驾驶证号码", jT808_CarDVR_Up_0x10_AccidentSuspectin.DriverLicenseNo); for (int j = 0; j < 100; j++)//100组 { JT808_CarDVR_Up_0x10_DrivingStatus jT808_CarDVR_Up_0X10_DrivingStatus = new JT808_CarDVR_Up_0x10_DrivingStatus(); if (j == 0) { writer.WriteStartObject("行驶结束时的速度"); } else { writer.WriteStartObject($"行驶结束时间前 { (j * 0.2).ToString("F1")} 秒时的速度"); } jT808_CarDVR_Up_0X10_DrivingStatus.Speed = reader.ReadByte(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0X10_DrivingStatus.Speed.ReadNumber()}]速度", jT808_CarDVR_Up_0X10_DrivingStatus.Speed); jT808_CarDVR_Up_0X10_DrivingStatus.StatusSignal = reader.ReadByte(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0X10_DrivingStatus.StatusSignal.ReadNumber()}]状态信号", jT808_CarDVR_Up_0X10_DrivingStatus.StatusSignal); writer.WriteEndObject(); } jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLng = reader.ReadInt32(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLng.ReadNumber()}]经度", jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLng); jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLat = reader.ReadInt32(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLat.ReadNumber()}]纬度", jT808_CarDVR_Up_0x10_AccidentSuspectin.GpsLat); jT808_CarDVR_Up_0x10_AccidentSuspectin.Height = reader.ReadInt16(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x10_AccidentSuspectin.Height.ReadNumber()}]高度", jT808_CarDVR_Up_0x10_AccidentSuspectin.Height); writer.WriteEndObject(); writer.WriteEndObject(); } writer.WriteEndArray(); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_0x0200_0x01 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x01 value = new JT808_0x0200_0x01(); value.AttachInfoId = reader.ReadByte(); value.AttachInfoLength = reader.ReadByte(); value.Mileage = reader.ReadInt32(); return(value); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_0x0200_0x25 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x25 value = new JT808_0x0200_0x25(); value.AttachInfoId = reader.ReadByte(); value.AttachInfoLength = reader.ReadByte(); value.CarSignalStatus = reader.ReadInt32(); return(value); }
public JT808_0x0200_0x01 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x01 jT808LocationAttachImpl0X01 = new JT808_0x0200_0x01(); jT808LocationAttachImpl0X01.AttachInfoId = reader.ReadByte(); jT808LocationAttachImpl0X01.AttachInfoLength = reader.ReadByte(); jT808LocationAttachImpl0X01.Mileage = reader.ReadInt32(); return(jT808LocationAttachImpl0X01); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x8202 value = new JT808_0x8202(); value.Interval = reader.ReadUInt16(); writer.WriteNumber($"[{ value.Interval.ReadNumber()}]时间间隔", value.Interval); value.LocationTrackingValidity = reader.ReadInt32(); writer.WriteNumber($"[{ value.LocationTrackingValidity.ReadNumber()}]位置跟踪有效期", value.LocationTrackingValidity); }
public JT808_0x0200_0x2B Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x2B jT808LocationAttachImpl0x2B = new JT808_0x0200_0x2B(); jT808LocationAttachImpl0x2B.AttachInfoId = reader.ReadByte(); jT808LocationAttachImpl0x2B.AttachInfoLength = reader.ReadByte(); jT808LocationAttachImpl0x2B.Analog = reader.ReadInt32(); return(jT808LocationAttachImpl0x2B); }
public JT808_0x0200_0x25 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x25 jT808LocationAttachImpl0x13 = new JT808_0x0200_0x25(); jT808LocationAttachImpl0x13.AttachInfoId = reader.ReadByte(); jT808LocationAttachImpl0x13.AttachInfoLength = reader.ReadByte(); jT808LocationAttachImpl0x13.CarSignalStatus = reader.ReadInt32(); return(jT808LocationAttachImpl0x13); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_CarDVR_Up_0x11 value = new JT808_CarDVR_Up_0x11(); writer.WriteStartArray("请求发送指定的时间范围内 N 个单位数据块的数据"); var count = (reader.ReadCurrentRemainContentLength() - 1) / 50;//记录块个数, -1 去掉校验位 for (int i = 0; i < count; i++) { JT808_CarDVR_Up_0x11_DriveOverTime jT808_CarDVR_Up_0x11_DriveOverTime = new JT808_CarDVR_Up_0x11_DriveOverTime(); writer.WriteStartObject(); writer.WriteStartObject($"指定的结束时间前最近的第 {i+1}条超时驾驶记录"); var hex = reader.ReadVirtualArray(18); jT808_CarDVR_Up_0x11_DriveOverTime.DriverLicenseNo = reader.ReadASCII(18); writer.WriteString($"[{hex.ToArray().ToHexString()}机动车驾驶证号码]", jT808_CarDVR_Up_0x11_DriveOverTime.DriverLicenseNo); hex = reader.ReadVirtualArray(6); jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingStartTime = reader.ReadDateTime6(); writer.WriteString($"[{hex.ToArray().ToHexString()}连续驾驶开始时间]", jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingStartTime); hex = reader.ReadVirtualArray(6); jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingEndTime = reader.ReadDateTime6(); writer.WriteString($"[{hex.ToArray().ToHexString()}连续驾驶结束时间]", jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingEndTime); writer.WriteStartObject("连续驾驶开始时间所在的最近一次有效位置信息"); jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLng = reader.ReadInt32(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLng.ReadNumber()}]经度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLng); jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLat = reader.ReadInt32(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLat.ReadNumber()}纬度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLat); jT808_CarDVR_Up_0x11_DriveOverTime.StartHeight = reader.ReadInt16(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.StartHeight.ReadNumber()}]高度", jT808_CarDVR_Up_0x11_DriveOverTime.StartHeight); writer.WriteEndObject(); writer.WriteStartObject("连续驾驶结束时间所在的最近一次有效位置信息"); jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLng = reader.ReadInt32(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLng.ReadNumber()}]经度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLng); jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLat = reader.ReadInt32(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLat.ReadNumber()}]纬度", jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLat); jT808_CarDVR_Up_0x11_DriveOverTime.EndHeight = reader.ReadInt16(); writer.WriteNumber($"[{ jT808_CarDVR_Up_0x11_DriveOverTime.EndHeight.ReadNumber()}]高度", jT808_CarDVR_Up_0x11_DriveOverTime.EndHeight); writer.WriteEndObject(); writer.WriteEndObject(); writer.WriteEndObject(); } writer.WriteEndArray(); }
public JT808_0x0200_0x13 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x13 jT808LocationAttachImpl0x13 = new JT808_0x0200_0x13(); jT808LocationAttachImpl0x13.AttachInfoId = reader.ReadByte(); jT808LocationAttachImpl0x13.AttachInfoLength = reader.ReadByte(); jT808LocationAttachImpl0x13.DrivenRouteId = reader.ReadInt32(); jT808LocationAttachImpl0x13.Time = reader.ReadUInt16(); jT808LocationAttachImpl0x13.DrivenRoute = (JT808DrivenRouteType)reader.ReadByte(); return(jT808LocationAttachImpl0x13); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="writer"></param> /// <param name="config"></param> public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0200_0x01 value = new JT808_0x0200_0x01(); value.AttachInfoId = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); value.AttachInfoLength = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); value.Mileage = reader.ReadInt32(); writer.WriteNumber($"[{value.Mileage.ReadNumber()}]里程", value.Mileage); }
public JT808LocationAttachImpl0x06 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808LocationAttachImpl0x06 jT808LocationAttachImpl0x06 = new JT808LocationAttachImpl0x06(); jT808LocationAttachImpl0x06.AttachInfoId = reader.ReadByte(); jT808LocationAttachImpl0x06.AttachInfoLength = reader.ReadByte(); jT808LocationAttachImpl0x06.Age = reader.ReadInt32(); jT808LocationAttachImpl0x06.Gender = reader.ReadByte(); jT808LocationAttachImpl0x06.UserName = reader.ReadRemainStringContent(); return(jT808LocationAttachImpl0x06); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_0x0200_0x13 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x13 value = new JT808_0x0200_0x13(); value.AttachInfoId = reader.ReadByte(); value.AttachInfoLength = reader.ReadByte(); value.DrivenRouteId = reader.ReadInt32(); value.Time = reader.ReadUInt16(); value.DrivenRoute = (JT808DrivenRouteType)reader.ReadByte(); return(value); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="writer"></param> /// <param name="config"></param> public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0200_0x25 value = new JT808_0x0200_0x25(); value.AttachInfoId = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); value.AttachInfoLength = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); value.CarSignalStatus = reader.ReadInt32(); writer.WriteNumber($"[{value.CarSignalStatus.ReadNumber()}]扩展车辆信号状态位", value.CarSignalStatus); }
public JT808_0x0200_0x12 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x12 value = new JT808_0x0200_0x12(); value.AttachInfoId = reader.ReadByte(); value.AttachInfoLength = reader.ReadByte(); value.JT808PositionType = (JT808PositionType)reader.ReadByte(); value.AreaId = reader.ReadInt32(); value.Direction = (JT808DirectionType)reader.ReadByte(); return(value); }
public JT808_0x0200_0x12 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x12 jT808LocationAttachImpl0x12 = new JT808_0x0200_0x12(); jT808LocationAttachImpl0x12.AttachInfoId = reader.ReadByte(); jT808LocationAttachImpl0x12.AttachInfoLength = reader.ReadByte(); jT808LocationAttachImpl0x12.JT808PositionType = (JT808PositionType)reader.ReadByte(); jT808LocationAttachImpl0x12.AreaId = reader.ReadInt32(); jT808LocationAttachImpl0x12.Direction = (JT808DirectionType)reader.ReadByte(); return(jT808LocationAttachImpl0x12); }
public JT808_0x8108 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8108 jT808_0X8108 = new JT808_0x8108(); jT808_0X8108.UpgradeType = (JT808UpgradeType)reader.ReadByte(); jT808_0X8108.MakerId = reader.ReadString(5); jT808_0X8108.VersionNumLength = reader.ReadByte(); jT808_0X8108.VersionNum = reader.ReadString(jT808_0X8108.VersionNumLength); jT808_0X8108.UpgradePackageLength = reader.ReadInt32(); jT808_0X8108.UpgradePackage = reader.ReadArray(jT808_0X8108.UpgradePackageLength).ToArray(); return(jT808_0X8108); }
public void ReadNumericalTest() { byte[] bytes = "7E 01 00 10 00 00 00 20 00 00 00 40 7E".ToHexBytes(); JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); Assert.Equal(JT808Package.BeginFlag, jT808MessagePackReader.ReadStart()); Assert.Equal(0x01, jT808MessagePackReader.ReadByte()); Assert.Equal(16, jT808MessagePackReader.ReadUInt16()); Assert.Equal(32, jT808MessagePackReader.ReadInt32()); Assert.Equal((uint)64, jT808MessagePackReader.ReadUInt32()); Assert.Equal(JT808Package.EndFlag, jT808MessagePackReader.ReadEnd()); }
public JT808_0x0200_0x11 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200_0x11 jT808LocationAttachImpl0x11 = new JT808_0x0200_0x11(); jT808LocationAttachImpl0x11.AttachInfoId = reader.ReadByte(); jT808LocationAttachImpl0x11.AttachInfoLength = reader.ReadByte(); jT808LocationAttachImpl0x11.JT808PositionType = (JT808PositionType)reader.ReadByte(); if (jT808LocationAttachImpl0x11.JT808PositionType != JT808PositionType.无特定位置) { jT808LocationAttachImpl0x11.AreaId = reader.ReadInt32(); } return(jT808LocationAttachImpl0x11); }
public JT808_CarDVR_Up_0x11 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_CarDVR_Up_0x11 value = new JT808_CarDVR_Up_0x11(); value.JT808_CarDVR_Up_0x11_DriveOverTimes = new List <JT808_CarDVR_Up_0x11_DriveOverTime>(); var count = (reader.ReadCurrentRemainContentLength() - 1) / 50;//记录块个数, -1 去掉校验位 for (int i = 0; i < count; i++) { JT808_CarDVR_Up_0x11_DriveOverTime jT808_CarDVR_Up_0x11_DriveOverTime = new JT808_CarDVR_Up_0x11_DriveOverTime(); jT808_CarDVR_Up_0x11_DriveOverTime.DriverLicenseNo = reader.ReadASCII(18); jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingStartTime = reader.ReadDateTime6(); jT808_CarDVR_Up_0x11_DriveOverTime.ContinueDrivingEndTime = reader.ReadDateTime6(); jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLng = reader.ReadInt32(); jT808_CarDVR_Up_0x11_DriveOverTime.GpsStartLat = reader.ReadInt32(); jT808_CarDVR_Up_0x11_DriveOverTime.StartHeight = reader.ReadInt16(); jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLng = reader.ReadInt32(); jT808_CarDVR_Up_0x11_DriveOverTime.GpsEndLat = reader.ReadInt32(); jT808_CarDVR_Up_0x11_DriveOverTime.EndHeight = reader.ReadInt16(); value.JT808_CarDVR_Up_0x11_DriveOverTimes.Add(jT808_CarDVR_Up_0x11_DriveOverTime); } return(value); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0200_0x12 value = new JT808_0x0200_0x12(); value.AttachInfoId = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); value.AttachInfoLength = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); value.JT808PositionType = (JT808PositionType)reader.ReadByte(); writer.WriteNumber($"[{((byte)value.JT808PositionType).ReadNumber()}]位置类型-{value.JT808PositionType.ToString()}", (byte)value.JT808PositionType); value.AreaId = reader.ReadInt32(); writer.WriteNumber($"[{value.AreaId.ReadNumber()}]区域或路段ID", value.AreaId); value.Direction = (JT808DirectionType)reader.ReadByte(); writer.WriteNumber($"[{((byte)value.Direction).ReadNumber()}]方向-{value.Direction.ToString()}", (byte)value.Direction); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="writer"></param> /// <param name="config"></param> public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0200_0x13 value = new JT808_0x0200_0x13(); value.AttachInfoId = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId); value.AttachInfoLength = reader.ReadByte(); writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength); value.DrivenRouteId = reader.ReadInt32(); writer.WriteNumber($"[{((byte)value.DrivenRouteId).ReadNumber()}]路段ID", value.DrivenRouteId); value.Time = reader.ReadUInt16(); writer.WriteNumber($"[{value.Time.ReadNumber()}]路段行驶时间", value.Time); value.DrivenRoute = (JT808DrivenRouteType)reader.ReadByte(); writer.WriteNumber($"[{((byte)value.DrivenRoute).ReadNumber()}]结果-{value.DrivenRoute.ToString()}", (byte)value.DrivenRoute); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0200 value = new JT808_0x0200(); value.AlarmFlag = reader.ReadUInt32(); writer.WriteNumber($"[{value.AlarmFlag.ReadNumber()}]报警标志", value.AlarmFlag); value.StatusFlag = reader.ReadUInt32(); var alarmFlagBits = Convert.ToString(value.AlarmFlag, 2).PadLeft(32, '0').AsSpan(); writer.WriteStartObject("报警标志对象"); if (reader.Version == JT808Version.JTT2019) { writer.WriteString($"[bit31]保留", $"{alarmFlagBits[31]}"); } else { writer.WriteString($"[bit31]非法开门报警", $"{alarmFlagBits[31]}"); } writer.WriteString($"[bit30]侧翻预警", $"{alarmFlagBits[30]}"); writer.WriteString($"[bit29]碰撞预警", $"{alarmFlagBits[29]}"); writer.WriteString($"[bit28]车辆非法位移", $"{alarmFlagBits[28]}"); writer.WriteString($"[bit27]车辆非法点火", $"{alarmFlagBits[27]}"); writer.WriteString($"[bit26]车辆被盗(通过车辆防盗器)", $"{alarmFlagBits[26]}"); writer.WriteString($"[bit25]车辆油量异常", $"{alarmFlagBits[25]}"); writer.WriteString($"[bit24]车辆VSS故障", $"{alarmFlagBits[24]}"); writer.WriteString($"[bit23]路线偏离报警", $"{alarmFlagBits[23]}"); writer.WriteString($"[bit22]路段行驶时间不足/过长", $"{alarmFlagBits[22]}"); writer.WriteString($"[bit21]进出路线", $"{alarmFlagBits[21]}"); writer.WriteString($"[bit20]进出区域", $"{alarmFlagBits[20]}"); writer.WriteString($"[bit19]超时停车", $"{alarmFlagBits[19]}"); writer.WriteString($"[bit18]当天累计驾驶超时", $"{alarmFlagBits[18]}"); if (reader.Version == JT808Version.JTT2019) { writer.WriteString($"[bit17]右转盲区异常报警", $"{alarmFlagBits[17]}"); writer.WriteString($"[bit16]胎压预警", $"{alarmFlagBits[16]}"); writer.WriteString($"[bit15]违规行驶报警", $"{alarmFlagBits[15]}"); } else { writer.WriteString($"[bit15~bit17]保留", alarmFlagBits.Slice(15, 3).ToString()); } writer.WriteString($"[bit14]疲劳驾驶预警", $"{alarmFlagBits[14]}"); writer.WriteString($"[bit13]超速预警", $"{alarmFlagBits[13]}"); writer.WriteString($"[bit12]道路运输证IC卡模块故障", $"{alarmFlagBits[12]}"); writer.WriteString($"[bit11]摄像头故障", $"{alarmFlagBits[11]}"); writer.WriteString($"[bit10]TTS模块故障", $"{alarmFlagBits[10]}"); writer.WriteString($"[bit9]终端LCD或显示器故障", $"{alarmFlagBits[9]}"); writer.WriteString($"[bit8]终端主电源掉电", $"{alarmFlagBits[8]}"); writer.WriteString($"[bit7]终端主电源欠压", $"{alarmFlagBits[7]}"); writer.WriteString($"[bit6]GNSS天线短路", $"{alarmFlagBits[6]}"); writer.WriteString($"[bit5]GNSS天线未接或被剪断", $"{alarmFlagBits[5]}"); writer.WriteString($"[bit4]GNSS模块发生故障", $"{alarmFlagBits[4]}"); writer.WriteString($"[bit3]危险预警", $"{alarmFlagBits[3]}"); writer.WriteString($"[bit2]疲劳驾驶", $"{alarmFlagBits[2]}"); writer.WriteString($"[bit1]超速报警", $"{alarmFlagBits[1]}"); writer.WriteString($"[bit0]紧急报警,触动报警开关后触发", $"{alarmFlagBits[0]}"); writer.WriteEndObject(); writer.WriteNumber($"[{value.StatusFlag.ReadNumber()}]状态位标志", value.StatusFlag); var StatusFlagBits = Convert.ToString(value.StatusFlag, 2).PadLeft(32, '0').AsSpan(); writer.WriteStartObject("状态标志对象"); if (reader.Version == JT808Version.JTT2019) { writer.WriteString($"[bit23~bit31]保留", StatusFlagBits.Slice(23, 9).ToString()); writer.WriteString($"[{StatusFlagBits[22]}]bit22", StatusFlagBits[22] == '0' ? "车辆处于停止状态" : "车辆处于行驶状态"); } else { writer.WriteString($"[bit22~bit31]保留", StatusFlagBits.Slice(22, 10).ToString()); } writer.WriteString($"[{StatusFlagBits[21]}]bit21", StatusFlagBits[21] == '0' ? "未使用Galileo卫星进行定位" : "使用Galileo卫星进行定位"); writer.WriteString($"[{StatusFlagBits[20]}]bit20", StatusFlagBits[20] == '0' ? "未使用GLONASS卫星进行定位" : "使用GLONASS卫星进行定位"); writer.WriteString($"[{StatusFlagBits[19]}]bit19", StatusFlagBits[19] == '0' ? "未使用北斗卫星进行定位" : "使用北斗卫星进行定位"); writer.WriteString($"[{StatusFlagBits[18]}]bit18", StatusFlagBits[18] == '0' ? "未使用GPS卫星进行定位" : "使用GPS卫星进行定位"); writer.WriteString($"[{StatusFlagBits[17]}]bit17", StatusFlagBits[17] == '0' ? "门5关" : "门5开"); writer.WriteString($"[{StatusFlagBits[16]}]bit16", StatusFlagBits[16] == '0' ? "门4关" : "门4开"); writer.WriteString($"[{StatusFlagBits[15]}]bit15", StatusFlagBits[15] == '0' ? "门3关" : "门3开"); writer.WriteString($"[{StatusFlagBits[14]}]bit14", StatusFlagBits[14] == '0' ? "门2关" : "门2开"); writer.WriteString($"[{StatusFlagBits[13]}]bit13", StatusFlagBits[13] == '0' ? "门1关" : "门1开"); writer.WriteString($"[{StatusFlagBits[12]}]bit12", StatusFlagBits[12] == '0' ? "车门解锁" : "车门加锁"); writer.WriteString($"[{StatusFlagBits[11]}]bit11", StatusFlagBits[11] == '0' ? "车辆电路正常" : "车辆电路断开"); writer.WriteString($"[{StatusFlagBits[10]}]bit10", StatusFlagBits[10] == '0' ? "车辆油路正常" : "车辆油路断开"); var bit8And9 = StatusFlagBits.Slice(8, 2).ToString(); switch (bit8And9) { case "00": writer.WriteString($"[{bit8And9}]bit8~bit9", "空车"); break; case "01": writer.WriteString($"[{bit8And9}]bit8~bit9", "半载"); break; case "10": writer.WriteString($"[{bit8And9}]bit8~bit9", "保留"); break; case "11": writer.WriteString($"[{bit8And9}]bit8~bit9", "满载"); break; } writer.WriteString($"[bit6~bit7]保留", StatusFlagBits.Slice(6, 2).ToString()); writer.WriteString($"[{StatusFlagBits[5]}]bit5", StatusFlagBits[5] == '0' ? "经纬度未经保密插件加密" : "经纬度已经保密插件加密"); writer.WriteString($"[{StatusFlagBits[4]}]bit4", StatusFlagBits[4] == '0' ? "运营状态" : "停运状态"); writer.WriteString($"[{StatusFlagBits[3]}]bit3", StatusFlagBits[3] == '0' ? "东经" : "西经"); writer.WriteString($"[{StatusFlagBits[2]}]bit2", StatusFlagBits[2] == '0' ? "北纬" : "南纬"); writer.WriteString($"[{StatusFlagBits[1]}]bit1", StatusFlagBits[1] == '0' ? "未定位" : "定位"); writer.WriteString($"[{StatusFlagBits[0]}]bit0", StatusFlagBits[0] == '0' ? "ACC关" : "ACC开"); writer.WriteEndObject(); if (((value.StatusFlag >> 28) & 1) == 1) { //南纬 268435456 0x10000000 value.Lat = (int)reader.ReadUInt32(); writer.WriteNumber($"[{value.Lat.ReadNumber()}]纬度", value.Lat); } else { value.Lat = reader.ReadInt32(); writer.WriteNumber($"[{value.Lat.ReadNumber()}]纬度", value.Lat); } if (((value.StatusFlag >> 27) & 1) == 1) { //西经 134217728 0x8000000 value.Lng = (int)reader.ReadUInt32(); writer.WriteNumber($"[{value.Lng.ReadNumber()}]经度", value.Lng); } else { value.Lng = reader.ReadInt32(); writer.WriteNumber($"[{value.Lng.ReadNumber()}]经度", value.Lng); } value.Altitude = reader.ReadUInt16(); writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); value.Speed = reader.ReadUInt16(); writer.WriteNumber($"[{value.Speed.ReadNumber()}]速度", value.Speed); value.Direction = reader.ReadUInt16(); writer.WriteNumber($"[{value.Direction.ReadNumber()}]方向", value.Direction); value.GPSTime = reader.ReadDateTime6(); writer.WriteString($"[{value.GPSTime.ToString( "yyMMddHHmmss" )}]定位时间", value.GPSTime.ToString("yyyy-MM-dd HH:mm:ss")); // 位置附加信息 writer.WriteStartArray("附加信息列表"); while (reader.ReadCurrentRemainContentLength() > 0) { try { ReadOnlySpan <byte> attachSpan = reader.GetVirtualReadOnlySpan(2); byte attachId = attachSpan[0]; byte attachLen = attachSpan[1]; if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object jT808LocationAttachInstance)) { writer.WriteStartObject(); jT808LocationAttachInstance.Analyze(ref reader, writer, config); writer.WriteEndObject(); } else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance)) { writer.WriteStartObject(); customAttachInstance.Analyze(ref reader, writer, config); writer.WriteEndObject(); } else { writer.WriteStartObject(); reader.Skip(2); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); reader.Skip(attachLen); writer.WriteEndObject(); } } catch { writer.WriteStartObject(); try { byte attachId = reader.ReadByte(); byte attachLen = reader.ReadByte(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); reader.Skip(attachLen); } catch (Exception ex) { throw; } finally { writer.WriteEndObject(); } } } writer.WriteEndArray(); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="writer"></param> /// <param name="config"></param> public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0200 value = new JT808_0x0200(); value.AlarmFlag = reader.ReadUInt32(); writer.WriteNumber($"[{value.AlarmFlag.ReadBinary().ToString()}]报警标志", value.AlarmFlag); value.StatusFlag = reader.ReadUInt32(); var alarmFlagBits = Convert.ToString(value.AlarmFlag, 2).PadLeft(32, '0').AsSpan(); writer.WriteStartObject("报警标志对象"); if (reader.Version == JT808Version.JTT2019) { writer.WriteString($"[bit31]保留", $"{alarmFlagBits[0]}"); } else { writer.WriteString($"[bit31]非法开门报警", $"{alarmFlagBits[0]}"); } writer.WriteString($"[bit30]侧翻预警", $"{alarmFlagBits[1]}"); writer.WriteString($"[bit29]碰撞预警", $"{alarmFlagBits[2]}"); writer.WriteString($"[bit28]车辆非法位移", $"{alarmFlagBits[3]}"); writer.WriteString($"[bit27]车辆非法点火", $"{alarmFlagBits[4]}"); writer.WriteString($"[bit26]车辆被盗(通过车辆防盗器)", $"{alarmFlagBits[5]}"); writer.WriteString($"[bit25]车辆油量异常", $"{alarmFlagBits[6]}"); writer.WriteString($"[bit24]车辆VSS故障", $"{alarmFlagBits[7]}"); writer.WriteString($"[bit23]路线偏离报警", $"{alarmFlagBits[8]}"); writer.WriteString($"[bit22]路段行驶时间不足/过长", $"{alarmFlagBits[9]}"); writer.WriteString($"[bit21]进出路线", $"{alarmFlagBits[10]}"); writer.WriteString($"[bit20]进出区域", $"{alarmFlagBits[11]}"); writer.WriteString($"[bit19]超时停车", $"{alarmFlagBits[12]}"); writer.WriteString($"[bit18]当天累计驾驶超时", $"{alarmFlagBits[13]}"); if (reader.Version == JT808Version.JTT2019) { writer.WriteString($"[bit17]右转盲区异常报警", $"{alarmFlagBits[14]}"); writer.WriteString($"[bit16]胎压预警", $"{alarmFlagBits[15]}"); writer.WriteString($"[bit15]违规行驶报警", $"{alarmFlagBits[16]}"); } else { writer.WriteString($"[bit15~bit17]保留", alarmFlagBits.Slice(14, 3).ToString()); } writer.WriteString($"[bit14]疲劳驾驶预警", $"{alarmFlagBits[17]}"); writer.WriteString($"[bit13]超速预警", $"{alarmFlagBits[18]}"); writer.WriteString($"[bit12]道路运输证IC卡模块故障", $"{alarmFlagBits[19]}"); writer.WriteString($"[bit11]摄像头故障", $"{alarmFlagBits[20]}"); writer.WriteString($"[bit10]TTS模块故障", $"{alarmFlagBits[21]}"); writer.WriteString($"[bit9]终端LCD或显示器故障", $"{alarmFlagBits[22]}"); writer.WriteString($"[bit8]终端主电源掉电", $"{alarmFlagBits[23]}"); writer.WriteString($"[bit7]终端主电源欠压", $"{alarmFlagBits[24]}"); writer.WriteString($"[bit6]GNSS天线短路", $"{alarmFlagBits[25]}"); writer.WriteString($"[bit5]GNSS天线未接或被剪断", $"{alarmFlagBits[26]}"); writer.WriteString($"[bit4]GNSS模块发生故障", $"{alarmFlagBits[27]}"); writer.WriteString($"[bit3]危险预警", $"{alarmFlagBits[28]}"); writer.WriteString($"[bit2]疲劳驾驶", $"{alarmFlagBits[29]}"); writer.WriteString($"[bit1]超速报警", $"{alarmFlagBits[30]}"); writer.WriteString($"[bit0]紧急报警,触动报警开关后触发", $"{alarmFlagBits[31]}"); writer.WriteEndObject(); writer.WriteNumber($"[{value.StatusFlag.ReadBinary().ToString()}]状态位标志", value.StatusFlag); var StatusFlagBits = Convert.ToString(value.StatusFlag, 2).PadLeft(32, '0').AsSpan(); writer.WriteStartObject("状态标志对象"); if (reader.Version == JT808Version.JTT2019) { writer.WriteString($"[bit23~bit31]保留", StatusFlagBits.Slice(0, 9).ToString()); writer.WriteString($"[{StatusFlagBits[9]}]bit22", StatusFlagBits[9] == '0' ? "车辆处于停止状态" : "车辆处于行驶状态"); } else { writer.WriteString($"[bit22~bit31]保留", StatusFlagBits.Slice(0, 10).ToString()); } writer.WriteString($"[{StatusFlagBits[10]}]bit21", StatusFlagBits[10] == '0' ? "未使用Galileo卫星进行定位" : "使用Galileo卫星进行定位"); writer.WriteString($"[{StatusFlagBits[11]}]bit20", StatusFlagBits[11] == '0' ? "未使用GLONASS卫星进行定位" : "使用GLONASS卫星进行定位"); writer.WriteString($"[{StatusFlagBits[12]}]bit19", StatusFlagBits[12] == '0' ? "未使用北斗卫星进行定位" : "使用北斗卫星进行定位"); writer.WriteString($"[{StatusFlagBits[13]}]bit18", StatusFlagBits[13] == '0' ? "未使用GPS卫星进行定位" : "使用GPS卫星进行定位"); writer.WriteString($"[{StatusFlagBits[14]}]bit17", StatusFlagBits[14] == '0' ? "门5关" : "门5开"); writer.WriteString($"[{StatusFlagBits[15]}]bit16", StatusFlagBits[15] == '0' ? "门4关" : "门4开"); writer.WriteString($"[{StatusFlagBits[16]}]bit15", StatusFlagBits[16] == '0' ? "门3关" : "门3开"); writer.WriteString($"[{StatusFlagBits[17]}]bit14", StatusFlagBits[17] == '0' ? "门2关" : "门2开"); writer.WriteString($"[{StatusFlagBits[18]}]bit13", StatusFlagBits[18] == '0' ? "门1关" : "门1开"); writer.WriteString($"[{StatusFlagBits[19]}]bit12", StatusFlagBits[19] == '0' ? "车门解锁" : "车门加锁"); writer.WriteString($"[{StatusFlagBits[20]}]bit11", StatusFlagBits[20] == '0' ? "车辆电路正常" : "车辆电路断开"); writer.WriteString($"[{StatusFlagBits[21]}]bit10", StatusFlagBits[21] == '0' ? "车辆油路正常" : "车辆油路断开"); var bit8And9 = StatusFlagBits.Slice(22, 2).ToString(); switch (bit8And9) { case "00": writer.WriteString($"[{bit8And9}]bit8~bit9", "空车"); break; case "01": writer.WriteString($"[{bit8And9}]bit8~bit9", "半载"); break; case "10": writer.WriteString($"[{bit8And9}]bit8~bit9", "保留"); break; case "11": writer.WriteString($"[{bit8And9}]bit8~bit9", "满载"); break; } writer.WriteString($"[bit6~bit7]保留", StatusFlagBits.Slice(24, 2).ToString()); writer.WriteString($"[{StatusFlagBits[26]}]bit5", StatusFlagBits[26] == '0' ? "经纬度未经保密插件加密" : "经纬度已经保密插件加密"); writer.WriteString($"[{StatusFlagBits[27]}]bit4", StatusFlagBits[27] == '0' ? "运营状态" : "停运状态"); writer.WriteString($"[{StatusFlagBits[28]}]bit3", StatusFlagBits[28] == '0' ? "东经" : "西经"); writer.WriteString($"[{StatusFlagBits[29]}]bit2", StatusFlagBits[29] == '0' ? "北纬" : "南纬"); writer.WriteString($"[{StatusFlagBits[30]}]bit1", StatusFlagBits[30] == '0' ? "未定位" : "定位"); writer.WriteString($"[{StatusFlagBits[31]}]bit0", StatusFlagBits[31] == '0' ? "ACC关" : "ACC开"); writer.WriteEndObject(); if (((value.StatusFlag >> 28) & 1) == 1) { //南纬 268435456 0x10000000 value.Lat = (int)reader.ReadUInt32(); writer.WriteNumber($"[{value.Lat.ReadNumber()}]纬度", value.Lat); } else { value.Lat = reader.ReadInt32(); writer.WriteNumber($"[{value.Lat.ReadNumber()}]纬度", value.Lat); } if (((value.StatusFlag >> 27) & 1) == 1) { //西经 134217728 0x8000000 value.Lng = (int)reader.ReadUInt32(); writer.WriteNumber($"[{value.Lng.ReadNumber()}]经度", value.Lng); } else { value.Lng = reader.ReadInt32(); writer.WriteNumber($"[{value.Lng.ReadNumber()}]经度", value.Lng); } value.Altitude = reader.ReadUInt16(); writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); value.Speed = reader.ReadUInt16(); writer.WriteNumber($"[{value.Speed.ReadNumber()}]速度", value.Speed); value.Direction = reader.ReadUInt16(); writer.WriteNumber($"[{value.Direction.ReadNumber()}]方向", value.Direction); value.GPSTime = reader.ReadDateTime_yyMMddHHmmss(); writer.WriteString($"[{value.GPSTime:yyMMddHHmmss}]定位时间", value.GPSTime.ToString("yyyy-MM-dd HH:mm:ss")); // 位置附加信息 value.BasicLocationAttachData = new Dictionary <byte, JT808_0x0200_BodyBase>(); value.CustomLocationAttachData = new Dictionary <byte, JT808_0x0200_CustomBodyBase>(); value.CustomLocationAttachData2 = new Dictionary <ushort, JT808_0x0200_CustomBodyBase2>(); value.CustomLocationAttachData3 = new Dictionary <ushort, JT808_0x0200_CustomBodyBase3>(); value.CustomLocationAttachData4 = new Dictionary <byte, JT808_0x0200_CustomBodyBase4>(); value.ExceptionLocationAttachOriginalData = new List <byte[]>(); writer.WriteStartArray("附加信息列表"); while (reader.ReadCurrentRemainContentLength() > 0) { try { //正常自定义注册、正常数据解析,不支持国标乱序组包 //优先国标组包->自定义附加数据注册->异常数据 //注意:最坏的是自定义的跟基础标准的附加信息Id冲突了,那么优先使用标准的进行解析 //基础标准附加Id、自定义标准附加Id、自定义标准附加Id 4 byte attachId = reader.ReadVirtualByte(); //自定义标准附加Id2、自定义标准附加Id3 ushort attachId2_3 = reader.ReadVirtualUInt16(); if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object attachInstance)) { if (value.BasicLocationAttachData.ContainsKey(attachId)) { //存在重复的就不解析,把数据统一放在异常定位数据里面 reader.Skip(1); byte attachLen = reader.ReadByte(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); reader.Skip(attachLen); } else { writer.WriteStartObject(); attachInstance.Analyze(ref reader, writer, config); writer.WriteEndObject(); value.BasicLocationAttachData.Add(attachId, null); } } else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance)) { if (value.CustomLocationAttachData.ContainsKey(attachId)) { reader.Skip(1); byte attachLen = reader.ReadByte(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息_{attachId}", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); reader.Skip(attachLen); } else { writer.WriteStartObject(); customAttachInstance.Analyze(ref reader, writer, config); writer.WriteEndObject(); value.CustomLocationAttachData.Add(attachId, null); } } else if (config.JT808_0X0200_Custom_Factory.Map4.TryGetValue(attachId, out object customAttachInstance4)) { if (value.CustomLocationAttachData4.ContainsKey(attachId)) { reader.Skip(1); int attachLen = reader.ReadInt32(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息1_4_{attachId}", reader.ReadArray(reader.ReaderCount - 5, attachLen + 5).ToArray().ToHexString()); reader.Skip(attachLen); } else { writer.WriteStartObject(); customAttachInstance4.Analyze(ref reader, writer, config); writer.WriteEndObject(); value.CustomLocationAttachData4.Add(attachId, null); } } else if (config.JT808_0X0200_Custom_Factory.Map2.TryGetValue(attachId2_3, out object customAttachInstance2)) { if (value.CustomLocationAttachData2.ContainsKey(attachId2_3)) { reader.Skip(2); byte attachLen = reader.ReadByte(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息2_1", reader.ReadArray(reader.ReaderCount - 3, attachLen + 3).ToArray().ToHexString()); reader.Skip(attachLen); } else { writer.WriteStartObject(); customAttachInstance2.Analyze(ref reader, writer, config); writer.WriteEndObject(); value.CustomLocationAttachData2.Add(attachId2_3, null); } } else if (config.JT808_0X0200_Custom_Factory.Map3.TryGetValue(attachId2_3, out object customAttachInstance3)) { if (value.CustomLocationAttachData3.ContainsKey(attachId2_3)) { reader.Skip(2); ushort attachLen = reader.ReadUInt16(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息2_2_{attachId}", reader.ReadArray(reader.ReaderCount - 4, attachLen + 4).ToArray().ToHexString()); reader.Skip(attachLen); } else { writer.WriteStartObject(); customAttachInstance3.Analyze(ref reader, writer, config); writer.WriteEndObject(); value.CustomLocationAttachData3.Add(attachId2_3, null); } } else { //未知的附加只通过标准的自定义附加信息来解析,其余的通过自己注册,自己实现的方式来解析 reader.Skip(1); byte attachLen = reader.ReadByte(); int remainLength = reader.ReadCurrentRemainContentLength(); writer.WriteStartObject(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); if ((attachLen + 2) > remainLength) { writer.WriteString($"未知附加信息", reader.ReadArray(remainLength).ToArray().ToHexString()); } else { writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); reader.Skip(attachLen); } writer.WriteEndObject(); } } catch (Exception ex) { writer.WriteStartObject(); writer.WriteString($"解析外部部未知附加信息报错", ex.StackTrace); try { var remainLength = reader.ReadCurrentRemainContentLength(); if (remainLength > 0) { writer.WriteString($"未知附加信息", reader.ReadArray(remainLength).ToArray().ToHexString()); } else { writer.WriteStartObject(); writer.WriteString($"未知附加信息", "无"); writer.WriteEndObject(); } } catch (Exception innerEx) { writer.WriteString($"解析内部未知附加信息报错", innerEx.StackTrace); } finally { writer.WriteEndObject(); } break; } } writer.WriteEndArray(); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0200 value = new JT808_0x0200(); value.AlarmFlag = reader.ReadUInt32(); writer.WriteNumber($"[{value.AlarmFlag.ReadNumber()}]报警标志", value.AlarmFlag); var alarmFlags = JT808EnumExtensions.GetEnumTypes <JT808Alarm>((int)value.AlarmFlag, 32); if (alarmFlags.Any()) { writer.WriteStartArray("报警标志集合"); foreach (var item in alarmFlags) { writer.WriteStringValue(item.ToString()); } writer.WriteEndArray(); } value.StatusFlag = reader.ReadUInt32(); writer.WriteNumber($"[{value.StatusFlag.ReadNumber()}]状态位标志", value.StatusFlag); var status = JT808EnumExtensions.GetEnumTypes <JT808Status>((int)value.StatusFlag, 32); if (status.Any()) { writer.WriteStartArray("状态标志集合"); foreach (var item in status) { writer.WriteStringValue(item.ToString()); } writer.WriteEndArray(); } if (((value.StatusFlag >> 28) & 1) == 1) { //南纬 268435456 0x10000000 value.Lat = (int)reader.ReadUInt32(); writer.WriteNumber($"[{value.Lat.ReadNumber()}]纬度", value.Lat); } else { value.Lat = reader.ReadInt32(); writer.WriteNumber($"[{value.Lat.ReadNumber()}]纬度", value.Lat); } if (((value.StatusFlag >> 27) & 1) == 1) { //西经 134217728 0x8000000 value.Lng = (int)reader.ReadUInt32(); writer.WriteNumber($"[{value.Lng.ReadNumber()}]经度", value.Lng); } else { value.Lng = reader.ReadInt32(); writer.WriteNumber($"[{value.Lng.ReadNumber()}]经度", value.Lng); } value.Altitude = reader.ReadUInt16(); writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude); value.Speed = reader.ReadUInt16(); writer.WriteNumber($"[{value.Speed.ReadNumber()}]速度", value.Speed); value.Direction = reader.ReadUInt16(); writer.WriteNumber($"[{value.Direction.ReadNumber()}]方向", value.Direction); value.GPSTime = reader.ReadDateTime6(); writer.WriteString($"[{value.GPSTime.ToString("yyMMddHHmmss")}]定位时间", value.GPSTime.ToString("yyyy-MM-dd HH:mm:ss")); // 位置附加信息 writer.WriteStartArray("附加信息列表"); while (reader.ReadCurrentRemainContentLength() > 0) { try { ReadOnlySpan <byte> attachSpan = reader.GetVirtualReadOnlySpan(2); byte attachId = attachSpan[0]; byte attachLen = attachSpan[1]; if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object jT808LocationAttachInstance)) { writer.WriteStartObject(); jT808LocationAttachInstance.Analyze(ref reader, writer, config); writer.WriteEndObject(); } else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance)) { writer.WriteStartObject(); customAttachInstance.Analyze(ref reader, writer, config); writer.WriteEndObject(); } else { writer.WriteStartObject(); reader.Skip(2); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); reader.Skip(attachLen); writer.WriteEndObject(); } } catch { writer.WriteStartObject(); try { byte attachId = reader.ReadByte(); byte attachLen = reader.ReadByte(); writer.WriteNumber($"[{attachId.ReadNumber()}]未知附加信息Id", attachId); writer.WriteNumber($"[{attachLen.ReadNumber()}]未知附加信息长度", attachLen); writer.WriteString($"未知附加信息", reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray().ToHexString()); reader.Skip(attachLen); } catch (Exception ex) { throw; } finally { writer.WriteEndObject(); } } } writer.WriteEndArray(); }
public JT808_0x0200 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0200 jT808_0X0200 = new JT808_0x0200(); jT808_0X0200.AlarmFlag = reader.ReadUInt32(); jT808_0X0200.StatusFlag = reader.ReadUInt32(); if (((jT808_0X0200.StatusFlag >> 28) & 1) == 1) { //南纬 268435456 0x10000000 jT808_0X0200.Lat = (int)reader.ReadUInt32(); } else { jT808_0X0200.Lat = reader.ReadInt32(); } if (((jT808_0X0200.StatusFlag >> 27) & 1) == 1) { //西经 134217728 0x8000000 jT808_0X0200.Lng = (int)reader.ReadUInt32(); } else { jT808_0X0200.Lng = reader.ReadInt32(); } jT808_0X0200.Altitude = reader.ReadUInt16(); jT808_0X0200.Speed = reader.ReadUInt16(); jT808_0X0200.Direction = reader.ReadUInt16(); jT808_0X0200.GPSTime = reader.ReadDateTime6(); // 位置附加信息 jT808_0X0200.JT808LocationAttachData = new Dictionary <byte, JT808_0x0200_BodyBase>(); jT808_0X0200.JT808CustomLocationAttachData = new Dictionary <byte, JT808_0x0200_CustomBodyBase>(); jT808_0X0200.JT808UnknownLocationAttachOriginalData = new Dictionary <byte, byte[]>(); while (reader.ReadCurrentRemainContentLength() > 0) { try { ReadOnlySpan <byte> attachSpan = reader.GetVirtualReadOnlySpan(2); byte attachId = attachSpan[0]; byte attachLen = attachSpan[1]; if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object jT808LocationAttachInstance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(jT808LocationAttachInstance, ref reader, config); jT808_0X0200.JT808LocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); } else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config); jT808_0X0200.JT808CustomLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl); } else { reader.Skip(2); jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); reader.Skip(attachLen); } } catch { try { byte attachId = reader.ReadByte(); byte attachLen = reader.ReadByte(); jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray()); reader.Skip(attachLen); } catch (Exception ex) { throw; } } } return(jT808_0X0200); }