public int Serialize(ref byte[] bytes, int offset, JT808_0x0001 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.MsgNum);
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, (ushort)value.MsgId);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.JT808TerminalResult);
     return(offset);
 }
Beispiel #2
0
        public static byte[] Serialize(JT808Package jT808Package, IJT808FormatterResolver resolver)
        {
            if (resolver == null)
            {
                resolver = DefaultResolver;
            }
            var formatter = resolver.GetFormatter <JT808Package>();
            // ref https://www.cnblogs.com/TianFang/p/9193881.html
            var pool = ArrayPool <byte> .Shared;

            byte[] buffer = pool.Rent(65536);
            try
            {
                var len = formatter.Serialize(ref buffer, 0, jT808Package, DefaultResolver);
                return(buffer.AsSpan().Slice(0, len).ToArray());
            }
            catch (JT808Exception ex)
            {
                throw new JT808Exception("Serialize", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Serialize", ex);
            }
            finally
            {
                pool.Return(buffer, true);
            }
        }
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0200 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.AlarmFlag);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.StatusFlag);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Lat);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Lng);
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Altitude);
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Speed);
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Direction);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.GPSTime);
     if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0)
     {
         foreach (var item in value.JT808LocationAttachData)
         {
             try
             {
                 object attachImplObj = formatterResolver.GetFormatterDynamic(item.Value.GetType());
                 offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref bytes, offset, item.Value, formatterResolver);
             }
             catch (Exception ex)
             {
             }
         }
     }
     return(offset);
 }
        public JT808_0x0704 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x0704 jT808_0X0704 = new JT808_0x0704();

            jT808_0X0704.Count        = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0704.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 = formatterResolver.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset, buflen), offset, formatterResolver, out bufReadSize);
                    jT808_0X0200s.Add(jT808_0X0200);
                }
                catch (Exception ex)
                {
                }
                offset = offset + buflen;
            }
            jT808_0X0704.Positions = jT808_0X0200s;
            readSize = offset;
            return(jT808_0X0704);
        }
Beispiel #5
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);
        }
Beispiel #6
0
        public int Serialize(ref byte[] bytes, int offset, JT808_0x0900 value, IJT808FormatterResolver formatterResolver)
        {
            offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.PassthroughType);
            object obj = formatterResolver.GetFormatterDynamic(value.JT808_0x0900_BodyBase.GetType());

            offset = JT808FormatterResolverExtensions.JT808DynamicSerialize(obj, ref bytes, offset, value, formatterResolver);
            return(offset);
        }
Beispiel #7
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x8804 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.RecordCmd);
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.RecordTime);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.RecordSave);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.AudioSampleRate);
     return(offset);
 }
Beispiel #8
0
        public JT808_0x8500 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x8500 jT808_0X8500 = new JT808_0x8500();

            jT808_0X8500.ControlFlag = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X8500);
        }
        public JT808_0x0102 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x0102 jT808_0X0102 = new JT808_0x0102();

            jT808_0X0102.Code = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset);
            readSize          = offset;
            return(jT808_0X0102);
        }
Beispiel #10
0
        public JT808_0x8805 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x8805 jT808_0X8805 = new JT808_0x8805();

            jT808_0X8805.MultimediaId = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset);
            jT808_0X8805.Deleted      = (JT808MultimediaDeleted)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X8805);
        }
        public JT808_0x0108 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x0108 jT808_0X0108 = new JT808_0x0108();

            jT808_0X0108.UpgradeType   = (JT808UpgradeType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X0108.UpgradeResult = (JT808UpgradeResult)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X0108);
        }
        public JT808_0x0500 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x0500 jT808_0X0500 = new JT808_0x0500();

            jT808_0X0500.MsgNum       = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0500.JT808_0x0200 = formatterResolver.GetFormatter <JT808_0x0200>().Deserialize(bytes.Slice(offset), offset, formatterResolver, out readSize);
            readSize = offset;
            return(jT808_0X0500);
        }
Beispiel #13
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x8108 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.UpgradeType);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.MakerId.PadRight(5, '0'));
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.VersionNum.Length);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.VersionNum);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.UpgradePackage.Length);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.UpgradePackage);
     return(offset);
 }
Beispiel #14
0
        public JT808_0x8202 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x8202 jT808_0X8202 = new JT808_0x8202();

            jT808_0X8202.Interval = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X8202.LocationTrackingValidity = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset);
            readSize = offset;
            return(jT808_0X8202);
        }
 public int Serialize(ref byte[] bytes, int offset, JT808_0x8100 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.MsgNum);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.JT808TerminalRegisterResult);
     // 只有在成功后才有该字段
     if (value.JT808TerminalRegisterResult == JT808TerminalRegisterResult.成功)
     {
         offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Code);
     }
     return(offset);
 }
Beispiel #16
0
        public JT808_0x8400 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x8400 jT808_0X8400 = new JT808_0x8400();

            jT808_0X8400.CallBack = (JT808CallBackType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            // 最长为 20 字节
            jT808_0X8400.PhoneNumber = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X8400);
        }
        public JT808_0x0001 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x0001 jT808_0X0001 = new JT808_0x0001();

            jT808_0X0001.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0001.MsgId  = (JT808MsgId)JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0001.JT808TerminalResult = (JT808TerminalResult)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X0001);
        }
Beispiel #18
0
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0100 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.AreaID);
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.CityOrCountyId);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.MakerId.PadRight(5, '0'));
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalModel.PadRight(20, '0'));
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalId.PadRight(7, '0'));
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.PlateColor);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.PlateNo);
     return(offset);
 }
Beispiel #19
0
        public JT808_0x8804 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x8804 jT808_0X8804 = new JT808_0x8804();

            jT808_0X8804.RecordCmd       = (JT808RecordCmd)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X8804.RecordTime      = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X8804.RecordSave      = (JT808RecordSave)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X8804.AudioSampleRate = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X8804);
        }
Beispiel #20
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);
        }
 public int Serialize(ref byte[] bytes, int offset, JT808_0x8401 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.SettingTelephoneBook);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.JT808ContactProperties.Count);
     foreach (var item in value.JT808ContactProperties)
     {
         offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)item.TelephoneBookContactType);
         offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)item.PhoneNumber.Length);
         offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, item.PhoneNumber);
         offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)item.Contact.Length);
         offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, item.Contact);
     }
     return(offset);
 }
Beispiel #22
0
        public JT808_0x8108 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x8108 jT808_0X8108 = new JT808_0x8108();

            jT808_0X8108.UpgradeType          = (JT808UpgradeType)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X8108.MakerId              = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 5);
            jT808_0X8108.VersionNumLength     = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X8108.VersionNum           = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, jT808_0X8108.VersionNumLength);
            jT808_0X8108.UpgradePackageLength = JT808BinaryExtensions.ReadInt32Little(bytes, ref offset);
            jT808_0X8108.UpgradePackage       = JT808BinaryExtensions.ReadBytesLittle(bytes, ref offset, jT808_0X8108.UpgradePackageLength);
            readSize = offset;
            return(jT808_0X8108);
        }
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0107 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.TerminalType);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.MakerId.PadRight(5, '0'));
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalModel.PadRight(20, '0'));
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.TerminalId.PadRight(7, '0'));
     offset += JT808BinaryExtensions.WriteBCDLittle(ref bytes, offset, value.Terminal_SIM_ICCID, 5, 10);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.Terminal_Hardware_Version_Num.Length);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Terminal_Hardware_Version_Num);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.Terminal_Firmware_Version_Num.Length);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.Terminal_Firmware_Version_Num);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.GNSSModule);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, value.CommunicationModule);
     return(offset);
 }
Beispiel #24
0
        public JT808_0x0100 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x0100 jT808_0X0100 = new JT808_0x0100();

            jT808_0X0100.AreaID         = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0100.CityOrCountyId = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X0100.MakerId        = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 5);
            jT808_0X0100.TerminalModel  = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 20);
            jT808_0X0100.TerminalId     = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset, 7);
            jT808_0X0100.PlateColor     = JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            jT808_0X0100.PlateNo        = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset);
            readSize = offset;
            return(jT808_0X0100);
        }
        public JT808_0x8100 Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            offset = 0;
            JT808_0x8100 jT808_0X8100 = new JT808_0x8100();

            jT808_0X8100.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            jT808_0X8100.JT808TerminalRegisterResult = (JT808TerminalRegisterResult)JT808BinaryExtensions.ReadByteLittle(bytes, ref offset);
            // 只有在成功后才有该字段
            if (jT808_0X8100.JT808TerminalRegisterResult == JT808TerminalRegisterResult.成功)
            {
                jT808_0X8100.Code = JT808BinaryExtensions.ReadStringLittle(bytes, ref offset);
            }
            readSize = offset;
            return(jT808_0X8100);
        }
Beispiel #26
0
        public JT808Header Deserialize(ReadOnlySpan <byte> bytes, int offset, IJT808FormatterResolver formatterResolver, out int readSize)
        {
            JT808Header jT808Header = new JT808Header();

            // 1.消息ID
            jT808Header.MsgId = (JT808MsgId)JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            // 2.消息体属性
            jT808Header.MessageBodyProperty = formatterResolver.GetFormatter <JT808HeaderMessageBodyProperty>().Deserialize(bytes, offset, formatterResolver, out readSize);
            offset += readSize;
            // 3.终端手机号 (写死大陆手机号码)
            jT808Header.TerminalPhoneNo = JT808BinaryExtensions.ReadBCD(bytes, ref offset, 6).ToString().PadLeft(12, '0');
            // 4.消息流水号
            jT808Header.MsgNum = JT808BinaryExtensions.ReadUInt16Little(bytes, ref offset);
            readSize           = offset;
            return(jT808Header);
        }
Beispiel #27
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);
        }
Beispiel #28
0
 public int Serialize(ref byte[] bytes, int offset, JT808Header value, IJT808FormatterResolver formatterResolver)
 {
     // 1.消息ID
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, (ushort)value.MsgId);
     //2.消息体属性
     offset = formatterResolver.GetFormatter <JT808HeaderMessageBodyProperty>().Serialize(ref bytes, offset, value.MessageBodyProperty, formatterResolver);
     // 3.终端手机号 (写死大陆手机号码)
     offset += JT808BinaryExtensions.WriteBCDLittle(ref bytes, offset, value.TerminalPhoneNo, 6, 12);
     //消息流水号
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.MsgNum);
     if (value.MessageBodyProperty.IsPackge)
     {
         //消息总包数2位+包序号2位=4位
         offset += 4;
     }
     return(offset);
 }
Beispiel #29
0
 public static JT808Package Deserialize(ReadOnlySpan <byte> bytes, IJT808FormatterResolver resolver)
 {
     try
     {
         if (resolver == null)
         {
             resolver = DefaultResolver;
         }
         var formatter = resolver.GetFormatter <JT808Package>();
         int readSize;
         return(formatter.Deserialize(bytes, 0, resolver, out readSize));
     }
     catch (Exception ex)
     {
         throw new Exception("Deserialize", ex);
     }
 }
 public int Serialize(ref byte[] bytes, int offset, JT808_0x0704 value, IJT808FormatterResolver formatterResolver)
 {
     offset += JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, value.Count);
     offset += JT808BinaryExtensions.WriteLittle(ref bytes, offset, (byte)value.LocationType);
     foreach (var item in value?.Positions)
     {
         try
         {
             // 需要反着来,先序列化数据体(由于位置汇报数据体长度为2个字节,所以先偏移2个字节),再根据数据体的长度设置回去
             int positionOffset = formatterResolver.GetFormatter <JT808_0x0200>().Serialize(ref bytes, offset + 2, item, formatterResolver);
             JT808BinaryExtensions.WriteUInt16Little(ref bytes, offset, (ushort)(positionOffset - offset - 2));
             offset = positionOffset;
         }
         catch (Exception ex)
         {
         }
     }
     return(offset);
 }