Ejemplo n.º 1
0
        /// <summary>
        /// 用于负载或者分布式的时候,在网关只需要解到头部。
        /// 根据头部的消息Id进行分发处理,可以防止小部分性能损耗。
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static JT808HeaderPackage HeaderDeserialize(ReadOnlySpan <byte> bytes)
        {
            var formatter = JT808FormatterExtensions.GetFormatter <JT808HeaderPackage>();
            int readSize;

            return(formatter.Deserialize(bytes, out readSize));
        }
        public JT808_0x0704 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0704 jT808_0X0704 = new JT808_0x0704
            {
                Count        = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset),
                LocationType = (JT808_0x0704.BatchLocationType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset)
            };
            List <JT808_0x0200> jT808_0X0200s = new List <JT808_0x0200>();
            int bufReadSize;

            for (int i = 0; i < jT808_0X0704.Count; i++)
            {
                int buflen = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
                //offset = offset + 2;
                try
                {
                    JT808_0x0200 jT808_0X0200 = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset, buflen), out bufReadSize);
                    jT808_0X0200s.Add(jT808_0X0200);
                }
                catch (Exception)
                {
                }
                offset = offset + buflen;
            }
            jT808_0X0704.Positions = jT808_0X0200s;
            readSize = offset;
            return(jT808_0X0704);
        }
Ejemplo n.º 3
0
        public JT808_0x0802 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0802 JT808_0x0802 = new JT808_0x0802
            {
                MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset),
                MultimediaItemCount   = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset),
                MultimediaSearchItems = new List <JT808Properties.JT808MultimediaSearchProperty>()
            };
            int bufReadSize;

            for (var i = 0; i < JT808_0x0802.MultimediaItemCount; i++)
            {
                JT808Properties.JT808MultimediaSearchProperty jT808MultimediaSearchProperty = new JT808Properties.JT808MultimediaSearchProperty
                {
                    MultimediaId    = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset),
                    MultimediaType  = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset),
                    ChannelId       = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset),
                    EventItemCoding = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset),
                    Position        = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset, 28), out bufReadSize)
                };
                offset += 28;
                JT808_0x0802.MultimediaSearchItems.Add(jT808MultimediaSearchProperty);
            }
            readSize = offset;
            return(JT808_0x0802);
        }
Ejemplo n.º 4
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);
 }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
0
        public static byte[] Serialize <T>(T obj)
        {
            var formatter = JT808FormatterExtensions.GetFormatter <T>();
            var pool      = MemoryPool <byte> .Shared;
            IMemoryOwner <byte> buffer = pool.Rent(10240);

            try
            {
                var len = formatter.Serialize(buffer, 0, obj);
                return(buffer.Memory.Slice(0, len).ToArray());
            }
            catch (JT808Exception ex)
            {
                throw new JT808Exception("Serialize", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Serialize", ex);
            }
            finally
            {
                // 源码:System.Memory.MemoryPool
                // private static readonly MemoryPool<T> s_shared = new ArrayMemoryPool<T>();
                // 单例内存池 不需要手动释放资源
                buffer.Dispose();
            }
        }
Ejemplo n.º 7
0
        public static T Deserialize <T>(ReadOnlySpan <byte> bytes)
        {
            var formatter = JT808FormatterExtensions.GetFormatter <T>();
            int readSize;

            return(formatter.Deserialize(bytes, out readSize));
        }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
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);
        }
Ejemplo n.º 10
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);
        }
Ejemplo n.º 11
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);
 }
Ejemplo n.º 12
0
        public JT808_0x0201 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0201 jT808_0X0201 = new JT808_0x0201();

            jT808_0X0201.MsgNum   = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0201.Position = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset), out readSize);
            readSize = offset;
            return(jT808_0X0201);
        }
Ejemplo n.º 13
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);
 }
Ejemplo n.º 14
0
        public JT808_0x0500 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0500 jT808_0X0500 = new JT808_0x0500
            {
                MsgNum       = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset),
                JT808_0x0200 = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset), out readSize)
            };

            readSize = offset;
            return(jT808_0X0500);
        }
Ejemplo n.º 15
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0801 value, IJT808Config config)
 {
     offset += JT808BinaryExtensions.WriteUInt32Little(bytes, offset, value.MultimediaId);
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.MultimediaType);
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.MultimediaCodingFormat);
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.EventItemCoding);
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, value.ChannelId);
     _       = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Serialize(ref bytes, offset, value.Position, config);
     offset += 28;
     offset += JT808BinaryExtensions.WriteBytesLittle(bytes, offset, value.MultimediaDataPackage);
     return(offset);
 }
Ejemplo n.º 16
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);
 }
Ejemplo n.º 17
0
 public static T Deserialize <T>(ReadOnlySpan <byte> bytes)
 {
     try
     {
         var formatter = JT808FormatterExtensions.GetFormatter <T>();
         int readSize;
         return(formatter.Deserialize(bytes, out readSize));
     }
     catch (Exception ex)
     {
         throw new Exception("Deserialize", ex);
     }
 }
Ejemplo n.º 18
0
 public static byte[] Serialize(JT808Package jT808Package, int minBufferSize = 1024)
 {
     byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
     try
     {
         var len = JT808FormatterExtensions.GetFormatter <JT808Package>().Serialize(ref buffer, 0, jT808Package);
         return(buffer.AsSpan(0, len).ToArray());
     }
     finally
     {
         JT808ArrayPool.Return(buffer);
     }
 }
Ejemplo n.º 19
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);
        }
Ejemplo n.º 20
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);
        }
Ejemplo n.º 21
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));
        }
Ejemplo n.º 22
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0802 value)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.MsgNum);
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, (ushort)value.MultimediaSearchItems.Count);
     foreach (var item in value.MultimediaSearchItems)
     {
         offset += JT808BinaryExtensions.WriteUInt32Little(bytes, offset, item.MultimediaId);
         offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, item.MultimediaType);
         offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, item.ChannelId);
         offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, item.EventItemCoding);
         int positionOffset = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Serialize(ref bytes, offset, item.Position);
         offset += 28;
     }
     return(offset);
 }
Ejemplo n.º 23
0
        public static byte[] Serialize <T>(T obj, int minBufferSize = 1024)
        {
            var formatter = JT808FormatterExtensions.GetFormatter <T>();

            byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
            try
            {
                var len = formatter.Serialize(ref buffer, 0, obj);
                return(buffer.AsSpan(0, len).ToArray());
            }
            finally
            {
                JT808ArrayPool.Return(buffer);
            }
        }
Ejemplo n.º 24
0
        public JT808_0x0801 Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int          offset       = 0;
            JT808_0x0801 jT808_0X0801 = new JT808_0x0801();

            jT808_0X0801.MultimediaId           = JT808BinaryExtensions.ReadUInt32Little(bytes, ref offset);
            jT808_0X0801.MultimediaType         = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X0801.MultimediaCodingFormat = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X0801.EventItemCoding        = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X0801.ChannelId = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X0801.Position  = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset), out int bufReadSize);
            offset += 28;
            jT808_0X0801.MultimediaDataPackage = JT808BinaryExtensions.ReadBytesLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X0801);
        }
Ejemplo n.º 25
0
 public int Serialize(IMemoryOwner <byte> memoryOwner, int offset, JT808Header value)
 {
     // 1.消息ID
     offset += JT808BinaryExtensions.WriteUInt16Little(memoryOwner, offset, (ushort)value.MsgId);
     //2.消息体属性
     offset = JT808FormatterExtensions.GetFormatter <JT808HeaderMessageBodyProperty>().Serialize(memoryOwner, offset, value.MessageBodyProperty);
     // 3.终端手机号 (写死大陆手机号码)
     offset += JT808BinaryExtensions.WriteBCDLittle(memoryOwner, offset, value.TerminalPhoneNo, 6, 12);
     //消息流水号
     offset += JT808BinaryExtensions.WriteUInt16Little(memoryOwner, offset, value.MsgNum);
     if (value.MessageBodyProperty.IsPackge)
     {
         //消息总包数2位+包序号2位=4位
         offset += 4;
     }
     return(offset);
 }
Ejemplo n.º 26
0
        public JT808Header Deserialize(ReadOnlySpan <byte> bytes, out int readSize)
        {
            int         offset      = 0;
            JT808Header jT808Header = new JT808Header();

            // 1.消息ID
            jT808Header.MsgId = (JT808MsgId)JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            // 2.消息体属性
            jT808Header.MessageBodyProperty = JT808FormatterExtensions.GetFormatter <JT808HeaderMessageBodyProperty>().Deserialize(bytes.Slice(offset), out readSize);
            offset += readSize;
            // 3.终端手机号 (写死大陆手机号码)
            jT808Header.TerminalPhoneNo = JT808BinaryExtensions.ReadBCD(bytes, ref offset, 6).ToString();
            // 4.消息流水号
            jT808Header.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            readSize           = offset;
            return(jT808Header);
        }
Ejemplo n.º 27
0
 public int Serialize(ref byte[] bytes, int offset, JT808Header value, IJT808Config config)
 {
     // 1.消息ID
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.MsgId);
     //2.消息体属性
     offset = JT808FormatterExtensions.GetFormatter <JT808HeaderMessageBodyProperty>().Serialize(ref bytes, offset, value.MessageBodyProperty, config);
     // 3.终端手机号 (写死大陆手机号码)
     offset += JT808BinaryExtensions.WriteBCDLittle(bytes, offset, value.TerminalPhoneNo, 12);
     //消息流水号
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.MsgNum);
     if (value.MessageBodyProperty.IsPackge)
     {
         //消息总包数2位+包序号2位=4位
         offset += 4;
     }
     return(offset);
 }
Ejemplo n.º 28
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);
        }
Ejemplo n.º 29
0
        public JT808Header Deserialize(ReadOnlySpan <byte> bytes, out int readSize, IJT808Config config)
        {
            int         offset      = 0;
            JT808Header jT808Header = new JT808Header
            {
                // 1.消息ID
                MsgId = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset),
                // 2.消息体属性
                MessageBodyProperty = JT808FormatterExtensions.GetFormatter <JT808HeaderMessageBodyProperty>().Deserialize(bytes.Slice(offset), out readSize, config)
            };

            offset += readSize;
            // 3.终端手机号 (写死大陆手机号码)
            jT808Header.TerminalPhoneNo = JT808BinaryExtensions.ReadBCDLittle(bytes, ref offset, 12);
            // 4.消息流水号
            jT808Header.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            readSize           = offset;
            return(jT808Header);
        }
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0704 value)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(bytes, offset, value.Count);
     offset += JT808BinaryExtensions.WriteByteLittle(bytes, offset, (byte)value.LocationType);
     foreach (var item in value?.Positions)
     {
         try
         {
             // 需要反着来,先序列化数据体(由于位置汇报数据体长度为2个字节,所以先偏移2个字节),再根据数据体的长度设置回去
             int positionOffset = JT808FormatterExtensions.GetFormatter <JT808_0x0200>().Serialize(ref bytes, offset + 2, item);
             JT808BinaryExtensions.WriteUInt16Little(bytes, offset, (ushort)(positionOffset - offset - 2));
             offset = positionOffset;
         }
         catch (Exception)
         {
         }
     }
     return(offset);
 }