using JT809.Protocol.Enums; using JT809.Protocol.Formatters; using JT809.Protocol.MessagePack; using JT809.Protocol.Extensions; using System; using JT809.Protocol.Interfaces; using System.Text.Json; namespace JT809.Protocol.SubMessageBody { /// /// 上报报警信息消息 /// 子业务类型标识:UP_WARN_MSG_ADPT_INFO /// 2011 描述:下级平台向上级平台上报某车辆的报警信息 /// 2019 描述:下级平台向上级平台“上报报警信息”。 /// 本条消息上级平台无需应答 /// public class JT809_0x1400_0x1402:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.上报报警信息消息.ToUInt16Value(); public override string Description => "上报报警信息消息"; /// /// 报警信息来源 /// public JT809WarnSrc WarnSrc { get; set; } /// /// 发起报警平台唯一编码,由平台所在地行政区域代码和平台编号组成 /// public string SourcePlatformId { get; set; } /// /// 报警类型 /// public JT809WarnType WarnType { get; set; } /// /// 报警时间 /// public DateTime WarnTime { get; set; } /// /// 事件开始时间 utc /// public DateTime StartTime { get; set; } /// /// 事件结束时间 utc /// public DateTime EndTime { get; set; } /// /// 车牌号码 非车辆相关报警全填0 /// public string VehicleNo { get; set; } /// /// 车牌颜色 非车辆相关报警全填0 /// public JT809VehicleColorType VehicleColor { get; set; } /// /// 被报警平台唯一编码,由平台所在地行政区划代码和平台编号组成。非平台相关报警全填0 /// public string DestinationPlatformId { get; set; } /// /// 线路ID 808-2019中0x8606规定的报文中的线路ID /// public uint DRVLineId { get; set; } /// /// 信息ID /// public uint InfoID { get; set; } /// /// 数据长度 /// public uint InfoLength { get; set; } /// /// 信息内容 /// public string InfoContent { get; set; } public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { var value = new JT809_0x1400_0x1402(); if (config.Version == JT809Version.JTT2011) { value.WarnSrc = (JT809WarnSrc)reader.ReadByte(); writer.WriteString($"[{value.WarnSrc.ToByteValue()}]报警信息来源", value.WarnSrc.ToString()); } else { var virtualHex = reader.ReadVirtualArray(11); value.SourcePlatformId = reader.ReadString(11); writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发起报警平台唯一编码", value.SourcePlatformId); } value.WarnType = (JT809WarnType)reader.ReadUInt16(); writer.WriteString($"[{value.WarnType.ToByteValue()}]报警类型", value.WarnType.ToString()); var hex = reader.ReadVirtualArray(8); value.WarnTime = reader.ReadUTCDateTime(); writer.WriteString($"[{hex.ToArray().ToHexString()}]报警时间", value.WarnTime); if (config.Version == JT809Version.JTT2011) { value.InfoID = reader.ReadUInt32(); writer.WriteNumber($"[{value.InfoID.ReadNumber()}]信息ID", value.InfoID); } else { hex = reader.ReadVirtualArray(8); value.StartTime = reader.ReadUTCDateTime(); writer.WriteString($"[{hex.ToArray().ToHexString()}]事件开始时间", value.StartTime); hex = reader.ReadVirtualArray(8); value.EndTime = reader.ReadUTCDateTime(); writer.WriteString($"[{hex.ToArray().ToHexString()}]事件结束时间", value.EndTime); #warning 此处车牌号文档长度有误,使用旧版长度21 hex = reader.ReadVirtualArray(21); value.VehicleNo = reader.ReadString(21); writer.WriteString($"[{hex.ToArray().ToHexString()}]车牌号码", value.VehicleNo); value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); writer.WriteString($"[{value.VehicleColor.ToByteValue()}]车牌颜色", value.VehicleColor.ToString()); hex = reader.ReadVirtualArray(11); value.DestinationPlatformId = reader.ReadString(11); writer.WriteString($"[{hex.ToArray().ToHexString()}]被报警平台唯一编码", value.DestinationPlatformId); value.DRVLineId = reader.ReadUInt32(); writer.WriteNumber($"[{value.DRVLineId.ReadNumber()}]线路ID", value.DRVLineId); } value.InfoLength = reader.ReadUInt32(); writer.WriteNumber($"[{value.InfoLength.ReadNumber()}]数据长度", value.InfoLength); hex = reader.ReadVirtualArray((int)value.InfoLength); value.InfoContent = reader.ReadString((int)value.InfoLength); writer.WriteString($"[{hex.ToArray().ToHexString()}]信息内容", value.InfoContent); } public JT809_0x1400_0x1402 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1400_0x1402(); if (config.Version == JT809Version.JTT2011) { value.WarnSrc = (JT809WarnSrc)reader.ReadByte(); } else { value.SourcePlatformId = reader.ReadString(11); } value.WarnType = (JT809WarnType)reader.ReadUInt16(); value.WarnTime = reader.ReadUTCDateTime(); if (config.Version == JT809Version.JTT2011) { value.InfoID = reader.ReadUInt32(); } else { value.StartTime = reader.ReadUTCDateTime(); value.EndTime = reader.ReadUTCDateTime(); #warning 此处车牌号文档长度有误,使用旧版长度21 value.VehicleNo = reader.ReadString(21); value.VehicleColor = (JT809VehicleColorType)reader.ReadByte(); value.DestinationPlatformId = reader.ReadString(11); value.DRVLineId = reader.ReadUInt32(); } value.InfoLength = reader.ReadUInt32(); value.InfoContent = reader.ReadString((int)value.InfoLength); return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1400_0x1402 value, IJT809Config config) { if (config.Version == JT809Version.JTT2011) { writer.WriteByte((byte)value.WarnSrc); } else { writer.WriteStringPadRight(value.SourcePlatformId,11); } writer.WriteUInt16((ushort)value.WarnType); writer.WriteUTCDateTime(value.WarnTime); if (config.Version == JT809Version.JTT2011) { writer.WriteUInt32(value.InfoID); } else { writer.WriteUTCDateTime(value.StartTime); writer.WriteUTCDateTime(value.EndTime); writer.WriteStringPadRight(value.VehicleNo,21); writer.WriteByte((byte)value.VehicleColor); writer.WriteStringPadRight(value.DestinationPlatformId,11); writer.WriteUInt32(value.DRVLineId); } // 先计算内容长度(汉字为两个字节) writer.Skip(4, out int lengthPosition); writer.WriteString(value.InfoContent); writer.WriteInt32Return(writer.GetCurrentPosition() - lengthPosition - 4, lengthPosition); } } }