lt;/summary>
public class BeiDouContentEncoderHandler : MessageToByteEncoder<BDBaseFrame>
{
protected override void Encode(IChannelHandlerContext context, BDBaseFrame message, IByteBuffer output)
{
EncodeFrame(message, output);
}
private void EncodeFrame(BDBaseFrame message, IByteBuffer output)
{
//IByteBuffer frameBuffer = output;
output.MarkReaderIndex();
//内容
IByteBuffer contentBuffer = message.EncoderContent();
if (contentBuffer == null)
contentBuffer = Unpooled.Empty;
//byte[] content = new byte[contentBuffer.ReadableBytes];
//contentBuffer.ReadBytes(content, 0, content.Length);
//写头标志
output.WriteByte(BDFrameConst.FRAME_FLAG);
//消息 ID
output.WriteUnsignedShort((ushort)message.FrameType);
//消息体属性 加密没做
// ushort contentLen = (ushort)content.Length;
ushort contentLen = (ushort)contentBuffer.ReadableBytes;
if (message.IsSubpackage)
{
contentLen = (ushort)(contentLen | 0x2000);
output.WriteUnsignedShort(contentLen);
}
else
{
output.WriteUnsignedShort(contentLen);
}
//终端手机号
string tPhone = message.TerminalPhone.ToStringFramePropertyLength(12, '0');
byte[] tPhoneBuffer = CZEFrameHelper.WriteBCDString(tPhone);
output.WriteBytes(tPhoneBuffer);
//消息流水号
output.WriteUnsignedShort(message.FrameSerialNum);
//消息包封装项
if (message.IsSubpackage)
{
output.WriteUnsignedShort(message.FramePackageCount);
output.WriteUnsignedShort(message.FramePackageIndex);
}
//消息体
output.WriteBytes(contentBuffer);
contentBuffer.Release();
//计算校验码
byte[] checkCodeBuffer = new byte[output.ReadableBytes];
output.ReadBytes(checkCodeBuffer, 0, checkCodeBuffer.Length);
byte value = checkCodeBuffer[1];
for (int i = 2; i < checkCodeBuffer.Length; i++)
value ^= checkCodeBuffer[i];
output.WriteByte(value);
//写尾标志
output.WriteByte(BDFrameConst.FRAME_FLAG);
//转义
output.ResetReaderIndex();
checkCodeBuffer = new byte[output.ReadableBytes];
output.ReadBytes(checkCodeBuffer, 0, checkCodeBuffer.Length);
byte[] frame = FrameEscaping.BDEscapingBufferSend(checkCodeBuffer);
//数据写入 frameBuffer
output.Clear();
output.WriteBytes(frame);
}
}
6.使用 BeiDouContentEncoderHandler,在通道中加入BeiDouContentEncoderHandler,通道里面的顺序很重要,BeiDouContentEncoderHandler必须要在你发送的Handler前加到通道中去如下图
主要的代码就这些,水平有限,请大家多多指教
原文地址 http://www.dncblogs.cn/Blog/LookBlog/71
|