/// <summary> /// /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="config"></param> public void Serialize(ref JT808MessagePackWriter writer, JT808CarDVRUpPackage value, IJT808Config config) { var currentPosition = writer.GetCurrentPosition(); writer.WriteUInt16(value.Begin); writer.WriteByte(value.CommandId); var isError = value.CommandId == 0xFA || value.CommandId == 0xFB; int datalengthPosition = 0; if (!isError) { writer.Skip(2, out datalengthPosition); } writer.WriteByte(value.KeepFields); if (datalengthPosition > 0) { if (config.JT808_CarDVR_Up_Factory.Map.TryGetValue(value.CommandId, out var instance)) { if (!value.Bodies.SkipSerialization) { //4.2.处理消息体 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(instance, ref writer, value.Bodies, config); } } writer.WriteUInt16Return((ushort)(writer.GetCurrentPosition() - 2 - 1 - datalengthPosition), datalengthPosition);//此处-2:减去数据长度字段2位,-1:减去保留字长度 } writer.WriteCarDVRCheckCode(currentPosition); }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200 value, IJT808Config config) { writer.WriteUInt32(value.AlarmFlag); writer.WriteUInt32(value.StatusFlag); //0x10000000 南纬 134217728 //0x8000000 西经 268435456 //0x18000000 南纬-西经 134217728+268435456 if (((value.StatusFlag >> 28) & 1) == 1) { uint lat = (uint)value.Lat; writer.WriteUInt32(lat); } else { if (value.Lat < 0) { throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lat {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>28) !=1"); } writer.WriteInt32(value.Lat); } if (((value.StatusFlag >> 27) & 1) == 1) { uint lng = (uint)value.Lng; writer.WriteUInt32(lng); } else { if (value.Lng < 0) { throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lng {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>29) !=1"); } writer.WriteInt32(value.Lng); } writer.WriteUInt16(value.Altitude); writer.WriteUInt16(value.Speed); writer.WriteUInt16(value.Direction); writer.WriteDateTime6(value.GPSTime); if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0) { foreach (var item in value.JT808LocationAttachData) { try { object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config); } catch { } } } if (value.JT808CustomLocationAttachData != null && value.JT808CustomLocationAttachData.Count > 0) { foreach (var item in value.JT808CustomLocationAttachData) { object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config); } } }
public void Serialize(ref JT808MessagePackWriter writer, JT808Package value, IJT808Config config) { // ---------------开始组包-------------- // 1.起始符 writer.WriteStart(); // 2.写入头部 //部分有带数据体的长度,那么先跳过写入头部部分 // 2.1.消息ID writer.WriteUInt16(value.Header.MsgId); // 2.2.消息体属性(包含消息体长度所以先跳过) writer.Skip(2, out int msgBodiesPropertyPosition); if (value.Header.MessageBodyProperty.VersionFlag) { //2019版本 // 2.3.协议版本号 writer.WriteByte(value.Header.ProtocolVersion); // 2.4.终端手机号 writer.WriteBCD(value.Header.TerminalPhoneNo, 20); writer.Version = JT808Version.JTT2019; } else { //2013版本 // 2.3.终端手机号 (写死大陆手机号码) writer.WriteBCD(value.Header.TerminalPhoneNo, config.TerminalPhoneNoLength); } value.Header.MsgNum = value.Header.MsgNum > 0 ? value.Header.MsgNum : config.MsgSNDistributed.Increment(); // 2.4.消息流水号 writer.WriteUInt16(value.Header.MsgNum); // 2.5.判断是否分包 if (value.Header.MessageBodyProperty.IsPackage) { // 2.5.1.消息包总数 writer.WriteUInt16(value.Header.PackgeCount); // 2.5.2.消息包序号 writer.WriteUInt16(value.Header.PackageIndex); } int headerLength = writer.GetCurrentPosition(); // 3.处理数据体部分 if (value.Bodies != null) { if (!value.Bodies.SkipSerialization) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(value.Bodies, ref writer, value.Bodies, config); } } // 3.1.处理数据体长度 // 2.2.回写消息体属性 value.Header.MessageBodyProperty.DataLength = (writer.GetCurrentPosition() - headerLength); writer.WriteUInt16Return(value.Header.MessageBodyProperty.Wrap(), msgBodiesPropertyPosition); // 4.校验码 writer.WriteXor(); // 5.终止符 writer.WriteEnd(); // 6.编码 writer.WriteEncode(); // ---------------组包结束-------------- }
/// <summary> /// /// </summary> /// <param name="bytes"></param> /// <param name="type"></param> /// <param name="version"></param> /// <returns></returns> public dynamic Deserialize(ReadOnlySpan <byte> bytes, Type type, JT808Version version = JT808Version.JTT2013) { var formatter = jT808Config.GetMessagePackFormatterByType(type); JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); return(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(formatter, ref jT808MessagePackReader, jT808Config)); }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0900 value, IJT808Config config) { writer.WriteByte(value.PassthroughType); object obj = config.GetMessagePackFormatterByType(value.JT808_0x0900_BodyBase.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808_0x0900_BodyBase, config); }
public JT808_0x0104 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0104 jT808_0x0104 = new JT808_0x0104(); jT808_0x0104.MsgNum = reader.ReadUInt16(); jT808_0x0104.AnswerParamsCount = reader.ReadByte(); for (int i = 0; i < jT808_0x0104.AnswerParamsCount; i++) { var paramId = reader.ReadVirtualUInt32();//参数ID if (config.JT808_0X8103_Factory.ParamMethods.TryGetValue(paramId, out Type type)) { if (jT808_0x0104.ParamList != null) { jT808_0x0104.ParamList.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize( config.GetMessagePackFormatterByType(type), ref reader, config)); } else { jT808_0x0104.ParamList = new List <JT808_0x8103_BodyBase> { JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize( config.GetMessagePackFormatterByType(type), ref reader, config) }; } } } return(jT808_0x0104); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_0x0104 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0104 jT808_0x0104 = new JT808_0x0104(); jT808_0x0104.MsgNum = reader.ReadUInt16(); jT808_0x0104.AnswerParamsCount = reader.ReadByte(); for (int i = 0; i < jT808_0x0104.AnswerParamsCount; i++) { var paramId = reader.ReadVirtualUInt32();//参数ID if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance)) { if (jT808_0x0104.ParamList != null) { jT808_0x0104.ParamList.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config)); } else { jT808_0x0104.ParamList = new List <JT808_0x8103_BodyBase> { JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config) }; } } else { //对于未能解析的自定义项,过滤其长度,以保证后续解析正常 reader.Skip(4); //跳过参数id长度 var len = reader.ReadByte(); //获取协议长度 reader.Skip(len); //跳过协议内容 } } return(jT808_0x0104); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808CarDVRUpPackage Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808CarDVRUpPackage value = new JT808CarDVRUpPackage(); int currentPosition = reader.ReaderCount; value.Begin = reader.ReadUInt16(); value.CommandId = reader.ReadByte(); value.DataLength = reader.ReadUInt16(); value.KeepFields = reader.ReadByte(); if (value.DataLength > 0) { if (config.JT808_CarDVR_Up_Factory.Map.TryGetValue(value.CommandId, out var instance)) { //4.2.处理消息体 dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); value.Bodies = attachImpl; } } var(CalculateXorCheckCode, RealXorCheckCode) = reader.ReadCarDVRCheckCode(currentPosition); if (!config.SkipCarDVRCRCCode) { if (RealXorCheckCode != CalculateXorCheckCode) { throw new JT808Exception(JT808ErrorCode.CarDVRCheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}"); } } value.CheckCode = reader.ReadByte(); return(value); }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8500 value, IJT808Config config) { if (writer.Version == JT808Version.JTT2019) { if (value.ControlTypes != null && value.ControlTypes.Count > 0) { writer.WriteUInt16((ushort)value.ControlTypes.Count); foreach (var item in value.ControlTypes) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } else { writer.WriteUInt16(value.ControlTypeCount); if (value.ControlTypeBuffer != null && value.ControlTypeBuffer.Length > 0) { writer.WriteArray(value.ControlTypeBuffer); } } } else { writer.WriteByte(value.ControlFlag); } }
public JT808_0x8500 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8500 value = new JT808_0x8500(); if (reader.Version == JT808Version.JTT2019) { value.ControlTypeCount = reader.ReadUInt16(); value.ControlTypes = new List <JT808_0x8500_ControlType>(); while (reader.ReadCurrentRemainContentLength() > 0) { var controlTypeId = reader.ReadVirtualUInt16(); if (config.JT808_0x8500_2019_Factory.Map.TryGetValue(controlTypeId, out object instance)) { value.ControlTypes.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config)); } else { value.ControlTypeBuffer = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); } } } else { value.ControlFlag = reader.ReadByte(); } return(value); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808_0x8103 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8103 value = new JT808_0x8103 { ParamList = new List <JT808_0x8103_BodyBase>(), CustomParamList = new List <JT808_0x8103_CustomBodyBase>() }; var paramCount = reader.ReadByte();//参数总数 try { for (int i = 0; i < paramCount; i++) { var paramId = reader.ReadVirtualUInt32();//参数ID if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); value.ParamList.Add(attachImpl); } else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customInstance, ref reader, config); value.CustomParamList.Add(attachImpl); } } } catch { } return(value); }
public JT808_0x8103 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8103 jT808_0x8103 = new JT808_0x8103 { ParamList = new List <JT808_0x8103_BodyBase>(), CustomParamList = new List <JT808_0x8103_CustomBodyBase>() }; var paramCount = reader.ReadByte();//参数总数 try { for (int i = 0; i < paramCount; i++) { var paramId = reader.ReadVirtualUInt32();//参数ID if (config.JT808_0X8103_Factory.ParamMethods.TryGetValue(paramId, out Type type)) { object attachImplObj = config.GetMessagePackFormatterByType(type); dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, ref reader, config); jT808_0x8103.ParamList.Add(attachImpl); } else if (config.JT808_0X8103_Custom_Factory.ParamMethods.TryGetValue(paramId, out Type customType)) { object attachImplObj = config.GetMessagePackFormatterByType(customType); dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, ref reader, config); jT808_0x8103.CustomParamList.Add(attachImpl); } } } catch (Exception ex) { } return(jT808_0x8103); }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8700 value, IJT808Config config) { writer.WriteByte(value.CommandId); object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808CarDVRDownPackage, config); }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200 value, IJT808Config config) { writer.WriteUInt32(value.AlarmFlag); writer.WriteUInt32(value.StatusFlag); writer.WriteInt32(value.Lat); writer.WriteInt32(value.Lng); writer.WriteUInt16(value.Altitude); writer.WriteUInt16(value.Speed); writer.WriteUInt16(value.Direction); writer.WriteDateTime6(value.GPSTime); if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0) { foreach (var item in value.JT808LocationAttachData) { try { object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config); } catch { } } } if (value.JT808CustomLocationAttachData != null && value.JT808CustomLocationAttachData.Count > 0) { foreach (var item in value.JT808CustomLocationAttachData) { object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config); } } }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0700 value, IJT808Config config) { writer.WriteUInt16(value.ReplyMsgNum); writer.WriteByte(value.CommandId); object obj = config.GetMessagePackFormatterByType(typeof(JT808CarDVRUpPackage)); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808CarDVRUpPackage, config); }
public JT808_0x8700 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x8700 value = new JT808_0x8700(); value.CommandId = reader.ReadByte(); object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType()); value.JT808CarDVRDownPackage = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(obj, ref reader, config); return(value); }
/// <summary> /// /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="config"></param> public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0104 value, IJT808Config config) { writer.WriteUInt16(value.MsgNum); writer.WriteByte(value.AnswerParamsCount); foreach (var item in value.ParamList) { object obj = config.GetMessagePackFormatterByType(item.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, item, config); } }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0701 value, IJT808Config config) { writer.Skip(4, out int skipPosition); object obj = config.GetMessagePackFormatterByType(value.ElectronicContentObj.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.ElectronicContentObj, config); int contentLength = writer.GetCurrentPosition() - skipPosition - 4; writer.WriteInt32Return(contentLength, skipPosition); }
public JT808_0x0700 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0700 value = new JT808_0x0700(); value.ReplyMsgNum = reader.ReadUInt16(); value.CommandId = reader.ReadByte(); object obj = config.GetMessagePackFormatterByType(typeof(JT808CarDVRUpPackage)); value.JT808CarDVRUpPackage = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(obj, ref reader, config); return(value); }
/// <summary> /// /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="config"></param> public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900 value, IJT808Config config) { writer.WriteByte(value.PassthroughType); if (value.JT808_0X8900_BodyBase != null) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(value.JT808_0X8900_BodyBase, ref writer, value.JT808_0X8900_BodyBase, config); } else { writer.WriteArray(value.PassthroughData); } }
/// <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 dynamic Deserialize(ReadOnlySpan <byte> bytes, Type type, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096) { byte[] buffer = JT808ArrayPool.Rent(minBufferSize); try { var formatter = jT808Config.GetMessagePackFormatterByType(type); JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version); if (CheckPackageType(type)) { jT808MessagePackReader.Decode(buffer); } return(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(formatter, ref jT808MessagePackReader, jT808Config)); } finally { JT808ArrayPool.Return(buffer); } }
/// <summary> /// /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="config"></param> public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103 value, IJT808Config config) { writer.WriteByte(value.ParamCount); try { foreach (var item in value.ParamList) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } if (value.CustomParamList != null) { foreach (var item in value.CustomParamList) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } } catch { } }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103 value, IJT808Config config) { writer.WriteByte(value.ParamCount); try { foreach (var item in value.ParamList) { object attachImplObj = config.GetMessagePackFormatterByType(item.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item, config); } if (value.CustomParamList != null) { foreach (var item in value.CustomParamList) { object attachImplObj = config.GetMessagePackFormatterByType(item.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item, config); } } } catch (Exception ex) { } }
public void Serialize(ref JT808MessagePackWriter writer, JT808_JTActiveSafety_0x0900 value, IJT808Config config) { if (value.USBMessages != null && value.USBMessages.Count > 0) { writer.WriteByte((byte)value.USBMessages.Count); foreach (var item in value.USBMessages) { writer.WriteByte(item.USBID); if (item.MessageContent != null && item.MessageContent.Length > 0) { writer.WriteByte((byte)item.MessageContent.Length); writer.WriteArray(item.MessageContent); } else if (item.MessageContentObejct != null) { writer.Skip(1, out int MessageContentLengthPosition); object obj = config.GetMessagePackFormatterByType(item.MessageContentObejct.GetType()); JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, item.MessageContentObejct, config); writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - MessageContentLengthPosition - 1), MessageContentLengthPosition); } } } }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <param name="config"></param> /// <returns></returns> public JT808Package Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { // 1. 验证校验和 if (!config.SkipCRCCode) { if (!reader.CheckXorCodeVali) { throw new JT808Exception(JT808ErrorCode.CheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}"); } } JT808Package jT808Package = new JT808Package(); // ---------------开始解包-------------- // 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(reader.ReadUInt16()); if (reader.Version == JT808Version.JTT2013Force) { jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); reader.Version = JT808Version.JTT2013; } else { if (reader.Version == JT808Version.JTT2019 || jT808Package.Header.MessageBodyProperty.VersionFlag) { //2019版本 jT808Package.Header.ProtocolVersion = reader.ReadByte(); // 3.4.读取终端手机号 jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim); reader.Version = JT808Version.JTT2019; } else { //2013版本 // 3.3.读取终端手机号 jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim); } } jT808Package.Version = reader.Version; // 3.4.读取消息流水号 jT808Package.Header.MsgNum = reader.ReadUInt16(); // 3.5.判断有无分包 if (jT808Package.Header.MessageBodyProperty.IsPackage) { //3.5.1.读取消息包总数 jT808Package.Header.PackgeCount = reader.ReadUInt16(); //3.5.2.读取消息包序号 jT808Package.Header.PackageIndex = reader.ReadUInt16(); } // 4.处理数据体 // 4.1.判断有无数据体 if (jT808Package.Header.MessageBodyProperty.DataLength > 0) { if (config.MsgIdFactory.TryGetValue(jT808Package.Header.MsgId, out object instance)) { if (jT808Package.Header.MessageBodyProperty.IsPackage) { //读取分包的数据体 try { jT808Package.SubDataBodies = reader.ReadArray(jT808Package.Header.MessageBodyProperty.DataLength).ToArray(); } catch (Exception ex) { throw new JT808Exception(JT808ErrorCode.BodiesParseError, ex); } } else { try { //4.2.处理消息体 jT808Package.Bodies = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize( instance, ref reader, config); } catch (Exception ex) { throw new JT808Exception(JT808ErrorCode.BodiesParseError, ex); } } } } // 5.读取校验码 jT808Package.CheckCode = reader.ReadByte(); // 6.读取终止位置 jT808Package.End = reader.ReadEnd(); // ---------------解包完成-------------- return(jT808Package); }
/// <summary> /// /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="config"></param> public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200 value, IJT808Config config) { writer.WriteUInt32(value.AlarmFlag); writer.WriteUInt32(value.StatusFlag); //0x10000000 南纬 134217728 //0x8000000 西经 268435456 //0x18000000 南纬-西经 134217728+268435456 if (((value.StatusFlag >> 28) & 1) == 1) { uint lat = (uint)value.Lat; writer.WriteUInt32(lat); } else { if (value.Lat < 0) { throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lat {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>28) !=1"); } writer.WriteInt32(value.Lat); } if (((value.StatusFlag >> 27) & 1) == 1) { uint lng = (uint)value.Lng; writer.WriteUInt32(lng); } else { if (value.Lng < 0) { throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lng {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>29) !=1"); } writer.WriteInt32(value.Lng); } writer.WriteUInt16(value.Altitude); writer.WriteUInt16(value.Speed); writer.WriteUInt16(value.Direction); writer.WriteDateTime_yyMMddHHmmss(value.GPSTime); if (value.BasicLocationAttachData != null && value.BasicLocationAttachData.Count > 0) { foreach (var item in value.BasicLocationAttachData) { try { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); } catch { } } } if (value.CustomLocationAttachData != null && value.CustomLocationAttachData.Count > 0) { foreach (var item in value.CustomLocationAttachData) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); } } if (value.CustomLocationAttachData2 != null && value.CustomLocationAttachData2.Count > 0) { foreach (var item in value.CustomLocationAttachData2) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); } } if (value.CustomLocationAttachData3 != null && value.CustomLocationAttachData3.Count > 0) { foreach (var item in value.CustomLocationAttachData3) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); } } if (value.CustomLocationAttachData4 != null && value.CustomLocationAttachData4.Count > 0) { foreach (var item in value.CustomLocationAttachData4) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config); } } if (value.UnknownLocationAttachData != null && value.UnknownLocationAttachData.Count > 0) { foreach (var item in value.UnknownLocationAttachData) { if (item.Value != null && item.Value.Length >= 2) { writer.WriteArray(item.Value); } } } if (value.ExceptionLocationAttachOriginalData != null && value.ExceptionLocationAttachOriginalData.Count > 0) { foreach (var item in value.ExceptionLocationAttachOriginalData) { if (item != null && item.Length >= 2) { writer.WriteArray(item); } } } }
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0608 value, IJT808Config config) { writer.WriteByte(value.QueryType); switch (value.QueryType) { case 1: if (value.JT808_0x8600s != null && value.JT808_0x8600s.Count > 0) { writer.WriteUInt32((uint)value.JT808_0x8600s.Count); foreach (var item in value.JT808_0x8600s) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } break; case 2: if (value.JT808_0x8602s != null && value.JT808_0x8602s.Count > 0) { writer.WriteUInt32((uint)value.JT808_0x8602s.Count); foreach (var item in value.JT808_0x8602s) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } break; case 3: if (value.JT808_0x8604s != null && value.JT808_0x8604s.Count > 0) { writer.WriteUInt32((uint)value.JT808_0x8604s.Count); foreach (var item in value.JT808_0x8604s) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } break; case 4: if (value.JT808_0x8606s != null && value.JT808_0x8606s.Count > 0) { writer.WriteUInt32((uint)value.JT808_0x8606s.Count); foreach (var item in value.JT808_0x8606s) { JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config); } } break; default: if (value.Ids != null && value.Ids.Count > 0) { writer.WriteUInt32((uint)value.Ids.Count); foreach (var item in value.Ids) { writer.WriteUInt32(item); } } else { writer.WriteUInt32(0); } break; } }
public JT808_0x0608 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { JT808_0x0608 value = new JT808_0x0608(); value.QueryType = reader.ReadByte(); value.Count = reader.ReadUInt32(); if (value.Count > 0) { switch (value.QueryType) { case 1: value.JT808_0x8600s = new List <JT808_0x8600>(); for (int i = 0; i < value.Count; i++) { if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8600).GUID, out object instance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); value.JT808_0x8600s.Add(attachImpl); } } break; case 2: value.JT808_0x8602s = new List <JT808_0x8602>(); for (int i = 0; i < value.Count; i++) { if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8602).GUID, out object instance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); value.JT808_0x8602s.Add(attachImpl); } } break; case 3: value.JT808_0x8604s = new List <JT808_0x8604>(); for (int i = 0; i < value.Count; i++) { if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8604).GUID, out object instance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); value.JT808_0x8604s.Add(attachImpl); } } break; case 4: value.JT808_0x8606s = new List <JT808_0x8606>(); for (int i = 0; i < value.Count; i++) { if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8606).GUID, out object instance)) { dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config); value.JT808_0x8606s.Add(attachImpl); } } break; default: value.Ids = new List <uint>(); for (int i = 0; i < value.Count; i++) { value.Ids.Add(reader.ReadUInt32()); } break; } } return(value); }
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); }