package cc.blynk.server.hardware;
import cc.blynk.server.Holder;
import cc.blynk.server.core.BaseServer;
import cc.blynk.server.handlers.common.HardwareNotLoggedHandler;
import cc.blynk.server.hardware.handlers.hardware.HardwareChannelStateHandler;
import cc.blynk.server.hardware.handlers.hardware.mqtt.auth.MqttHardwareLoginHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.mqtt.MqttDecoder;
import io.netty.handler.codec.mqtt.MqttEncoder;
import io.netty.handler.timeout.ReadTimeoutHandler;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 2/1/2015.
*/
public class MQTTHardwareServer extends BaseServer {
private final ChannelInitializer<SocketChannel> channelInitializer;
public MQTTHardwareServer(Holder holder) {
super(holder.props.getProperty("listen.address"), holder.props.getIntProperty("hardware.mqtt.port"), holder.transportTypeHolder);
final int hardTimeoutSecs = holder.limits.HARDWARE_IDLE_TIMEOUT;
final MqttHardwareLoginHandler mqttHardwareLoginHandler = new MqttHardwareLoginHandler(holder);
final HardwareChannelStateHandler hardwareChannelStateHandler = new HardwareChannelStateHandler(holder.sessionDao, holder.gcmWrapper);
channelInitializer = new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
//non-sharable handlers
if (hardTimeoutSecs > 0) {
pipeline.addLast("MqttReadTimeout", new ReadTimeoutHandler(hardTimeoutSecs));
}
pipeline.addLast(hardwareChannelStateHandler)
.addLast(new MqttDecoder())
.addLast(MqttEncoder.INSTANCE)
.addLast(mqttHardwareLoginHandler)
.addLast(new HardwareNotLoggedHandler());
}
};
log.debug("hard.socket.idle.timeout = {}", hardTimeoutSecs);
}
@Override
public ChannelInitializer<SocketChannel> getChannelInitializer() {
return channelInitializer;
}
@Override
protected String getServerName() {
return "Mqtt hardware";
}
@Override
public void close() {
System.out.println("Shutting down Mqtt hardware server...");
super.close();
}
}