Esempio n. 1
0
        public void Serialize(ref JT809MessagePackWriter writer, JT809Package value, IJT809Config config)
        {
            // -----------开始组包----------
            // 1.起始符
            writer.WriteByte(value.BeginFlag);
            // 2.写入头部数据
            //  2.1.跳过数据长度的写入
            writer.Skip(4, out int lengthPosition);
            //  2.2.报文序列号
            value.Header.MsgSN = value.Header.MsgSN > 0 ? value.Header.MsgSN : config.MsgSNDistributed.Increment();
            writer.WriteUInt32(value.Header.MsgSN);
            //  2.3.业务数据类型
            writer.WriteUInt16(value.Header.BusinessType);
            //  2.4.下级平台接入码
            writer.WriteUInt32(value.Header.MsgGNSSCENTERID);
            //  2.5.版本号
            writer.WriteArray(value.Header.Version.Buffer);
            //  2.6.报文加密
            writer.WriteByte((byte)value.Header.EncryptFlag);
            //  2.7.数据加密密钥
            writer.WriteUInt32(value.Header.EncryptKey);
            // 3.写入数据体
            //  3.1.记录当前开始位置
            int startIndex = writer.GetCurrentPosition();

            //  3.2.写入数据对应数据体
            if (value.Bodies != null)
            {
                JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
                    config.GetMessagePackFormatterByType(value.Bodies.GetType()),
                    ref writer, value.Bodies,
                    config);
            }
            //  3.3.记录当前结束位置
            int endIndex      = writer.GetCurrentPosition();
            int contentLength = endIndex - startIndex;

            if (contentLength > 0)
            {
                // 3.4. 数据加密
                switch (value.Header.EncryptFlag)
                {
                case JT809Header_Encrypt.None:
                    break;

                case JT809Header_Encrypt.Common:
                    // 3.5. 提取数据体并进行加密处理
                    byte[] messageBodyDatEncrypted = config.Encrypt.Encrypt(writer.Extract(startIndex), config.EncryptOptions, value.Header.EncryptKey);
                    int    flagLength = messageBodyDatEncrypted.Length - contentLength;
                    if (flagLength == 0)
                    {
                        // 相等复制
                        writer.CopyTo(messageBodyDatEncrypted, startIndex);
                    }
                    else if (flagLength > 0)
                    {
                        // 扩容
                        writer.Skip(flagLength, out _);
                        writer.CopyTo(messageBodyDatEncrypted, startIndex);
                    }
                    else
                    {
                        // 缩减
                        writer.CopyTo(messageBodyDatEncrypted, startIndex);
                        writer.Shrink(-flagLength);
                    }
                    break;
                }
            }
            // 4.计算内容的总长度(校验码2+终止符1=3)
            writer.WriteInt32Return(writer.GetCurrentPosition() + 3, lengthPosition);
            // 5.校验码
            writer.WriteCRC16();
            // 6.终止符
            writer.WriteByte(value.EndFlag);
            // 7.转义
            writer.WriteEncode();
            // -----------组包完成----------
        }