/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_0x0801 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0801 value = new JT808_0x0801(); value.MultimediaId = reader.ReadUInt32(); value.MultimediaType = reader.ReadByte(); value.MultimediaCodingFormat = reader.ReadByte(); value.EventItemCoding = reader.ReadByte(); value.ChannelId = reader.ReadByte(); if (reader.ReadCurrentRemainContentLength() >= 28) { var tempData = reader.ReadVirtualArray(28); try { JT808MessagePackReader positionReader = new JT808MessagePackReader(tempData, reader.Version); value.Position = config.GetMessagePackFormatter <JT808_0x0200>().Deserialize(ref positionReader, config); reader.Skip(28); } catch { PositionError = true; } value.MultimediaDataPackage = reader.ReadContent().ToArray(); } else { value.MultimediaDataPackage = reader.ReadContent().ToArray(); } 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_0x0900 value = new JT808_0x0900(); value.PassthroughType = reader.ReadByte(); writer.WriteNumber($"[{value.PassthroughType.ReadNumber()}]透传消息类型", value.PassthroughType); if (config.JT808_0x0900_Custom_Factory.Map.TryGetValue(value.PassthroughType, out var instance)) { writer.WriteStartObject("数据上行对象"); try { instance.Analyze(ref reader, writer, config); } catch (System.Exception ex) { writer.WriteString("错误信息", $"{ex.Message}-{ex.StackTrace}"); } writer.WriteEndObject(); } else { value.PassthroughData = reader.ReadContent().ToArray(); writer.WriteString("透传消息内容", value.PassthroughData.ToHexString()); } }
public JT808_0x0900 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0900 jT808_0X0900 = new JT808_0x0900(); jT808_0X0900.PassthroughType = reader.ReadByte(); jT808_0X0900.PassthroughData = reader.ReadContent().ToArray();; return(jT808_0X0900); }
public JT808SplitPackageBodies Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808SplitPackageBodies jT808SplitPackageBodies = new JT808SplitPackageBodies { Data = reader.ReadContent().ToArray() }; return(jT808SplitPackageBodies); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x8900 jT808_0X8900 = new JT808_0x8900(); jT808_0X8900.PassthroughType = reader.ReadByte(); jT808_0X8900.PassthroughData = reader.ReadContent().ToArray(); writer.WriteNumber($"[{jT808_0X8900.PassthroughType.ReadNumber()}]透传消息类型", jT808_0X8900.PassthroughType); writer.WriteString($"透传消息内容", jT808_0X8900.PassthroughData.ToHexString()); }
/// <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_0x0801 value = new JT808_0x0801(); value.MultimediaId = reader.ReadUInt32(); writer.WriteNumber($"[{value.MultimediaId.ReadNumber()}]多媒体ID", value.MultimediaId); value.MultimediaType = reader.ReadByte(); writer.WriteNumber($"[{value.MultimediaType.ReadNumber()}]多媒体类型-{((JT808MultimediaType)value.MultimediaType).ToString()}", value.MultimediaType); value.MultimediaCodingFormat = reader.ReadByte(); writer.WriteNumber($"[{value.MultimediaCodingFormat.ReadNumber()}]多媒体格式编码-{((JT808MultimediaCodingFormat)value.MultimediaCodingFormat).ToString()}", value.MultimediaCodingFormat); value.EventItemCoding = reader.ReadByte(); writer.WriteNumber($"[{value.EventItemCoding.ReadNumber()}]事件项编码-{((JT808EventItemCoding)value.EventItemCoding).ToString()}", value.MultimediaCodingFormat); value.ChannelId = reader.ReadByte(); writer.WriteNumber($"[{value.ChannelId.ReadNumber()}]通道ID", value.ChannelId); if (reader.ReadCurrentRemainContentLength() >= 28) { var tempData = reader.ReadVirtualArray(28); try { JT808MessagePackReader positionReader = new JT808MessagePackReader(tempData, reader.Version); writer.WriteStartObject("位置基本信息"); config.GetAnalyze <JT808_0x0200>().Analyze(ref positionReader, writer, config); writer.WriteEndObject(); reader.Skip(28); } catch { PositionError = true; } value.MultimediaDataPackage = reader.ReadContent().ToArray(); writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString()); } else { value.MultimediaDataPackage = reader.ReadContent().ToArray(); writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString()); } }
public JT808HeaderPackage Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { // 1. 验证校验和 if (!config.SkipCRCCode) { if (reader.CheckXorCodeVali) { throw new JT808Exception(JT808ErrorCode.CheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}"); } } JT808HeaderPackage jT808Package = new JT808HeaderPackage(); // ---------------开始解包-------------- // 2.读取起始位置 jT808Package.Begin = reader.ReadStart(); // 3.读取头部信息 jT808Package.Header = new JT808Header(); // 3.1.读取消息Id jT808Package.Header.MsgId = reader.ReadUInt16(); // 3.2.读取消息体属性 jT808Package.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(); ushort messageBodyPropertyValue = reader.ReadUInt16(); // 3.2.1.解包消息体属性 jT808Package.Header.MessageBodyProperty.Unwrap(messageBodyPropertyValue, config); // 3.3.读取终端手机号 jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength); // 3.4.读取消息流水号 jT808Package.Header.MsgNum = reader.ReadUInt16(); // 3.5.判断有无分包 if (jT808Package.Header.MessageBodyProperty.IsPackge) { //3.5.1.读取消息包总数 jT808Package.Header.MessageBodyProperty.PackgeCount = reader.ReadUInt16(); //3.5.2.读取消息包序号 jT808Package.Header.MessageBodyProperty.PackageIndex = reader.ReadUInt16(); } // 4.处理数据体 // 4.1.判断有无数据体 if (jT808Package.Header.MessageBodyProperty.DataLength > 0) { jT808Package.Bodies = reader.ReadContent().ToArray(); } // 5.读取校验码 jT808Package.CheckCode = reader.ReadByte(); // 6.读取终止位置 jT808Package.End = reader.ReadEnd(); // ---------------解包完成-------------- return(jT808Package); }
public JT808_0x0801 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0801 value = new JT808_0x0801(); value.MultimediaId = reader.ReadUInt32(); value.MultimediaType = reader.ReadByte(); value.MultimediaCodingFormat = reader.ReadByte(); value.EventItemCoding = reader.ReadByte(); value.ChannelId = reader.ReadByte(); JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28)); value.Position = config.GetMessagePackFormatter <JT808_0x0200>().Deserialize(ref positionReader, config); value.MultimediaDataPackage = reader.ReadContent().ToArray(); return(value); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_0x0900 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0900 value = new JT808_0x0900(); value.PassthroughType = reader.ReadByte(); if (config.JT808_0x0900_Custom_Factory.Map.TryGetValue(value.PassthroughType, out var instance)) { value.JT808_0x0900_BodyBase = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); } else { value.PassthroughData = reader.ReadContent().ToArray(); } return(value); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { JT808_0x0801 value = new JT808_0x0801(); value.MultimediaId = reader.ReadUInt32(); writer.WriteNumber($"[{value.MultimediaId.ReadNumber()}]多媒体ID", value.MultimediaId); value.MultimediaType = reader.ReadByte(); writer.WriteNumber($"[{value.MultimediaType.ReadNumber()}]多媒体类型-{((JT808MultimediaType)value.MultimediaType).ToString()}", value.MultimediaType); value.MultimediaCodingFormat = reader.ReadByte(); writer.WriteNumber($"[{value.MultimediaCodingFormat.ReadNumber()}]多媒体格式编码-{((JT808MultimediaCodingFormat)value.MultimediaCodingFormat).ToString()}", value.MultimediaCodingFormat); value.EventItemCoding = reader.ReadByte(); writer.WriteNumber($"[{value.EventItemCoding.ReadNumber()}]事件项编码-{((JT808EventItemCoding)value.EventItemCoding).ToString()}", value.MultimediaCodingFormat); value.ChannelId = reader.ReadByte(); writer.WriteNumber($"[{value.ChannelId.ReadNumber()}]通道ID", value.ChannelId); JT808MessagePackReader positionReader = new JT808MessagePackReader(reader.ReadArray(28)); writer.WriteStartObject("位置基本信息"); config.GetAnalyze <JT808_0x0200>().Analyze(ref positionReader, writer, config); writer.WriteEndObject(); value.MultimediaDataPackage = reader.ReadContent().ToArray(); writer.WriteString($"多媒体数据包", value.MultimediaDataPackage.ToHexString()); }
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config) { // ---------------开始解析对象-------------- writer.WriteStartObject(); // 1. 验证校验和 if (!reader.CheckXorCodeVali) { writer.WriteString("检验和错误", $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}"); } // 2.读取起始位置 byte start = reader.ReadEnd(); writer.WriteNumber($"[{start.ReadNumber()}]开始", start); var msgid = reader.ReadUInt16(); writer.WriteNumber($"[{msgid.ReadNumber()}]消息Id", msgid); ushort messageBodyPropertyValue = reader.ReadUInt16(); var headerMessageBodyProperty = new JT808HeaderMessageBodyProperty(messageBodyPropertyValue); //消息体属性对象 开始 writer.WriteStartObject("消息体属性对象"); ReadOnlySpan <char> messageBodyPropertyReadOnlySpan = messageBodyPropertyValue.ReadBinary(); writer.WriteNumber($"[{messageBodyPropertyReadOnlySpan.ToString()}]消息体属性", messageBodyPropertyValue); if (headerMessageBodyProperty.VersionFlag) { reader.Version = JT808Version.JTT2019; writer.WriteNumber("[bit15]保留", 0); writer.WriteBoolean("[bit14]协议版本标识", headerMessageBodyProperty.VersionFlag); writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage); writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString()); writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength); //消息体属性对象 结束 writer.WriteEndObject(); //2019版本 var protocolVersion = reader.ReadByte(); writer.WriteNumber($"[{protocolVersion.ReadNumber()}]协议版本号(2019)", protocolVersion); // 3.4.读取终端手机号 var terminalPhoneNo = reader.ReadBCD(20, config.Trim); writer.WriteString($"[{terminalPhoneNo}]终端手机号", terminalPhoneNo); } else { reader.Version = JT808Version.JTT2013; writer.WriteNumber("[bit15]保留", 0); writer.WriteNumber("[bit14]保留", 0); writer.WriteBoolean("[bit13]是否分包", headerMessageBodyProperty.IsPackage); writer.WriteString("[bit10~bit12]数据加密", headerMessageBodyProperty.Encrypt.ToString()); writer.WriteNumber("[bit0~bit9]消息体长度", headerMessageBodyProperty.DataLength); writer.WriteEndObject(); //2013版本 // 3.3.读取终端手机号 var terminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); //消息体属性对象 结束 writer.WriteString($"[{terminalPhoneNo}]终端手机号", terminalPhoneNo); } // 3.4.读取消息流水号 var msgNum = reader.ReadUInt16(); writer.WriteNumber($"[{msgNum.ReadNumber()}]消息流水号", msgNum); // 3.5.判断有无分包 uint packgeCount = 0, packageIndex = 0; if (headerMessageBodyProperty.IsPackage) { //3.5.1.读取消息包总数 packgeCount = reader.ReadUInt16(); writer.WriteNumber($"[{packgeCount.ReadNumber()}]消息包总数", packgeCount); //3.5.2.读取消息包序号 packageIndex = reader.ReadUInt16(); writer.WriteNumber($"[{packageIndex.ReadNumber()}]消息包序号", packageIndex); } // 4.处理数据体 // 4.1.判断有无数据体 if (headerMessageBodyProperty.DataLength > 0) { if (config.MsgIdFactory.TryGetValue(msgid, out object instance)) { //数据体属性对象 开始 writer.WriteStartObject("数据体对象"); string description = "数据体"; if (instance is IJT808Description jT808Description) { //4.2.处理消息体 description = jT808Description.Description; } if (headerMessageBodyProperty.IsPackage) { if (packageIndex > 1) { try { //4.2处理第二包之后的分包数据消息体 writer.WriteString($"[分包]数据体", reader.ReadContent().ToArray().ToHexString()); } catch (Exception ex) { writer.WriteString($"[分包]数据体异常", ex.StackTrace); } } else { try { writer.WriteString($"[分包]{description}", reader.ReadVirtualArray(headerMessageBodyProperty.DataLength).ToArray().ToHexString()); if (instance is IJT808Analyze analyze) { //4.2.处理消息体 analyze.Analyze(ref reader, writer, config); } } catch (Exception ex) { writer.WriteString($"[分包]数据体异常", ex.StackTrace); } } } else { try { writer.WriteString($"{description}", reader.ReadVirtualArray(headerMessageBodyProperty.DataLength).ToArray().ToHexString()); if (instance is IJT808Analyze analyze) { //4.2.处理消息体 analyze.Analyze(ref reader, writer, config); } } catch (Exception ex) { writer.WriteString($"数据体异常", ex.StackTrace); } } //数据体属性对象 结束 writer.WriteEndObject(); } else { writer.WriteNull($"[Null]数据体"); } } else { if (config.MsgIdFactory.TryGetValue(msgid, out object instance)) { //数据体属性对象 开始 writer.WriteStartObject("数据体对象"); string description = "[Null]数据体"; if (instance is IJT808Description jT808Description) { //4.2.处理消息体 description = jT808Description.Description; } writer.WriteNull(description); //数据体属性对象 结束 writer.WriteEndObject(); } else { writer.WriteNull($"[Null]数据体"); } } // 5.读取校验码 reader.ReadByte(); writer.WriteNumber($"[{reader.RealCheckXorCode.ReadNumber()}]校验码", reader.RealCheckXorCode); // 6.读取终止位置 byte end = reader.ReadEnd(); writer.WriteNumber($"[{end.ReadNumber()}]结束", end); writer.WriteEndObject(); }
public JT808HeaderPackage(ref JT808MessagePackReader reader, IJT808Config config) { // 1. 验证校验和 if (!config.SkipCRCCode) { if (!reader.CheckXorCodeVali) { throw new JT808Exception(JT808ErrorCode.CheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}"); } } // ---------------开始解包-------------- // 2.读取起始位置 this.Begin = reader.ReadStart(); // 3.读取头部信息 this.Header = new JT808Header(); // 3.1.读取消息Id this.Header.MsgId = reader.ReadUInt16(); // 3.2.读取消息体属性 ushort messageBodyPropertyValue = reader.ReadUInt16(); // 3.2.1.解包消息体属性 this.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(messageBodyPropertyValue); if (this.Header.MessageBodyProperty.VersionFlag) { //2019版本 // 3.3.读取协议版本号 this.Header.ProtocolVersion = reader.ReadByte(); // 3.4.读取终端手机号 this.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim); reader.Version = JT808Version.JTT2019; } else { //2013版本 // 3.3.读取终端手机号 this.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); } // 3.4.读取消息流水号 this.Header.MsgNum = reader.ReadUInt16(); // 3.5.判断有无分包 if (this.Header.MessageBodyProperty.IsPackage) { //3.5.1.读取消息包总数 this.Header.PackgeCount = reader.ReadUInt16(); //3.5.2.读取消息包序号 this.Header.PackageIndex = reader.ReadUInt16(); } // 4.处理数据体 // 4.1.判断有无数据体 if (this.Header.MessageBodyProperty.DataLength > 0) { this.Bodies = reader.ReadContent(); } else { this.Bodies = ReadOnlySpan <byte> .Empty; } // 5.读取校验码 this.CheckCode = reader.ReadByte(); // 6.读取终止位置 this.End = reader.ReadEnd(); // ---------------解包完成-------------- this.OriginalData = reader.SrcBuffer; }