public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { var value = new JT809_0x1200_0x120E(); var virtualHex = reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength()); value.DRVLine = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]路线信息", value.DRVLine); }
public JT809_0x1600_0x1602 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { var value = new JT809_0x1600_0x1602(); value.DRVLine = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); return(value); }
public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { JT809_0x9200_0x9204 value = new JT809_0x9200_0x9204(); var virtualHex = reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength()); value.CarInfo = reader.ReadRemainStringContent(); writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车辆信息", value.CarInfo); }
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 JT809_JT1078_0x9800_0x9801 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_JT1078_0x9800_0x9801 value = new JT809_JT1078_0x9800_0x9801(); value.ChannelId = reader.ReadByte(); value.AVitemType = reader.ReadByte(); value.AuthorizeCode = reader.ReadString(64); if (reader.ReadCurrentRemainContentLength() > 0) { value.GnssData = reader.ReadArray(36).ToArray(); } return(value); }
public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { JT809_0x1600_0x1601 value = new JT809_0x1600_0x1601(); if (config.Version == JT809Version.JTT2019) { value.SourceDataType = reader.ReadUInt16(); writer.WriteString($"[{value.SourceDataType.ReadNumber()}]对应启动车辆定位信息交换请求消息源子业务类型标识", ((JT809SubBusinessType)value.SourceDataType).ToString()); value.SourceMsgSn = reader.ReadUInt32(); writer.WriteNumber($"[{value.SourceMsgSn.ReadNumber()}对应启动车辆定位信息交换请求消息源报文序列号]", value.SourceMsgSn); } var virtualHex = reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength()); value.CarInfo = reader.ReadRemainStringContent(); writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]车辆信息", value.CarInfo); }
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 void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { JT809_JT1078_0x9800_0x9801 value = new JT809_JT1078_0x9800_0x9801(); value.ChannelId = reader.ReadByte(); writer.WriteString($"[{value.ChannelId.ReadNumber()}]逻辑通道号", LogicalChannelNoDisplay(value.ChannelId)); value.AVitemType = reader.ReadByte(); writer.WriteString($"[{value.AVitemType.ReadNumber()}]音视频资源类型", AVResourceTypeDisplay(value.AVitemType)); var virtualHex = reader.ReadVirtualArray(64); value.AuthorizeCode = reader.ReadString(64); writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]时效口令", value.AuthorizeCode); if (reader.ReadCurrentRemainContentLength() >= 36) { value.GnssData = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray(); writer.WriteString($"[车辆进入跨域地区后5min之内的任何位置]", value.GnssData.ToHexString()); } string LogicalChannelNoDisplay(byte LogicalChannelNo) { switch (LogicalChannelNo) { case 1: return("驾驶员"); case 2: return("车辆正前方"); case 3: return("车前门"); case 4: return("车厢前部"); case 5: return("车厢后部"); case 7: return("行李舱"); case 8: return("车辆左侧"); case 9: return("车辆右侧"); case 10: return("车辆正后方"); case 11: return("车厢中部"); case 12: return("车中门"); case 13: return("驾驶席车门"); case 33: return("驾驶员"); case 36: return("车厢前部"); case 37: return("车厢后部"); default: return("预留"); } } string AVResourceTypeDisplay(byte AVResourceType) { switch (AVResourceType) { case 0: return("音视频"); case 1: return("音频"); case 2: return("视频"); default: break; } return("未知"); } }
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(); }