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