Esempio n. 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="value"></param>
        /// <param name="config"></param>
        public void Serialize(ref JT808MessagePackWriter writer, JT808CarDVRUpPackage value, IJT808Config config)
        {
            var currentPosition = writer.GetCurrentPosition();

            writer.WriteUInt16(value.Begin);
            writer.WriteByte(value.CommandId);
            var isError            = value.CommandId == 0xFA || value.CommandId == 0xFB;
            int datalengthPosition = 0;

            if (!isError)
            {
                writer.Skip(2, out datalengthPosition);
            }
            writer.WriteByte(value.KeepFields);
            if (datalengthPosition > 0)
            {
                if (config.JT808_CarDVR_Up_Factory.Map.TryGetValue(value.CommandId, out var instance))
                {
                    if (!value.Bodies.SkipSerialization)
                    {
                        //4.2.处理消息体
                        JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(instance, ref writer, value.Bodies, config);
                    }
                }
                writer.WriteUInt16Return((ushort)(writer.GetCurrentPosition() - 2 - 1 - datalengthPosition), datalengthPosition);//此处-2:减去数据长度字段2位,-1:减去保留字长度
            }
            writer.WriteCarDVRCheckCode(currentPosition);
        }
Esempio n. 2
0
 public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200 value, IJT808Config config)
 {
     writer.WriteUInt32(value.AlarmFlag);
     writer.WriteUInt32(value.StatusFlag);
     //0x10000000 南纬 134217728
     //0x8000000  西经 ‭‬268435456
     //0x18000000 南纬-西经 134217728+268435456
     if (((value.StatusFlag >> 28) & 1) == 1)
     {
         uint lat = (uint)value.Lat;
         writer.WriteUInt32(lat);
     }
     else
     {
         if (value.Lat < 0)
         {
             throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lat {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>28) !=1");
         }
         writer.WriteInt32(value.Lat);
     }
     if (((value.StatusFlag >> 27) & 1) == 1)
     {
         uint lng = (uint)value.Lng;
         writer.WriteUInt32(lng);
     }
     else
     {
         if (value.Lng < 0)
         {
             throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lng {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>29) !=1");
         }
         writer.WriteInt32(value.Lng);
     }
     writer.WriteUInt16(value.Altitude);
     writer.WriteUInt16(value.Speed);
     writer.WriteUInt16(value.Direction);
     writer.WriteDateTime6(value.GPSTime);
     if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0)
     {
         foreach (var item in value.JT808LocationAttachData)
         {
             try
             {
                 object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType());
                 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config);
             }
             catch
             {
             }
         }
     }
     if (value.JT808CustomLocationAttachData != null && value.JT808CustomLocationAttachData.Count > 0)
     {
         foreach (var item in value.JT808CustomLocationAttachData)
         {
             object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType());
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config);
         }
     }
 }
Esempio n. 3
0
        public void Serialize(ref JT808MessagePackWriter writer, JT808Package value, IJT808Config config)
        {
            // ---------------开始组包--------------
            // 1.起始符
            writer.WriteStart();
            // 2.写入头部 //部分有带数据体的长度,那么先跳过写入头部部分
            //  2.1.消息ID
            writer.WriteUInt16(value.Header.MsgId);
            //  2.2.消息体属性(包含消息体长度所以先跳过)
            writer.Skip(2, out int msgBodiesPropertyPosition);
            if (value.Header.MessageBodyProperty.VersionFlag)
            {
                //2019版本
                //  2.3.协议版本号
                writer.WriteByte(value.Header.ProtocolVersion);
                //  2.4.终端手机号
                writer.WriteBCD(value.Header.TerminalPhoneNo, 20);
                writer.Version = JT808Version.JTT2019;
            }
            else
            {
                //2013版本
                //  2.3.终端手机号 (写死大陆手机号码)
                writer.WriteBCD(value.Header.TerminalPhoneNo, config.TerminalPhoneNoLength);
            }
            value.Header.MsgNum = value.Header.MsgNum > 0 ? value.Header.MsgNum : config.MsgSNDistributed.Increment();
            //  2.4.消息流水号
            writer.WriteUInt16(value.Header.MsgNum);
            //  2.5.判断是否分包
            if (value.Header.MessageBodyProperty.IsPackage)
            {
                // 2.5.1.消息包总数
                writer.WriteUInt16(value.Header.PackgeCount);
                // 2.5.2.消息包序号
                writer.WriteUInt16(value.Header.PackageIndex);
            }
            int headerLength = writer.GetCurrentPosition();

            // 3.处理数据体部分
            if (value.Bodies != null)
            {
                if (!value.Bodies.SkipSerialization)
                {
                    JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(value.Bodies,
                                                                                      ref writer, value.Bodies,
                                                                                      config);
                }
            }
            //  3.1.处理数据体长度
            // 2.2.回写消息体属性
            value.Header.MessageBodyProperty.DataLength = (writer.GetCurrentPosition() - headerLength);
            writer.WriteUInt16Return(value.Header.MessageBodyProperty.Wrap(), msgBodiesPropertyPosition);
            // 4.校验码
            writer.WriteXor();
            // 5.终止符
            writer.WriteEnd();
            // 6.编码
            writer.WriteEncode();
            // ---------------组包结束--------------
        }
Esempio n. 4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="type"></param>
        /// <param name="version"></param>
        /// <returns></returns>
        public dynamic Deserialize(ReadOnlySpan <byte> bytes, Type type, JT808Version version = JT808Version.JTT2013)
        {
            var formatter = jT808Config.GetMessagePackFormatterByType(type);
            JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);

            return(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(formatter, ref jT808MessagePackReader, jT808Config));
        }
Esempio n. 5
0
        public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0900 value, IJT808Config config)
        {
            writer.WriteByte(value.PassthroughType);
            object obj = config.GetMessagePackFormatterByType(value.JT808_0x0900_BodyBase.GetType());

            JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808_0x0900_BodyBase, config);
        }
Esempio n. 6
0
        public JT808_0x0104 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x0104 jT808_0x0104 = new JT808_0x0104();

            jT808_0x0104.MsgNum            = reader.ReadUInt16();
            jT808_0x0104.AnswerParamsCount = reader.ReadByte();
            for (int i = 0; i < jT808_0x0104.AnswerParamsCount; i++)
            {
                var paramId = reader.ReadVirtualUInt32();//参数ID
                if (config.JT808_0X8103_Factory.ParamMethods.TryGetValue(paramId, out Type type))
                {
                    if (jT808_0x0104.ParamList != null)
                    {
                        jT808_0x0104.ParamList.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(
                                                       config.GetMessagePackFormatterByType(type), ref reader, config));
                    }
                    else
                    {
                        jT808_0x0104.ParamList = new List <JT808_0x8103_BodyBase> {
                            JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(
                                config.GetMessagePackFormatterByType(type), ref reader, config)
                        };
                    }
                }
            }
            return(jT808_0x0104);
        }
Esempio n. 7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public JT808_0x0104 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x0104 jT808_0x0104 = new JT808_0x0104();

            jT808_0x0104.MsgNum            = reader.ReadUInt16();
            jT808_0x0104.AnswerParamsCount = reader.ReadByte();
            for (int i = 0; i < jT808_0x0104.AnswerParamsCount; i++)
            {
                var paramId = reader.ReadVirtualUInt32();//参数ID
                if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance))
                {
                    if (jT808_0x0104.ParamList != null)
                    {
                        jT808_0x0104.ParamList.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config));
                    }
                    else
                    {
                        jT808_0x0104.ParamList = new List <JT808_0x8103_BodyBase> {
                            JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config)
                        };
                    }
                }
                else
                {
                    //对于未能解析的自定义项,过滤其长度,以保证后续解析正常
                    reader.Skip(4);              //跳过参数id长度
                    var len = reader.ReadByte(); //获取协议长度
                    reader.Skip(len);            //跳过协议内容
                }
            }
            return(jT808_0x0104);
        }
Esempio n. 8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public JT808CarDVRUpPackage Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808CarDVRUpPackage value = new JT808CarDVRUpPackage();
            int currentPosition        = reader.ReaderCount;

            value.Begin      = reader.ReadUInt16();
            value.CommandId  = reader.ReadByte();
            value.DataLength = reader.ReadUInt16();
            value.KeepFields = reader.ReadByte();
            if (value.DataLength > 0)
            {
                if (config.JT808_CarDVR_Up_Factory.Map.TryGetValue(value.CommandId, out var instance))
                {
                    //4.2.处理消息体
                    dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config);
                    value.Bodies = attachImpl;
                }
            }
            var(CalculateXorCheckCode, RealXorCheckCode) = reader.ReadCarDVRCheckCode(currentPosition);
            if (!config.SkipCarDVRCRCCode)
            {
                if (RealXorCheckCode != CalculateXorCheckCode)
                {
                    throw new JT808Exception(JT808ErrorCode.CarDVRCheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}");
                }
            }
            value.CheckCode = reader.ReadByte();
            return(value);
        }
Esempio n. 9
0
 public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8500 value, IJT808Config config)
 {
     if (writer.Version == JT808Version.JTT2019)
     {
         if (value.ControlTypes != null && value.ControlTypes.Count > 0)
         {
             writer.WriteUInt16((ushort)value.ControlTypes.Count);
             foreach (var item in value.ControlTypes)
             {
                 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
             }
         }
         else
         {
             writer.WriteUInt16(value.ControlTypeCount);
             if (value.ControlTypeBuffer != null && value.ControlTypeBuffer.Length > 0)
             {
                 writer.WriteArray(value.ControlTypeBuffer);
             }
         }
     }
     else
     {
         writer.WriteByte(value.ControlFlag);
     }
 }
Esempio n. 10
0
        public JT808_0x8500 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x8500 value = new JT808_0x8500();

            if (reader.Version == JT808Version.JTT2019)
            {
                value.ControlTypeCount = reader.ReadUInt16();
                value.ControlTypes     = new List <JT808_0x8500_ControlType>();
                while (reader.ReadCurrentRemainContentLength() > 0)
                {
                    var controlTypeId = reader.ReadVirtualUInt16();
                    if (config.JT808_0x8500_2019_Factory.Map.TryGetValue(controlTypeId, out object instance))
                    {
                        value.ControlTypes.Add(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config));
                    }
                    else
                    {
                        value.ControlTypeBuffer = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
                    }
                }
            }
            else
            {
                value.ControlFlag = reader.ReadByte();
            }
            return(value);
        }
Esempio n. 11
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public JT808_0x8103 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x8103 value = new JT808_0x8103
            {
                ParamList       = new List <JT808_0x8103_BodyBase>(),
                CustomParamList = new List <JT808_0x8103_CustomBodyBase>()
            };
            var paramCount = reader.ReadByte();//参数总数

            try
            {
                for (int i = 0; i < paramCount; i++)
                {
                    var paramId = reader.ReadVirtualUInt32();//参数ID
                    if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance))
                    {
                        dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config);
                        value.ParamList.Add(attachImpl);
                    }
                    else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance))
                    {
                        dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customInstance, ref reader, config);
                        value.CustomParamList.Add(attachImpl);
                    }
                }
            }
            catch
            {
            }
            return(value);
        }
Esempio n. 12
0
        public JT808_0x8103 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x8103 jT808_0x8103 = new JT808_0x8103
            {
                ParamList       = new List <JT808_0x8103_BodyBase>(),
                CustomParamList = new List <JT808_0x8103_CustomBodyBase>()
            };
            var paramCount = reader.ReadByte();//参数总数

            try
            {
                for (int i = 0; i < paramCount; i++)
                {
                    var paramId = reader.ReadVirtualUInt32();//参数ID
                    if (config.JT808_0X8103_Factory.ParamMethods.TryGetValue(paramId, out Type type))
                    {
                        object  attachImplObj = config.GetMessagePackFormatterByType(type);
                        dynamic attachImpl    = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, ref reader, config);
                        jT808_0x8103.ParamList.Add(attachImpl);
                    }
                    else if (config.JT808_0X8103_Custom_Factory.ParamMethods.TryGetValue(paramId, out Type customType))
                    {
                        object  attachImplObj = config.GetMessagePackFormatterByType(customType);
                        dynamic attachImpl    = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(attachImplObj, ref reader, config);
                        jT808_0x8103.CustomParamList.Add(attachImpl);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return(jT808_0x8103);
        }
Esempio n. 13
0
        public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8700 value, IJT808Config config)
        {
            writer.WriteByte(value.CommandId);
            object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType());

            JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808CarDVRDownPackage, config);
        }
Esempio n. 14
0
 public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200 value, IJT808Config config)
 {
     writer.WriteUInt32(value.AlarmFlag);
     writer.WriteUInt32(value.StatusFlag);
     writer.WriteInt32(value.Lat);
     writer.WriteInt32(value.Lng);
     writer.WriteUInt16(value.Altitude);
     writer.WriteUInt16(value.Speed);
     writer.WriteUInt16(value.Direction);
     writer.WriteDateTime6(value.GPSTime);
     if (value.JT808LocationAttachData != null && value.JT808LocationAttachData.Count > 0)
     {
         foreach (var item in value.JT808LocationAttachData)
         {
             try
             {
                 object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType());
                 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config);
             }
             catch
             {
             }
         }
     }
     if (value.JT808CustomLocationAttachData != null && value.JT808CustomLocationAttachData.Count > 0)
     {
         foreach (var item in value.JT808CustomLocationAttachData)
         {
             object attachImplObj = config.GetMessagePackFormatterByType(item.Value.GetType());
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item.Value, config);
         }
     }
 }
Esempio n. 15
0
        public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0700 value, IJT808Config config)
        {
            writer.WriteUInt16(value.ReplyMsgNum);
            writer.WriteByte(value.CommandId);
            object obj = config.GetMessagePackFormatterByType(typeof(JT808CarDVRUpPackage));

            JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.JT808CarDVRUpPackage, config);
        }
Esempio n. 16
0
        public JT808_0x8700 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x8700 value = new JT808_0x8700();

            value.CommandId = reader.ReadByte();
            object obj = config.GetMessagePackFormatterByType(value.JT808CarDVRDownPackage.GetType());

            value.JT808CarDVRDownPackage = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(obj, ref reader, config);
            return(value);
        }
Esempio n. 17
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="writer"></param>
 /// <param name="value"></param>
 /// <param name="config"></param>
 public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0104 value, IJT808Config config)
 {
     writer.WriteUInt16(value.MsgNum);
     writer.WriteByte(value.AnswerParamsCount);
     foreach (var item in value.ParamList)
     {
         object obj = config.GetMessagePackFormatterByType(item.GetType());
         JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, item, config);
     }
 }
Esempio n. 18
0
        public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0701 value, IJT808Config config)
        {
            writer.Skip(4, out int skipPosition);
            object obj = config.GetMessagePackFormatterByType(value.ElectronicContentObj.GetType());

            JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.ElectronicContentObj, config);
            int contentLength = writer.GetCurrentPosition() - skipPosition - 4;

            writer.WriteInt32Return(contentLength, skipPosition);
        }
Esempio n. 19
0
        public JT808_0x0700 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x0700 value = new JT808_0x0700();

            value.ReplyMsgNum = reader.ReadUInt16();
            value.CommandId   = reader.ReadByte();
            object obj = config.GetMessagePackFormatterByType(typeof(JT808CarDVRUpPackage));

            value.JT808CarDVRUpPackage = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(obj, ref reader, config);
            return(value);
        }
Esempio n. 20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="value"></param>
        /// <param name="config"></param>
        public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900 value, IJT808Config config)
        {
            writer.WriteByte(value.PassthroughType);

            if (value.JT808_0X8900_BodyBase != null)
            {
                JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(value.JT808_0X8900_BodyBase, ref writer, value.JT808_0X8900_BodyBase, config);
            }
            else
            {
                writer.WriteArray(value.PassthroughData);
            }
        }
Esempio n. 21
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);
        }
Esempio n. 22
0
 public dynamic Deserialize(ReadOnlySpan <byte> bytes, Type type, JT808Version version = JT808Version.JTT2013, int minBufferSize = 4096)
 {
     byte[] buffer = JT808ArrayPool.Rent(minBufferSize);
     try
     {
         var formatter = jT808Config.GetMessagePackFormatterByType(type);
         JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes, version);
         if (CheckPackageType(type))
         {
             jT808MessagePackReader.Decode(buffer);
         }
         return(JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(formatter, ref jT808MessagePackReader, jT808Config));
     }
     finally
     {
         JT808ArrayPool.Return(buffer);
     }
 }
Esempio n. 23
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="writer"></param>
 /// <param name="value"></param>
 /// <param name="config"></param>
 public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103 value, IJT808Config config)
 {
     writer.WriteByte(value.ParamCount);
     try
     {
         foreach (var item in value.ParamList)
         {
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
         }
         if (value.CustomParamList != null)
         {
             foreach (var item in value.CustomParamList)
             {
                 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
             }
         }
     }
     catch { }
 }
Esempio n. 24
0
 public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103 value, IJT808Config config)
 {
     writer.WriteByte(value.ParamCount);
     try
     {
         foreach (var item in value.ParamList)
         {
             object attachImplObj = config.GetMessagePackFormatterByType(item.GetType());
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item, config);
         }
         if (value.CustomParamList != null)
         {
             foreach (var item in value.CustomParamList)
             {
                 object attachImplObj = config.GetMessagePackFormatterByType(item.GetType());
                 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(attachImplObj, ref writer, item, config);
             }
         }
     }
     catch (Exception ex) { }
 }
 public void Serialize(ref JT808MessagePackWriter writer, JT808_JTActiveSafety_0x0900 value, IJT808Config config)
 {
     if (value.USBMessages != null && value.USBMessages.Count > 0)
     {
         writer.WriteByte((byte)value.USBMessages.Count);
         foreach (var item in value.USBMessages)
         {
             writer.WriteByte(item.USBID);
             if (item.MessageContent != null && item.MessageContent.Length > 0)
             {
                 writer.WriteByte((byte)item.MessageContent.Length);
                 writer.WriteArray(item.MessageContent);
             }
             else if (item.MessageContentObejct != null)
             {
                 writer.Skip(1, out int MessageContentLengthPosition);
                 object obj = config.GetMessagePackFormatterByType(item.MessageContentObejct.GetType());
                 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, item.MessageContentObejct, config);
                 writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - MessageContentLengthPosition - 1), MessageContentLengthPosition);
             }
         }
     }
 }
Esempio n. 26
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public JT808Package Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            // 1. 验证校验和
            if (!config.SkipCRCCode)
            {
                if (!reader.CheckXorCodeVali)
                {
                    throw new JT808Exception(JT808ErrorCode.CheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}");
                }
            }
            JT808Package jT808Package = new JT808Package();

            // ---------------开始解包--------------
            // 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(reader.ReadUInt16());
            if (reader.Version == JT808Version.JTT2013Force)
            {
                jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim);
                reader.Version = JT808Version.JTT2013;
            }
            else
            {
                if (reader.Version == JT808Version.JTT2019 || jT808Package.Header.MessageBodyProperty.VersionFlag)
                {
                    //2019版本
                    jT808Package.Header.ProtocolVersion = reader.ReadByte();
                    //  3.4.读取终端手机号
                    jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(20, config.Trim);
                    reader.Version = JT808Version.JTT2019;
                }
                else
                {
                    //2013版本
                    //  3.3.读取终端手机号
                    jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim);
                }
            }
            jT808Package.Version = reader.Version;
            //  3.4.读取消息流水号
            jT808Package.Header.MsgNum = reader.ReadUInt16();
            //  3.5.判断有无分包
            if (jT808Package.Header.MessageBodyProperty.IsPackage)
            {
                //3.5.1.读取消息包总数
                jT808Package.Header.PackgeCount = reader.ReadUInt16();
                //3.5.2.读取消息包序号
                jT808Package.Header.PackageIndex = reader.ReadUInt16();
            }
            // 4.处理数据体
            //  4.1.判断有无数据体
            if (jT808Package.Header.MessageBodyProperty.DataLength > 0)
            {
                if (config.MsgIdFactory.TryGetValue(jT808Package.Header.MsgId, out object instance))
                {
                    if (jT808Package.Header.MessageBodyProperty.IsPackage)
                    {
                        //读取分包的数据体
                        try
                        {
                            jT808Package.SubDataBodies = reader.ReadArray(jT808Package.Header.MessageBodyProperty.DataLength).ToArray();
                        }
                        catch (Exception ex)
                        {
                            throw new JT808Exception(JT808ErrorCode.BodiesParseError, ex);
                        }
                    }
                    else
                    {
                        try
                        {
                            //4.2.处理消息体
                            jT808Package.Bodies = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(
                                instance,
                                ref reader, config);
                        }
                        catch (Exception ex)
                        {
                            throw new JT808Exception(JT808ErrorCode.BodiesParseError, ex);
                        }
                    }
                }
            }
            // 5.读取校验码
            jT808Package.CheckCode = reader.ReadByte();
            // 6.读取终止位置
            jT808Package.End = reader.ReadEnd();
            // ---------------解包完成--------------
            return(jT808Package);
        }
Esempio n. 27
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="writer"></param>
 /// <param name="value"></param>
 /// <param name="config"></param>
 public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200 value, IJT808Config config)
 {
     writer.WriteUInt32(value.AlarmFlag);
     writer.WriteUInt32(value.StatusFlag);
     //0x10000000 南纬 134217728
     //0x8000000  西经 ‭‬268435456
     //0x18000000 南纬-西经 134217728+268435456
     if (((value.StatusFlag >> 28) & 1) == 1)
     {
         uint lat = (uint)value.Lat;
         writer.WriteUInt32(lat);
     }
     else
     {
         if (value.Lat < 0)
         {
             throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lat {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>28) !=1");
         }
         writer.WriteInt32(value.Lat);
     }
     if (((value.StatusFlag >> 27) & 1) == 1)
     {
         uint lng = (uint)value.Lng;
         writer.WriteUInt32(lng);
     }
     else
     {
         if (value.Lng < 0)
         {
             throw new JT808Exception(JT808ErrorCode.LatOrLngError, $"Lng {nameof(JT808_0x0200.StatusFlag)} ({value.StatusFlag}>>29) !=1");
         }
         writer.WriteInt32(value.Lng);
     }
     writer.WriteUInt16(value.Altitude);
     writer.WriteUInt16(value.Speed);
     writer.WriteUInt16(value.Direction);
     writer.WriteDateTime_yyMMddHHmmss(value.GPSTime);
     if (value.BasicLocationAttachData != null && value.BasicLocationAttachData.Count > 0)
     {
         foreach (var item in value.BasicLocationAttachData)
         {
             try
             {
                 JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config);
             }
             catch
             {
             }
         }
     }
     if (value.CustomLocationAttachData != null && value.CustomLocationAttachData.Count > 0)
     {
         foreach (var item in value.CustomLocationAttachData)
         {
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config);
         }
     }
     if (value.CustomLocationAttachData2 != null && value.CustomLocationAttachData2.Count > 0)
     {
         foreach (var item in value.CustomLocationAttachData2)
         {
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config);
         }
     }
     if (value.CustomLocationAttachData3 != null && value.CustomLocationAttachData3.Count > 0)
     {
         foreach (var item in value.CustomLocationAttachData3)
         {
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config);
         }
     }
     if (value.CustomLocationAttachData4 != null && value.CustomLocationAttachData4.Count > 0)
     {
         foreach (var item in value.CustomLocationAttachData4)
         {
             JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item.Value, ref writer, item.Value, config);
         }
     }
     if (value.UnknownLocationAttachData != null && value.UnknownLocationAttachData.Count > 0)
     {
         foreach (var item in value.UnknownLocationAttachData)
         {
             if (item.Value != null && item.Value.Length >= 2)
             {
                 writer.WriteArray(item.Value);
             }
         }
     }
     if (value.ExceptionLocationAttachOriginalData != null && value.ExceptionLocationAttachOriginalData.Count > 0)
     {
         foreach (var item in value.ExceptionLocationAttachOriginalData)
         {
             if (item != null && item.Length >= 2)
             {
                 writer.WriteArray(item);
             }
         }
     }
 }
Esempio n. 28
0
        public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0608 value, IJT808Config config)
        {
            writer.WriteByte(value.QueryType);
            switch (value.QueryType)
            {
            case 1:
                if (value.JT808_0x8600s != null && value.JT808_0x8600s.Count > 0)
                {
                    writer.WriteUInt32((uint)value.JT808_0x8600s.Count);
                    foreach (var item in value.JT808_0x8600s)
                    {
                        JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
                    }
                }
                break;

            case 2:
                if (value.JT808_0x8602s != null && value.JT808_0x8602s.Count > 0)
                {
                    writer.WriteUInt32((uint)value.JT808_0x8602s.Count);
                    foreach (var item in value.JT808_0x8602s)
                    {
                        JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
                    }
                }
                break;

            case 3:
                if (value.JT808_0x8604s != null && value.JT808_0x8604s.Count > 0)
                {
                    writer.WriteUInt32((uint)value.JT808_0x8604s.Count);
                    foreach (var item in value.JT808_0x8604s)
                    {
                        JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
                    }
                }
                break;

            case 4:
                if (value.JT808_0x8606s != null && value.JT808_0x8606s.Count > 0)
                {
                    writer.WriteUInt32((uint)value.JT808_0x8606s.Count);
                    foreach (var item in value.JT808_0x8606s)
                    {
                        JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
                    }
                }
                break;

            default:
                if (value.Ids != null && value.Ids.Count > 0)
                {
                    writer.WriteUInt32((uint)value.Ids.Count);
                    foreach (var item in value.Ids)
                    {
                        writer.WriteUInt32(item);
                    }
                }
                else
                {
                    writer.WriteUInt32(0);
                }
                break;
            }
        }
Esempio n. 29
0
        public JT808_0x0608 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x0608 value = new JT808_0x0608();

            value.QueryType = reader.ReadByte();
            value.Count     = reader.ReadUInt32();
            if (value.Count > 0)
            {
                switch (value.QueryType)
                {
                case 1:
                    value.JT808_0x8600s = new List <JT808_0x8600>();
                    for (int i = 0; i < value.Count; i++)
                    {
                        if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8600).GUID, out object instance))
                        {
                            dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config);
                            value.JT808_0x8600s.Add(attachImpl);
                        }
                    }
                    break;

                case 2:
                    value.JT808_0x8602s = new List <JT808_0x8602>();
                    for (int i = 0; i < value.Count; i++)
                    {
                        if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8602).GUID, out object instance))
                        {
                            dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config);
                            value.JT808_0x8602s.Add(attachImpl);
                        }
                    }
                    break;

                case 3:
                    value.JT808_0x8604s = new List <JT808_0x8604>();
                    for (int i = 0; i < value.Count; i++)
                    {
                        if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8604).GUID, out object instance))
                        {
                            dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config);
                            value.JT808_0x8604s.Add(attachImpl);
                        }
                    }
                    break;

                case 4:
                    value.JT808_0x8606s = new List <JT808_0x8606>();
                    for (int i = 0; i < value.Count; i++)
                    {
                        if (config.FormatterFactory.FormatterDict.TryGetValue(typeof(JT808_0x8606).GUID, out object instance))
                        {
                            dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config);
                            value.JT808_0x8606s.Add(attachImpl);
                        }
                    }
                    break;

                default:
                    value.Ids = new List <uint>();
                    for (int i = 0; i < value.Count; i++)
                    {
                        value.Ids.Add(reader.ReadUInt32());
                    }
                    break;
                }
            }
            return(value);
        }
Esempio n. 30
0
        public JT808_0x0200 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
        {
            JT808_0x0200 jT808_0X0200 = new JT808_0x0200();

            jT808_0X0200.AlarmFlag  = reader.ReadUInt32();
            jT808_0X0200.StatusFlag = reader.ReadUInt32();
            if (((jT808_0X0200.StatusFlag >> 28) & 1) == 1)
            {   //南纬 268435456 0x10000000
                jT808_0X0200.Lat = (int)reader.ReadUInt32();
            }
            else
            {
                jT808_0X0200.Lat = reader.ReadInt32();
            }
            if (((jT808_0X0200.StatusFlag >> 27) & 1) == 1)
            {   //西经 ‭134217728‬ 0x8000000
                jT808_0X0200.Lng = (int)reader.ReadUInt32();
            }
            else
            {
                jT808_0X0200.Lng = reader.ReadInt32();
            }
            jT808_0X0200.Altitude  = reader.ReadUInt16();
            jT808_0X0200.Speed     = reader.ReadUInt16();
            jT808_0X0200.Direction = reader.ReadUInt16();
            jT808_0X0200.GPSTime   = reader.ReadDateTime6();
            // 位置附加信息
            jT808_0X0200.JT808LocationAttachData                = new Dictionary <byte, JT808_0x0200_BodyBase>();
            jT808_0X0200.JT808CustomLocationAttachData          = new Dictionary <byte, JT808_0x0200_CustomBodyBase>();
            jT808_0X0200.JT808UnknownLocationAttachOriginalData = new Dictionary <byte, byte[]>();
            while (reader.ReadCurrentRemainContentLength() > 0)
            {
                try
                {
                    ReadOnlySpan <byte> attachSpan = reader.GetVirtualReadOnlySpan(2);
                    byte attachId  = attachSpan[0];
                    byte attachLen = attachSpan[1];
                    if (config.JT808_0X0200_Factory.Map.TryGetValue(attachId, out object jT808LocationAttachInstance))
                    {
                        dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(jT808LocationAttachInstance, ref reader, config);
                        jT808_0X0200.JT808LocationAttachData.Add(attachImpl.AttachInfoId, attachImpl);
                    }
                    else if (config.JT808_0X0200_Custom_Factory.Map.TryGetValue(attachId, out object customAttachInstance))
                    {
                        dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customAttachInstance, ref reader, config);
                        jT808_0X0200.JT808CustomLocationAttachData.Add(attachImpl.AttachInfoId, attachImpl);
                    }
                    else
                    {
                        reader.Skip(2);
                        jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray());
                        reader.Skip(attachLen);
                    }
                }
                catch
                {
                    try
                    {
                        byte attachId  = reader.ReadByte();
                        byte attachLen = reader.ReadByte();
                        jT808_0X0200.JT808UnknownLocationAttachOriginalData.Add(attachId, reader.ReadArray(reader.ReaderCount - 2, attachLen + 2).ToArray());
                        reader.Skip(attachLen);
                    }
                    catch (Exception ex)
                    {
                        throw;
                    }
                }
            }
            return(jT808_0X0200);
        }