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(); // -----------组包完成---------- }