Example #1
0
        public int Serialize(ref byte[] bytes, int offset, JT809_0x9300 value)
        {
            offset += JT809BinaryExtensions.WriteUInt16Little(bytes, offset, (ushort)value.SubBusinessType);
            //offset += JT809BinaryExtensions.WriteUInt32Little(memoryOwner, offset, value.DataLength);
            //JT809.Protocol.Enums.JT809BusinessType 映射对应消息特性
            JT809BodiesTypeAttribute jT809SubBodiesTypeAttribute = value.SubBusinessType.GetAttribute <JT809BodiesTypeAttribute>();

            if (jT809SubBodiesTypeAttribute == null)
            {
                throw new JT809Exception(JT809ErrorCode.GetAttributeError, $"JT809BodiesTypeAttribute Not Found>{value.SubBusinessType.ToString()}");
            }
            try
            {
                // 先写入内容,然后在根据内容反写内容长度
                offset = offset + 4;
                int contentOffset = JT809FormatterResolverExtensions.JT809DynamicSerialize(JT809FormatterExtensions.GetFormatter(jT809SubBodiesTypeAttribute.JT809BodiesType), ref bytes, offset, value.SubBodies);
                JT809BinaryExtensions.WriteUInt32Little(bytes, offset - 4, (uint)(contentOffset - offset));
                offset = contentOffset;
            }
            catch
            {
                throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
            }
            return(offset);
        }
        public int Serialize(ref byte[] bytes, int offset, JT809Package value)
        {
            // 1. 先序列化数据体,根据数据体的长度赋值给头部,在序列化头部。
            int messageBodyOffset = 0;
            JT809BodiesTypeAttribute jT809BodiesTypeAttribute = value.Header.BusinessType.GetAttribute <JT809BodiesTypeAttribute>();

            if (jT809BodiesTypeAttribute != null)
            {
                if (value.Bodies != null)
                {
                    // 1.1 处理数据体
                    messageBodyOffset = JT809FormatterResolverExtensions.JT809DynamicSerialize(JT809FormatterExtensions.GetFormatter(jT809BodiesTypeAttribute.JT809BodiesType), ref bytes, messageBodyOffset, value.Bodies);
                }
            }
            byte[] messageBodyData = null;
            if (messageBodyOffset != 0)
            {
                messageBodyData = bytes.AsSpan(0, messageBodyOffset).ToArray();
                // 1.2 数据加密
                switch (value.Header.EncryptFlag)
                {
                case JT809Header_Encrypt.None:
                    break;

                case JT809Header_Encrypt.Common:
                    messageBodyData = JT809GlobalConfig.Instance.Encrypt.Encrypt(messageBodyData, value.Header.EncryptKey);
                    break;
                }
            }
            // ------------------------------------开始组包
            // 1.起始符
            offset += JT809BinaryExtensions.WriteByteLittle(bytes, offset, value.BeginFlag);
            // 2.赋值头数据长度
            if (messageBodyOffset != 0)
            {
                value.Header.MsgLength = (uint)(JT809Package.FixedByteLength + messageBodyData.Length);
            }
            else
            {
                value.Header.MsgLength = JT809Package.FixedByteLength;
            }
            // 2.1写入头部数据
            offset = JT809FormatterExtensions.GetFormatter <JT809Header>().Serialize(ref bytes, offset, value.Header);
            if (messageBodyOffset != 0)
            {
                // 3. 写入数据体
                Array.Copy(messageBodyData, 0, bytes, offset, messageBodyData.Length);
                offset         += messageBodyData.Length;
                messageBodyData = null;
            }
            // 4.校验码
            offset += JT809BinaryExtensions.WriteUInt16Little(bytes, offset, bytes.ToCRC16_CCITT(1, offset));
            // 5.终止符
            offset += JT809BinaryExtensions.WriteByteLittle(bytes, offset, value.EndFlag);
            // 6.转义
            byte[] temp = JT809Escape(bytes.AsSpan(0, offset));
            Array.Copy(temp, 0, bytes, 0, temp.Length);
            return(temp.Length);
        }