writeAndFlush()后的Java netty rxtx管道块

writeAndFlush()后的Java netty rxtx管道块,java,netty,rxtx,Java,Netty,Rxtx,我目前正在尝试使用Netty4.0.44.Final和rxtx在微控制器和Java应用程序之间实现某种程度的稳定连接。控制器有时会要求提供时间戳,否则它只是将传感器数据转发给我的应用程序。在我调用管道中的某个地方的writeAndFlush()之前,应用程序可以接收任意数量的包(即响应时间请求)。管道正确地将数据写入outputstream(当调用writeAndFlush()时),从那时起,我的应用程序将不再接收数据,我不知道为什么 public class WsnViaRxtxConnect

我目前正在尝试使用Netty4.0.44.Final和rxtx在微控制器和Java应用程序之间实现某种程度的稳定连接。控制器有时会要求提供时间戳,否则它只是将传感器数据转发给我的应用程序。在我调用管道中的某个地方的writeAndFlush()之前,应用程序可以接收任意数量的包(即响应时间请求)。管道正确地将数据写入outputstream(当调用writeAndFlush()时),从那时起,我的应用程序将不再接收数据,我不知道为什么

public class WsnViaRxtxConnector extends AbstractWsnConnector{
private static final Logger LOG = LoggerFactory.getLogger(WsnViaRxtxConnector.class);
private String port;
private Provider<MessageDeserializer> deserializerProvider;
private ChannelFuture channelFuture;
public ChannelKeeper keeper;

@Inject
public WsnViaRxtxConnector(Provider<MessageDeserializer> deserializerProvider, ChannelKeeper keeper) {
    this.deserializerProvider = deserializerProvider;
    this.port = Configuration.getConfig().getString("rest.wsn.port");
    this.keeper = keeper;
    System.setProperty("gnu.io.rxtx.SerialPorts", this.port);
}

@Override
protected void run() throws Exception
{
    EventLoopGroup group = new OioEventLoopGroup();
    //final EventExecutorGroup group2 = new DefaultEventExecutorGroup(1500);

    try {
        Bootstrap b = new Bootstrap();
        b.group(group)
         .channel(RxtxChannel.class)
         .handler(new ChannelInitializer<RxtxChannel>() {
             @Override
             public void initChannel(RxtxChannel ch) throws Exception {
                 ch.pipeline().addLast(new DleStxEtxFrameDecoder(), new DleStxEtxFrameEncoder());   
                 ch.pipeline().addLast(new IntegrityCheck(),new IntegrityCalculation());
                 ch.pipeline().addLast(new AesCcmDecrypter(),new AesCcmEncrypter());
                 ch.pipeline().addLast(deserializerProvider.get(),new MessageSerializer());
                 ch.pipeline().addLast(new TimeStampJockel());
             }
         })
          .option(RxtxChannelOption.BAUD_RATE, 19200);
        ChannelFuture f = b.connect(new RxtxDeviceAddress(this.port)).sync();
        f.channel().closeFuture().sync();
    } finally {
        group.shutdownGracefully();
    }
}

[EDIT2]发现了我的错误。这是一场激烈的冲突。我在不同的项目中使用多个版本的netty,并使用了较旧的netty版本(4.0.13)而不是netty 4.044.final。我不知道这些版本之间发生了什么变化,但我很高兴现在一切正常。

您是否检查了写入调用的未来是否成功?你在哪里冲水?如果不调用flush(),任何内容都不会在endI处写入我现在调用writeAndFlush()的地方调用writeAndFlush()——一旦我的时间包生成(我做了很多测试,但没有重新替换它)。之后的bus.post是传入包的一些番石榴魔术。我用不同的接收设备(Arduino和iSense传感器节点)测试了写操作——时间包总是到达串行端口。我记录我将要发送的内容,并检查我收到的内容是否与之前由Tebuf记录的内容相匹配。只是我再也没有收到过。好吧,我发现了我的错误。这是一场激烈的冲突。显然,4.013版缺少4.044.final提供的一些功能。
public class TimeStampJockel extends ChannelInboundHandlerAdapter{
private static final Logger LOG = LoggerFactory.getLogger(TimeStampJockel.class);

private EventBus bus;
private ChannelKeeper keeper;

@Inject
public TimeStampJockel(){
    this.bus = GlobalEventBus.getInstance();
    this.keeper = keeper;
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg){
    LOG.debug("Creating packet from received data");

    RawPacket raw = (RawPacket)msg;

    //EventExecutor ex = ctx.executor();
    //LOG.debug("inexecutor.EventLoop(1):" + ex.inEventLoop());

    //keeper.addChannelHandlerContext(raw.getSource(),ctx);

    ByteBuf buf = raw.getContent();
    LOG.debug("\tBuffer: {}", HelperFunctions.getBufferAsHexString(buf));
    UnsignedLong mac = UnsignedLong.fromLongBits(21);
    while(buf.readerIndex()<buf.writerIndex())
    {
        int type = buf.readShort();
        int length = buf.readShort();
        ByteBuf value = buf.readBytes(length);
        if(PacketType.getEnum(type).equals(PacketType.MAC))
        {
            mac = UnsignedLong.valueOf(value.readLong());
        }
        else
        {
            AbstractPacket packet = PacketFactory.createPacket(PacketType.getEnum(type), raw.getVersion(), raw.getPacketType(), raw.getSource(), raw.getSource(), raw.getDestination(), mac, value);
            if(packet instanceof TimeReqPacket) {
                TimeReqPacket timeReqPacket = (TimeReqPacket) packet;
                Duration d = HelperFunctions.timeSinceYear2000();
                TimeRespPacket newPacket = new TimeRespPacket(Constants.PROTOCOL_VERSION, PacketType.TIME_RESP.getValue(), packet.getGatewayAdr(),UnsignedLong.valueOf(Configuration.getConfig().getLong("rest.wsn.mac", Long.MAX_VALUE)),timeReqPacket.getMac(),timeReqPacket.getMac(),d.getStandardSeconds(),HelperFunctions.getMillisOfDuration(d));

                ctx.write(newPacket);

            } else {
                bus.post(packet);
            }
        }
    }
}
ChannelFuture f = ctx.writeAndFlush(newPacket);
                f.addListener(new ChannelFutureListener() {

                    @Override
                    public void operationComplete(ChannelFuture future) throws Exception {
                        if (!future.isSuccess()) {
                            LOG.error("Server failed to send message", future.cause());
                            future.channel().close();
                        }
                    }