예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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();
        }