package cc.blynk.server.hardware.handlers.hardware;
import cc.blynk.server.Holder;
import cc.blynk.server.core.session.HardwareStateHolder;
import cc.blynk.server.core.session.StateHolderBase;
import cc.blynk.server.core.stats.GlobalStats;
import cc.blynk.server.handlers.BaseSimpleChannelInboundHandler;
import cc.blynk.server.hardware.handlers.hardware.mqtt.logic.MqttHardwareLogic;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.mqtt.MqttMessage;
import io.netty.handler.codec.mqtt.MqttMessageFactory;
import io.netty.handler.codec.mqtt.MqttMessageType;
import io.netty.handler.codec.mqtt.MqttPublishMessage;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 29.07.15.
*/
public class MqttHardwareHandler extends BaseSimpleChannelInboundHandler<MqttMessage> {
public final HardwareStateHolder state;
private final MqttHardwareLogic hardware;
private final GlobalStats stats;
public MqttHardwareHandler(Holder holder, HardwareStateHolder stateHolder) {
super(MqttMessage.class, holder.limits);
this.hardware = new MqttHardwareLogic(holder.sessionDao, holder.reportingDao);
this.state = stateHolder;
this.stats = holder.stats;
}
@Override
public void messageReceived(ChannelHandlerContext ctx, MqttMessage msg) {
this.stats.incrementMqttStat();
MqttMessageType messageType = msg.fixedHeader().messageType();
switch (messageType) {
case PUBLISH :
MqttPublishMessage publishMessage = (MqttPublishMessage) msg;
String topic = publishMessage.variableHeader().topicName();
switch (topic.toLowerCase()) {
case "hardware" :
hardware.messageReceived(ctx, state, publishMessage);
break;
}
break;
case PINGREQ :
ctx.writeAndFlush(MqttMessageFactory.newMessage(msg.fixedHeader(), msg.variableHeader(), null), ctx.voidPromise());
break;
case DISCONNECT :
log.trace("Got disconnect. Closing...");
ctx.close();
break;
}
}
@Override
public StateHolderBase getState() {
return state;
}
}