public JT809HeaderPackage Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { // 1. 验证校验码 if (!config.SkipCRCCode) { // 1.2. 验证校验码 if (!reader.CheckXorCodeVali) { throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode}!={reader.RealCheckXorCode}"); } } JT809HeaderPackage jT809Package = new JT809HeaderPackage { // 2.读取起始头 BeginFlag = reader.ReadStart() }; // 3.初始化消息头 try { jT809Package.Header = JT809HeaderFormatter.Instance.Deserialize(ref reader, config); } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); } // 5.数据体处理 // 5.1 判断是否有数据体(总长度-固定长度)> 0 if ((jT809Package.Header.MsgLength - JT809Package.FixedByteLength) > 0) { try { // 5.2 是否加密 switch (jT809Package.Header.EncryptFlag) { case JT809Header_Encrypt.None: // 5.3 处理消息体 jT809Package.Bodies = reader.ReadContent().ToArray(); break; case JT809Header_Encrypt.Common: // 5.4. 处理加密消息体 byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Package.Header.EncryptKey); jT809Package.Bodies = bodiesData; break; } } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); } } jT809Package.CRCCode = reader.CalculateCheckXorCode; jT809Package.EndFlag = reader.ReadEnd(); return(jT809Package); }
public JT809Package Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { // 1. 验证校验码 if (!config.SkipCRCCode) { // 1.2. 验证校验码 if (!reader.CheckXorCodeVali) { throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode.ToString()}!={reader.RealCheckXorCode.ToString()}"); } } JT809Package jT809Package = new JT809Package(); // 2.读取起始头 jT809Package.BeginFlag = reader.ReadStart(); // 3.初始化消息头 try { //todo:JT809HeaderFormatter //jT809Package.Header = JT809HeaderFormatter.Instance.Deserialize(ref reader, config); } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); } // 5.数据体处理 // 5.1 判断是否有数据体(总长度-固定长度)> 0 if ((jT809Package.Header.MsgLength - JT809Package.FixedByteLength) > 0) { try { Type jT809BodiesImplType = config.BusinessTypeFactory.GetBodiesImplTypeByBusinessType(jT809Package.Header.BusinessType, jT809Package.Header.MsgGNSSCENTERID); if (jT809BodiesImplType != null) { // 5.2 是否加密 switch (jT809Package.Header.EncryptFlag) { case JT809Header_Encrypt.None: // 5.3 处理消息体 jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( config.GetMessagePackFormatterByType(jT809BodiesImplType), ref reader, config); break; case JT809Header_Encrypt.Common: // 5.4. 处理加密消息体 byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Package.Header.EncryptKey); JT809MessagePackReader bodiesReader = new JT809MessagePackReader(bodiesData); jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize( config.GetMessagePackFormatterByType(jT809BodiesImplType), ref bodiesReader, config); break; } } } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); } } jT809Package.CRCCode = reader.CalculateCheckXorCode; jT809Package.EndFlag = reader.ReadEnd(); return(jT809Package); }
public JT809Package Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { // 1. 验证校验码 if (!config.SkipCRCCode) { // 1.2. 验证校验码 if (!reader.CheckXorCodeVali) { throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode}!={reader.RealCheckXorCode}"); } } JT809Package jT809Package = new JT809Package(); // 2.读取起始头 jT809Package.BeginFlag = reader.ReadStart(); // 3.初始化消息头 try { jT809Package.Header = config.GetMessagePackFormatter <JT809Header>().Deserialize(ref reader, config); } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); } // 5.数据体处理 // 5.1 判断是否有数据体(总长度-固定长度)> 0 int fixedByteLength = config.Version == JT809Version.JTT2019 ? FixedByteLength_2019 : FixedByteLength; if ((jT809Package.Header.MsgLength - fixedByteLength) > 0) { if (config.BusinessTypeFactory.TryGetValue(jT809Package.Header.BusinessType, config.Version, out object instance)) { try { // 5.2 是否加密 switch (jT809Package.Header.EncryptFlag) { case JT809Header_Encrypt.None: // 5.3 处理消息体 jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(instance, ref reader, config); break; case JT809Header_Encrypt.Common: // 5.4. 处理加密消息体 byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Package.Header.EncryptKey); JT809MessagePackReader bodiesReader = new JT809MessagePackReader(bodiesData); jT809Package.Bodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(instance, ref bodiesReader, config); break; } } catch (Exception ex) { throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); } } } jT809Package.CRCCode = reader.CalculateCheckXorCode; jT809Package.EndFlag = reader.ReadEnd(); return(jT809Package); }
public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { JT809Package jT809Package = new JT809Package(); writer.WriteStartObject(); // 2.读取起始头 jT809Package.BeginFlag = reader.ReadStart(); writer.WriteNumber($"[{jT809Package.BeginFlag.ReadNumber()}]起始标识", jT809Package.BeginFlag); // 3.初始化消息头 JT809Header jT809Header = new JT809Header(); writer.WriteStartObject("消息头"); try { jT809Header.MsgLength = reader.ReadUInt32(); writer.WriteNumber($"[{jT809Header.MsgLength.ReadNumber()}]数据长度", jT809Header.MsgLength); jT809Header.MsgSN = reader.ReadUInt32(); writer.WriteNumber($"[{jT809Header.MsgSN.ReadNumber()}]报文序列号", jT809Header.MsgSN); jT809Header.BusinessType = reader.ReadUInt16(); writer.WriteString($"[{jT809Header.BusinessType.ReadNumber()}]业务类型标识", ((JT809BusinessType)jT809Header.BusinessType).ToString()); jT809Header.MsgGNSSCENTERID = reader.ReadUInt32(); writer.WriteNumber($"[{jT809Header.MsgGNSSCENTERID.ReadNumber()}]下级平台接入码", jT809Header.MsgGNSSCENTERID); var virtualHex = reader.ReadVirtualArray(JT809Header_Version.FixedByteLength); jT809Header.Version = new JT809Header_Version(reader.ReadArray(JT809Header_Version.FixedByteLength)); writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]协议版本号标识", jT809Header.Version.ToString()); jT809Header.EncryptFlag = (JT809Header_Encrypt)reader.ReadByte(); writer.WriteString($"[{ jT809Header.EncryptFlag.ToByteValue()}]报文加密标识位", jT809Header.EncryptFlag.ToString()); jT809Header.EncryptKey = reader.ReadUInt32(); writer.WriteNumber($"[{jT809Header.EncryptKey.ReadNumber()}]数据加密的密匙", jT809Header.EncryptKey); if (config.Version == JT809Version.JTT2019) { virtualHex = reader.ReadVirtualArray(8); jT809Header.Time = reader.ReadUTCDateTime(); writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]发送消息时的系统UTC时间", jT809Header.Time); } } catch (Exception ex) { writer.WriteString($"[{(int)JT809ErrorCode.HeaderParseError}]消息头异常", $"offset>{reader.ReadCurrentRemainContentLength()},异常消息:{ex.Message}"); } writer.WriteEndObject(); writer.WriteStartObject("消息体"); // 5.数据体处理 // 5.1 判断是否有数据体(总长度-固定长度)> 0 int fixedByteLength = config.Version == JT809Version.JTT2019 ? FixedByteLength_2019 : FixedByteLength; if ((jT809Header.MsgLength - fixedByteLength) > 0) { if (config.BusinessTypeFactory.TryGetValue(jT809Header.BusinessType, config.Version, out object instance)) { try { // 5.2 是否加密 switch (jT809Header.EncryptFlag) { case JT809Header_Encrypt.None: // 5.3 处理消息体 instance.Analyze(ref reader, writer, config); break; case JT809Header_Encrypt.Common: // 5.4. 处理加密消息体 byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Header.EncryptKey); JT809MessagePackReader bodiesReader = new JT809MessagePackReader(bodiesData); instance.Analyze(ref bodiesReader, writer, config); break; } } catch (Exception ex) { writer.WriteString($"[{(int)JT809ErrorCode.BodiesParseError}]消息体异常", $"offset>{reader.ReadCurrentRemainContentLength()},异常消息:{ex.Message}"); } } } writer.WriteEndObject(); jT809Package.CRCCode = reader.ReadUInt16(); writer.WriteNumber($"[{jT809Package.CRCCode.ReadNumber()}]校验码", jT809Package.CRCCode); // 1. 验证校验码 if (!config.SkipCRCCode) { // 1.2. 验证校验码 if (!reader.CheckXorCodeVali) { writer.WriteString($"[{(int)JT809ErrorCode.CRC16CheckInvalid}]校验码异常", $"{reader.CalculateCheckXorCode}!={reader.RealCheckXorCode}"); } } jT809Package.EndFlag = reader.ReadEnd(); writer.WriteNumber($"[{jT809Package.EndFlag.ReadNumber()}]结束标识", jT809Package.EndFlag); writer.WriteEndObject(); }