Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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());
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        public JT808SplitPackageBodies Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808SplitPackageBodies jT808SplitPackageBodies = new JT808SplitPackageBodies
            {
                Data = reader.ReadContent().ToArray()
            };

            return(jT808SplitPackageBodies);
        }
Ejemplo n.º 5
0
        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());
        }
Ejemplo n.º 6
0
        /// <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());
            }
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        /// <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);
        }
Ejemplo n.º 10
0
        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());
        }
Ejemplo n.º 11
0
        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();
        }
Ejemplo n.º 12
0
        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;
        }