예제 #1
0
        public JT808Package Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            JT808Package jT808Package = new JT808Package();
            // 转义还原——>验证校验码——>解析消息
            // 1. 解码(转义还原)
            ReadOnlySpan <byte> buffer = JT808DeEscape(bytes, 0, bytes.Length);
            // 2. 验证校验码
            //  2.1. 获取校验位索引
            int checkIndex = buffer.Length - 2;

            //  2.2. 获取校验码
            jT808Package.CheckCode = buffer[checkIndex];
            //  2.3. 从消息头到校验码前一个字节
            byte checkCode = buffer.ToXor(1, checkIndex);

            //  2.4. 验证校验码
            if (jT808Package.CheckCode != checkCode)
            {
                throw new JT808Exception($"{jT808Package.CheckCode}!={checkCode}");
            }
            jT808Package.Begin = buffer[offset];
            offset             = offset + 1;
            // 3.初始化消息头
            try
            {
                jT808Package.Header = formatterResolver.GetFormatter <JT808Header>().Deserialize(buffer, offset, formatterResolver, out readSize);
            }
            catch (Exception ex)
            {
                throw new JT808Exception($"消息头解析错误,offset:{offset.ToString()}", ex);
            }
            offset = readSize;
            if (jT808Package.Header.MessageBodyProperty.DataLength != 0)
            {
                JT808BodiesTypeAttribute jT808BodiesTypeAttribute = jT808Package.Header.MsgId.GetAttribute <JT808BodiesTypeAttribute>();
                if (jT808BodiesTypeAttribute != null)
                {
                    if (jT808Package.Header.MessageBodyProperty.IsPackge)
                    {//4.分包消息体 从17位开始  或   未分包消息体 从13位开始
                     //消息总包数2位+包序号2位=4位
                        offset = offset + 2 + 2;
                    }
                    if (jT808Package.Header.MessageBodyProperty.DataLength != 0)
                    {
                        try
                        {
                            //5.处理消息体
                            jT808Package.Bodies = JT808FormatterResolverExtensions.JT808DynamicDeserialize(formatterResolver.GetFormatterDynamic(jT808BodiesTypeAttribute.JT808BodiesType), buffer.Slice(offset, jT808Package.Header.MessageBodyProperty.DataLength).ToArray(), offset, formatterResolver, out readSize);
                        }
                        catch (Exception ex)
                        {
                            throw new JT808Exception($"消息体解析错误,offset:{offset.ToString()}", ex);
                        }
                    }
                }
            }
            jT808Package.End = buffer[bytes.Length - 1];
            readSize         = buffer.Length;
            return(jT808Package);
        }
 public JT808_0x8103 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
 {
     int offset = 0;
     JT808_0x8103 jT808_0x8103 = new JT808_0x8103
     {
         ParamList = new List<JT808_0x8103_BodyBase>(),
         CustomParamList=new List<JT808_0x8103_CustomBodyBase>()
     };
     var paramCount = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);//参数总数
     for (int i = 0; i < paramCount; i++)
     {
         var paramId = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset);//参数ID
         int readSubBodySize = 0;
         if (JT808_0x8103_BodyBase.JT808_0x8103Method.TryGetValue(paramId, out Type type))
         {
             jT808_0x8103.ParamList.Add(JT808FormatterResolverExtensions.JT808DynamicDeserialize(JT808FormatterExtensions.GetFormatter(type), bytes.Slice(offset), out readSubBodySize));
         }
         else if(JT808GlobalConfig.Instance.JT808_0X8103_Custom_Factory.ParamMethods.TryGetValue(paramId, out Type customType))
         {
             jT808_0x8103.ParamList.Add(JT808FormatterResolverExtensions.JT808DynamicDeserialize(JT808FormatterExtensions.GetFormatter(customType), bytes.Slice(offset), out readSubBodySize));
         }
         offset = offset + readSubBodySize;
     }
     readSize = offset;
     return jT808_0x8103;
 }
예제 #3
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0200 value)
 {
     offset += JT808BinaryExtensions.WriteUInt32Little(bytes, offset, value.AlarmFlag);
     offset += JT808BinaryExtensions.WriteUInt32Little(bytes, offset, value.StatusFlag);
     offset += JT808BinaryExtensions.WriteInt32Little(bytes, offset, value.Lat);
     offset += JT808BinaryExtensions.WriteInt32Little(bytes, offset, value.Lng);
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.Altitude);
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.Speed);
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.Direction);
     offset += JT808BinaryExtensions.WriteDateTime6Little(bytes, offset, value.GPSTime);
     if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0)
     {
         foreach (var item in value.JT808LocationAttachData)
         {
             try
             {
                 object attachImplObj = JT808FormatterExtensions.GetFormatter(item.Value.GetType());
                 offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref bytes, offset, item.Value);
             }
             catch (Exception ex)
             {
             }
         }
     }
     return(offset);
 }
예제 #4
0
        public JT808_0x0104 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0104 jT808_0x0104 = new JT808_0x0104();

            jT808_0x0104.MsgNum            = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0x0104.AnswerParamsCount = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            for (int i = 0; i < jT808_0x0104.AnswerParamsCount; i++)
            {
                var paramId         = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset);//参数ID
                int readSubBodySize = 0;
                if (JT808_0x8103_BodyBase.JT808_0x8103Method.TryGetValue(paramId, out Type type))
                {
                    if (jT808_0x0104.ParamList != null)
                    {
                        jT808_0x0104.ParamList.Add(JT808FormatterResolverExtensions.JT808DynamicDeserialize(JT808FormatterExtensions.GetFormatter(type), bytes.Slice(offset), out readSubBodySize));
                    }
                    else
                    {
                        jT808_0x0104.ParamList = new List <JT808_0x8103_BodyBase> {
                            JT808FormatterResolverExtensions.JT808DynamicDeserialize(JT808FormatterExtensions.GetFormatter(type), bytes.Slice(offset), out readSubBodySize)
                        };
                    }
                }
                offset = offset + readSubBodySize;
            }
            readSize = offset;
            return(jT808_0x0104);
        }
예제 #5
0
        public int Serialize(ref byte[] bytes, int offset, JT808_0x0900 value)
        {
            offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.PassthroughType);
            object obj = JT808FormatterExtensions.GetFormatter(value.JT808_0x0900_BodyBase.GetType());

            offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset, value.JT808_0x0900_BodyBase);
            return(offset);
        }
예제 #6
0
        public int Serialize(IMemoryOwner <byte> memoryOwner, int offset, JT808_0x8900 value)
        {
            offset += JT808BinaryExtensions.WriteByteLittle(memoryOwner, offset, value.PassthroughType);
            object obj = JT808FormatterExtensions.GetFormatter(value.JT808_0X8900_BodyBase.GetType());

            offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, memoryOwner, offset, value);
            return(offset);
        }
예제 #7
0
        public int Serialize(ref byte[] bytes, int offset, JT808_0x0701 value)
        {
            object obj = JT808FormatterExtensions.GetFormatter(value.ElectronicContentObj.GetType());
            // 需要反着来,先序列化数据体(由于位置汇报数据体长度为4个字节,所以先偏移4个字节),再根据数据体的长度设置回去
            int tmpOffset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset + 4, value.ElectronicContentObj);

            JT808BinaryExtensions.WriteUInt32Little(bytes, offset, (ushort)(tmpOffset - offset - 4));
            offset = tmpOffset;
            return(offset);
        }
예제 #8
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x8900 value)
 {
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.PassthroughType);
     if (JT808_0x8900_BodyBase.JT808_0x8900Method.TryGetValue(value.PassthroughType, out Type type))
     {
         object obj = JT808FormatterExtensions.GetFormatter(type);
         offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset, value.JT808_0X8900_BodyBase);
     }
     return(offset);
 }
예제 #9
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x8103 value)
 {
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.ParamCount);
     foreach (var item in value.ParamList)
     {
         offset += JT808BinaryExtensions.WriteUInt32Little(bytes, offset, item.ParamId);
         object obj = JT808FormatterExtensions.GetFormatter(item.GetType());
         offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset, item);
     }
     return(offset);
 }
예제 #10
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0104 value, IJT808Config config)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.MsgNum);
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.AnswerParamsCount);
     foreach (var item in value.ParamList)
     {
         offset += JT808BinaryExtensions.WriteUInt32Little(bytes, offset, item.ParamId);
         object obj = JT808FormatterExtensions.GetFormatter(item.GetType());
         offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset, item, config);
     }
     return(offset);
 }
예제 #11
0
        public JT808_0x0900 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x0900 jT808_0x0900 = new JT808_0x0900();

            jT808_0x0900.PassthroughType = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            if (JT808_0x0900_BodyBase.JT808_0x0900Method.TryGetValue(jT808_0x0900.PassthroughType, out Type type))
            {
                jT808_0x0900.JT808_0x0900_BodyBase = JT808FormatterResolverExtensions.JT808DynamicDeserialize(formatterResolver.GetFormatterDynamic(type), bytes.Slice(offset), offset, formatterResolver, out readSize);
            }
            readSize = offset;
            return(jT808_0x0900);
        }
예제 #12
0
        public int Serialize(IMemoryOwner <byte> memoryOwner, int offset, JT808Package value)
        {
            // 1. 先判断是否分包(理论下发不需分包,但为了统一还是加上分包处理)
            // 2. 先序列化数据体,根据数据体的长度赋值给头部,在序列化头部。
            int messageBodyOffset = 0;

            if (value.Header.MessageBodyProperty.IsPackge)
            {   //3. 先写入分包消息总包数、包序号
                messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(memoryOwner, messageBodyOffset, value.Header.MessageBodyProperty.PackgeCount);
                messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(memoryOwner, messageBodyOffset, value.Header.MessageBodyProperty.PackageIndex);
            }
            // 4. 数据体
            //JT808.Protocol.Enums.JT808MsgId 映射对应消息特性
            JT808BodiesTypeAttribute jT808BodiesTypeAttribute = value.Header.MsgId.GetAttribute <JT808BodiesTypeAttribute>();

            if (jT808BodiesTypeAttribute != null)
            {
                if (value.Bodies != null)
                {
                    // 4.1 处理数据体
                    messageBodyOffset = JT808FormatterResolverExtensions.JT808DynamicSerialize(JT808FormatterExtensions.GetFormatter(jT808BodiesTypeAttribute.JT808BodiesType), memoryOwner, offset, value.Bodies);
                }
            }
            Memory <byte> messageBodyBytes = null;

            if (messageBodyOffset != 0)
            {
                messageBodyBytes = new Memory <byte>(new byte[messageBodyOffset]);
                memoryOwner.Memory.Slice(0, messageBodyOffset).CopyTo(messageBodyBytes);
            }
            // ------------------------------------开始组包
            // 1.起始符
            offset += JT808BinaryExtensions.WriteByteLittle(memoryOwner, offset, value.Begin);
            // 2.赋值头数据长度
            value.Header.MessageBodyProperty.DataLength = messageBodyOffset;
            offset = JT808FormatterExtensions.GetFormatter <JT808Header>().Serialize(memoryOwner, offset, value.Header);
            if (messageBodyOffset != 0)
            {
                JT808BinaryExtensions.CopyTo(messageBodyBytes.Span, memoryOwner.Memory.Span, offset);
                offset          += messageBodyOffset;
                messageBodyBytes = null;
            }
            // 4.校验码
            offset += JT808BinaryExtensions.WriteByteLittle(memoryOwner, offset, memoryOwner.Memory.Span.ToXor(1, offset));
            // 5.终止符
            offset += JT808BinaryExtensions.WriteByteLittle(memoryOwner, offset, value.End);
            byte[] temp = JT808Escape(memoryOwner.Memory.Slice(0, offset).Span);
            memoryOwner.Memory.Span.Clear();
            JT808BinaryExtensions.CopyTo(temp, memoryOwner.Memory.Span, 0);
            return(temp.Length);
        }
예제 #13
0
        public int Serialize(ref byte[] bytes, int offset, JT808_0x0701 value, IJT808Config config)
        {
            if (JT808_0x0701.JT808_0x0701Body.BodyImpl == null)
            {
                throw new JT808Exception(JT808ErrorCode.NotImplType, $"Not Impl {nameof(JT808_0x0701.JT808_0x0701Body)} class");
            }
            object obj = JT808FormatterExtensions.GetFormatter(JT808_0x0701.JT808_0x0701Body.BodyImpl);
            // 需要反着来,先序列化数据体(由于位置汇报数据体长度为4个字节,所以先偏移4个字节),再根据数据体的长度设置回去
            int tmpOffset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset + 4, value.ElectronicContent, config);

            JT808BinaryExtensions.WriteUInt32Little(bytes, offset, (ushort)(tmpOffset - offset - 4));
            offset = tmpOffset;
            return(offset);
        }
예제 #14
0
        public JT808_0x0701 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            if (JT808_0x0701.JT808_0x0701Body.BodyImpl == null)
            {
                throw new JT808Exception(JT808ErrorCode.NotImplType, $"Not Impl {nameof(JT808_0x0701.JT808_0x0701Body)} class");
            }
            int          offset       = 0;
            JT808_0x0701 jT808_0X0701 = new JT808_0x0701();

            jT808_0X0701.ElectronicWaybillLength = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset);
            jT808_0X0701.ElectronicContent       = JT808FormatterResolverExtensions.JT808DynamicDeserialize(JT808FormatterExtensions.GetFormatter(JT808_0x0701.JT808_0x0701Body.BodyImpl), bytes.Slice(offset, (int)jT808_0X0701.ElectronicWaybillLength), out int readSubBodySize);
            readSize = readSubBodySize;
            return(jT808_0X0701);
        }
예제 #15
0
        public int Serialize(ref byte[] bytes, int offset, JT808Package value)
        {
            // 1. 先判断是否分包(理论下发不需分包,但为了统一还是加上分包处理)
            // 2. 先序列化数据体,根据数据体的长度赋值给头部,在序列化头部。
            int messageBodyOffset = 0;

            if (value.Header.MessageBodyProperty.IsPackge)
            {   //3. 先写入分包消息总包数、包序号
                messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(bytes, messageBodyOffset, value.Header.MessageBodyProperty.PackgeCount);
                messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(bytes, messageBodyOffset, value.Header.MessageBodyProperty.PackageIndex);
            }
            // 4. 数据体
            Type jT808BodiesImplType = JT808MsgIdFactory.GetBodiesImplTypeByMsgId(value.Header.MsgId);

            if (jT808BodiesImplType != null)
            {
                if (value.Bodies != null)
                {
                    if (!value.Bodies.SkipSerialization)
                    {
                        // 4.1 处理数据体
                        messageBodyOffset = JT808FormatterResolverExtensions.JT808DynamicSerialize(JT808FormatterExtensions.GetFormatter(jT808BodiesImplType), ref bytes, offset, value.Bodies);
                    }
                }
            }
            byte[] messageBodyBytes = null;
            if (messageBodyOffset != 0)
            {
                messageBodyBytes = new byte[messageBodyOffset];
                Array.Copy(bytes, 0, messageBodyBytes, 0, messageBodyOffset);
            }
            // ------------------------------------开始组包
            // 1.起始符
            offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.Begin);
            // 2.赋值头数据长度
            value.Header.MessageBodyProperty.DataLength = messageBodyOffset;
            offset = JT808FormatterExtensions.GetFormatter <JT808Header>().Serialize(ref bytes, offset, value.Header);
            if (messageBodyOffset != 0)
            {
                Array.Copy(messageBodyBytes, 0, bytes, offset, messageBodyOffset);
                offset          += messageBodyOffset;
                messageBodyBytes = null;
            }
            // 4.校验码
            offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, bytes.ToXor(1, offset));
            // 5.终止符
            offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.End);
            return(JT808Utils.JT808Escape(ref bytes, offset));
        }
예제 #16
0
        public int Serialize(ref byte[] bytes, int offset, JT808Package value, IJT808FormatterResolver formatterResolver)
        {
            // 1. 先判断是否分包(理论下发不需分包,但为了统一还是加上分包处理)
            // 2. 先序列化数据体,根据数据体的长度赋值给头部,在序列化头部。
            int messageBodyOffset = 0;

            if (value.Header.MessageBodyProperty.IsPackge)
            {   //3. 先写入分包消息总包数、包序号
                messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, messageBodyOffset, value.Header.MessageBodyProperty.PackgeCount);
                messageBodyOffset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, messageBodyOffset, value.Header.MessageBodyProperty.PackageIndex);
            }
            // 4. 数据体
            //JT808.Protocol.Enums.JT808MsgId 映射对应消息特性
            JT808BodiesTypeAttribute jT808BodiesTypeAttribute = value.Header.MsgId.GetAttribute <JT808BodiesTypeAttribute>();

            if (jT808BodiesTypeAttribute != null)
            {
                if (value.Bodies != null)
                {
                    // 4.1 处理数据体
                    messageBodyOffset = JT808FormatterResolverExtensions.JT808DynamicSerialize(formatterResolver.GetFormatterDynamic(jT808BodiesTypeAttribute.JT808BodiesType), ref bytes, offset, value.Bodies, formatterResolver);
                }
            }
            byte[] messageBodyBytes = null;
            if (messageBodyOffset != 0)
            {
                messageBodyBytes = bytes.AsSpan().Slice(0, messageBodyOffset).ToArray();
            }
            // ------------------------------------开始组包
            // 1.起始符
            offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Begin);
            // 2.赋值头数据长度
            value.Header.MessageBodyProperty.DataLength = messageBodyOffset;
            offset = formatterResolver.GetFormatter <JT808Header>().Serialize(ref bytes, offset, value.Header, formatterResolver);
            if (messageBodyOffset != 0)
            {
                Buffer.BlockCopy(messageBodyBytes, 0, bytes, offset, messageBodyOffset);
                offset += messageBodyOffset;
            }
            // 4.校验码
            offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, bytes.ToXor(1, offset));
            // 5.终止符
            offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.End);
            byte[] temp = JT808Escape(bytes.AsSpan().Slice(0, offset));
            Buffer.BlockCopy(temp, 0, bytes, 0, temp.Length);
            return(temp.Length);
        }
예제 #17
0
        public JT808_0x0900 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0900 jT808_0X0900 = new JT808_0x0900();

            jT808_0X0900.PassthroughType = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            Type jT808PassthroughType;

            if (JT808_0x0900_BodyBase.JT808_0x0900Method.TryGetValue(jT808_0X0900.PassthroughType, out jT808PassthroughType))
            {
                object obj = JT808FormatterExtensions.GetFormatter(jT808PassthroughType);
                ReadOnlySpan <byte> passthroughTypeBuffer = bytes.Slice(offset, bytes.Length - offset);
                dynamic             objImpl = JT808FormatterResolverExtensions.JT808DynamicDeserialize(obj, passthroughTypeBuffer, out readSize);
                jT808_0X0900.JT808_0x0900_BodyBase = objImpl;
            }
            readSize = bytes.Length;//读取整个数据体
            return(jT808_0X0900);
        }
예제 #18
0
        public JT808_0x8103 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x8103 jT808_0x8103 = new JT808_0x8103();

            jT808_0x8103.ParamList = new List <JT808_0x8103_BodyBase>();
            var paramCount = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);//参数总数

            for (int i = 0; i < paramCount; i++)
            {
                var paramId         = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset);//参数ID
                int readSubBodySize = 0;
                if (JT808_0x8103_BodyBase.JT808_0x8103Method.TryGetValue(paramId, out Type type))
                {
                    jT808_0x8103.ParamList.Add(JT808FormatterResolverExtensions.JT808DynamicDeserialize(JT808FormatterExtensions.GetFormatter(type), bytes.Slice(offset), out readSubBodySize));
                }
                offset = offset + readSubBodySize;
            }
            readSize = offset;
            return(jT808_0x8103);
        }
예제 #19
0
        public JT808Package Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808Package jT808Package = new JT808Package();
            // 转义还原——>验证校验码——>解析消息
            // 1. 解码(转义还原)
            ReadOnlySpan <byte> buffer = JT808Utils.JT808DeEscape(bytes);
            // 2. 验证校验码
            //  2.1. 获取校验位索引
            int checkIndex = buffer.Length - 2;

            //  2.2. 获取校验码
            jT808Package.CheckCode = buffer[checkIndex];
            //  2.3. 从消息头到校验码前一个字节
            byte checkCode = buffer.ToXor(1, checkIndex);

            //  2.4. 验证校验码
            if (!JT808GlobalConfig.Instance.SkipCRCCode)
            {
                if (jT808Package.CheckCode != checkCode)
                {
                    throw new JT808Exception(JT808ErrorCode.CheckCodeNotEqual, $"{jT808Package.CheckCode}!={checkCode}");
                }
            }
            jT808Package.Begin = buffer[offset];
            offset             = offset + 1;
            // 3.初始化消息头
            try
            {
                jT808Package.Header = JT808FormatterExtensions.GetFormatter <JT808Header>().Deserialize(buffer.Slice(offset), out readSize);
            }
            catch (Exception ex)
            {
                throw new JT808Exception(JT808ErrorCode.HeaderParseError, ex);
            }
            offset = readSize;
            if (jT808Package.Header.MessageBodyProperty.DataLength != 0)
            {
                Type jT808BodiesImplType = JT808MsgIdFactory.GetBodiesImplTypeByMsgId(jT808Package.Header.MsgId);
                if (jT808BodiesImplType != null)
                {
                    //4.分包消息体 从17位开始  或   未分包消息体 从13位开始
                    if (jT808Package.Header.MessageBodyProperty.IsPackge)
                    {
                        //消息总包数2位+包序号2位=4位
                        offset = offset + 2 + 2;
                        if (jT808Package.Header.MessageBodyProperty.PackageIndex > 1)
                        {
                            try
                            {
                                //5.处理第二包之后的分包数据消息体
                                jT808Package.Bodies = JT808FormatterResolverExtensions.JT808DynamicDeserialize(
                                    JT808FormatterExtensions.GetFormatter(typeof(JT808SplitPackageBodies)),
                                    buffer.Slice(offset + 1, jT808Package.Header.MessageBodyProperty.DataLength),
                                    out readSize);
                            }
                            catch (Exception ex)
                            {
                                throw new JT808Exception(JT808ErrorCode.BodiesParseError, ex);
                            }
                        }
                        else
                        {
                            try
                            {
                                //5.处理消息体
                                jT808Package.Bodies = JT808FormatterResolverExtensions.JT808DynamicDeserialize(
                                    JT808FormatterExtensions.GetFormatter(jT808BodiesImplType),
                                    buffer.Slice(offset + 1, jT808Package.Header.MessageBodyProperty.DataLength),
                                    out readSize);
                            }
                            catch (Exception ex)
                            {
                                throw new JT808Exception(JT808ErrorCode.BodiesParseError, ex);
                            }
                        }
                    }
                    else
                    {
                        try
                        {
                            //5.处理消息体
                            jT808Package.Bodies = JT808FormatterResolverExtensions.JT808DynamicDeserialize(
                                JT808FormatterExtensions.GetFormatter(jT808BodiesImplType),
                                buffer.Slice(offset + 1, jT808Package.Header.MessageBodyProperty.DataLength),
                                out readSize);
                        }
                        catch (Exception ex)
                        {
                            throw new JT808Exception(JT808ErrorCode.BodiesParseError, ex);
                        }
                    }
                }
            }
            jT808Package.End = buffer[buffer.Length - 1];
            readSize         = buffer.Length;
            return(jT808Package);
        }
예제 #20
0
        public JT808_0x0200 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0200 jT808_0X0200 = new JT808_0x0200
            {
                AlarmFlag  = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset),
                StatusFlag = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset),
                Lat        = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset),
                Lng        = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset)
            };
            JT808StatusProperty jT808StatusProperty = new JT808StatusProperty(Convert.ToString(jT808_0X0200.StatusFlag, 2).PadLeft(32, '0'));

            if (jT808StatusProperty.Bit28 == '1')//西经
            {
                jT808_0X0200.Lng = -jT808_0X0200.Lng;
            }
            if (jT808StatusProperty.Bit29 == '1')//南纬
            {
                jT808_0X0200.Lat = -jT808_0X0200.Lat;
            }
            jT808_0X0200.Altitude  = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0200.Speed     = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0200.Direction = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0200.GPSTime   = JT808BinaryExtensions.ReadDateTime6Little(bytes, ref offset);
            // 位置附加信息
            jT808_0X0200.JT808LocationAttachData = new Dictionary <byte, JT808_0x0200_BodyBase>();
            jT808_0X0200.JT808CustomLocationAttachOriginalData = new Dictionary <byte, byte[]>();
            if (bytes.Length > 28)
            {
                int attachOffset = 0;
                ReadOnlySpan <byte> locationAttachMemory = bytes;
                ReadOnlySpan <byte> locationAttachSpan   = locationAttachMemory.Slice(28);
                while (locationAttachSpan.Length > attachOffset)
                {
                    int attachId  = 1;
                    int attachLen = 1;
                    try
                    {
                        Type jT808LocationAttachType;
                        if (JT808_0x0200_BodyBase.JT808LocationAttachMethod.TryGetValue(locationAttachSpan[attachOffset], out jT808LocationAttachType))
                        {
                            int attachContentLen             = locationAttachSpan[attachOffset + 1];
                            int locationAttachTotalLen       = attachId + attachLen + attachContentLen;
                            ReadOnlySpan <byte> attachBuffer = locationAttachSpan.Slice(attachOffset, locationAttachTotalLen);
                            object  attachImplObj            = JT808FormatterExtensions.GetFormatter(jT808LocationAttachType);
                            dynamic attachImpl = JT808FormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, attachBuffer, out readSize);
                            attachOffset = attachOffset + locationAttachTotalLen;
                            jT808_0X0200.JT808LocationAttachData.Add(attachImpl.AttachInfoId, attachImpl);
                        }
                        else if (JT808_0x0200_CustomBodyBase.CustomAttachIds.Contains(locationAttachSpan[attachOffset]))
                        {
                            int attachContentLen             = locationAttachSpan[attachOffset + 1];
                            int locationAttachTotalLen       = attachId + attachLen + attachContentLen;
                            ReadOnlySpan <byte> attachBuffer = locationAttachSpan.Slice(attachOffset, locationAttachTotalLen);
                            jT808_0X0200.JT808CustomLocationAttachOriginalData.Add(locationAttachSpan[attachOffset], attachBuffer.ToArray());
                            attachOffset = attachOffset + locationAttachTotalLen;
                        }
                        else
                        {
                            int attachContentLen       = locationAttachSpan[attachOffset + 1];
                            int locationAttachTotalLen = attachId + attachLen + attachContentLen;
                            attachOffset = attachOffset + locationAttachTotalLen;
                        }
                    }
                    catch (Exception)
                    {
                        int attachContentLen       = locationAttachSpan[attachOffset + 1];
                        int locationAttachTotalLen = attachId + attachLen + attachContentLen;
                        attachOffset = attachOffset + locationAttachTotalLen;
                    }
                }
                offset = offset + attachOffset;
            }
            readSize = offset;
            return(jT808_0X0200);
        }
예제 #21
0
        public static dynamic Deserialize(ReadOnlySpan <byte> bytes, Type type)
        {
            var formatter = JT808FormatterExtensions.GetFormatter(type);

            return(JT808FormatterResolverExtensions.JT808DynamicDeserialize(formatter, bytes, out _));
        }