Example usage for io.netty.handler.codec.mqtt MqttMessage fixedHeader

List of usage examples for io.netty.handler.codec.mqtt MqttMessage fixedHeader

Introduction

In this page you can find the example usage for io.netty.handler.codec.mqtt MqttMessage fixedHeader.

Prototype

public MqttFixedHeader fixedHeader() 

Source Link

Usage

From source file:com.caricah.iotracah.server.mqttserver.transform.MqttIOTTransformerImpl.java

License:Apache License

@Override
public IOTMessage toIOTMessage(MqttMessage serverMessage) {

    MqttFixedHeader fxH = serverMessage.fixedHeader();

    if (null == fxH) {
        return null;
    }//w  w  w.  j a va 2 s.co  m

    switch (fxH.messageType()) {

    case PUBLISH:

        MqttPublishMessage publishMessage = (MqttPublishMessage) serverMessage;

        MqttPublishVariableHeader pubVH = publishMessage.variableHeader();

        ByteBuffer byteBuffer = publishMessage.payload().nioBuffer();

        return PublishMessage.from(pubVH.messageId(), fxH.isDup(), fxH.qosLevel().value(), fxH.isRetain(),
                pubVH.topicName(), byteBuffer, true);

    case PUBACK:

        MqttPubAckMessage pubAckMessage = (MqttPubAckMessage) serverMessage;

        MqttMessageIdVariableHeader msgIdVH = pubAckMessage.variableHeader();
        return AcknowledgeMessage.from(msgIdVH.messageId());

    case PUBREC:

        msgIdVH = (MqttMessageIdVariableHeader) serverMessage.variableHeader();
        return PublishReceivedMessage.from(msgIdVH.messageId());

    case PUBREL:

        msgIdVH = (MqttMessageIdVariableHeader) serverMessage.variableHeader();
        return ReleaseMessage.from(msgIdVH.messageId(), fxH.isDup());

    case PUBCOMP:

        msgIdVH = (MqttMessageIdVariableHeader) serverMessage.variableHeader();

        return CompleteMessage.from(msgIdVH.messageId());
    case PINGREQ:
    case PINGRESP:
        return Ping.from(fxH.isDup(), fxH.qosLevel().value(), fxH.isRetain());

    case CONNECT:

        MqttConnectMessage mqttConnectMessage = (MqttConnectMessage) serverMessage;
        MqttConnectVariableHeader conVH = mqttConnectMessage.variableHeader();
        MqttConnectPayload conPayload = mqttConnectMessage.payload();

        boolean isAnnonymousConnect = (!conVH.hasPassword() && !conVH.hasUserName());

        ConnectMessage connectionMessage = ConnectMessage.from(fxH.isDup(), fxH.qosLevel().value(),
                fxH.isRetain(), conVH.name(), conVH.version(), conVH.isCleanSession(), isAnnonymousConnect,
                conPayload.clientIdentifier(), conPayload.userName(), conPayload.password(),
                conVH.keepAliveTimeSeconds(), "");

        connectionMessage.setHasWill(conVH.isWillFlag());
        connectionMessage.setRetainWill(conVH.isWillRetain());
        connectionMessage.setWillQos(conVH.willQos());
        connectionMessage.setWillTopic(conPayload.willTopic());
        connectionMessage.setWillMessage(conPayload.willMessage());
        return connectionMessage;

    case CONNACK:

        MqttConnAckMessage connAckMessage = (MqttConnAckMessage) serverMessage;
        MqttConnAckVariableHeader connAckVH = connAckMessage.variableHeader();

        return ConnectAcknowledgeMessage.from(fxH.isDup(), fxH.qosLevel().value(), fxH.isRetain(), 20,
                connAckVH.connectReturnCode());

    case SUBSCRIBE:

        MqttSubscribeMessage subMsg = (MqttSubscribeMessage) serverMessage;
        msgIdVH = subMsg.variableHeader();
        MqttSubscribePayload subPayload = subMsg.payload();

        SubscribeMessage subscribeMessage = SubscribeMessage.from(msgIdVH.messageId(), fxH.isDup(),
                fxH.qosLevel().value(), fxH.isRetain());

        subPayload.topicSubscriptions().forEach(tSub -> {
            subscribeMessage.getTopicFilterList()
                    .add(new AbstractMap.SimpleEntry<>(tSub.topicName(), tSub.qualityOfService().value()));
        });

        return subscribeMessage;

    case UNSUBSCRIBE:

        MqttUnsubscribeMessage unSubMsg = (MqttUnsubscribeMessage) serverMessage;

        msgIdVH = unSubMsg.variableHeader();
        MqttUnsubscribePayload unsubscribePayload = unSubMsg.payload();

        return UnSubscribeMessage.from(msgIdVH.messageId(), fxH.isDup(), fxH.qosLevel().value(), fxH.isRetain(),
                unsubscribePayload.topics());

    case DISCONNECT:
        return DisconnectMessage.from(false);

    default:
        return null;
    }
}

From source file:io.crate.mqtt.netty.MqttMessageLogger.java

private void logMQTTMessage(ChannelHandlerContext ctx, Object message, String direction) {
    if (logger.isTraceEnabled() && message instanceof MqttMessage) {
        MqttMessage msg = (MqttMessage) message;
        String clientID = NettyUtils.clientID(ctx.channel());
        MqttMessageType messageType = msg.fixedHeader().messageType();
        switch (messageType) {
        case CONNECT:
        case CONNACK:
        case PINGREQ:
        case PINGRESP:
        case DISCONNECT:
            logger.trace("{} {} <{}>", direction, messageType, clientID);
            break;
        case SUBSCRIBE:
            MqttSubscribeMessage subscribe = (MqttSubscribeMessage) msg;
            logger.trace("{} SUBSCRIBE <{}> to topics {}", direction, clientID,
                    subscribe.payload().topicSubscriptions());
            break;
        case UNSUBSCRIBE:
            MqttUnsubscribeMessage unsubscribe = (MqttUnsubscribeMessage) msg;
            logger.trace("{} UNSUBSCRIBE <{}> to topics <{}>", direction, clientID,
                    unsubscribe.payload().topics());
            break;
        case PUBLISH:
            MqttPublishMessage publish = (MqttPublishMessage) msg;
            logger.trace("{} PUBLISH <{}> to topics <{}>", direction, clientID,
                    publish.variableHeader().topicName());
            break;
        case PUBREC:
        case PUBCOMP:
        case PUBREL:
        case PUBACK:
        case UNSUBACK:
            logger.trace("{} {} <{}> packetID <{}>", direction, messageType, clientID, messageId(msg));
            break;
        case SUBACK:
            MqttSubAckMessage suback = (MqttSubAckMessage) msg;
            List<Integer> grantedQoSLevels = suback.payload().grantedQoSLevels();
            logger.trace("{} SUBACK <{}> packetID <{}>, grantedQoses {}", direction, clientID, messageId(msg),
                    grantedQoSLevels);/*from w w w  .  j  a  va2  s .  c om*/
            break;
        default:
            logger.trace("{} {} <{}> Unknown message type received.", direction, messageType, clientID);
        }
    }
}

From source file:io.crate.mqtt.netty.MqttNettyHandler.java

@Override
public void channelRead(ChannelHandlerContext ctx, Object message) {
    MqttMessage msg = (MqttMessage) message;
    LOGGER.trace("Received a message of type {}", msg.fixedHeader().messageType().toString());
    try {/*from  w w  w  .  j  a  v a2 s .co  m*/
        switch (msg.fixedHeader().messageType()) {
        case CONNECT:
            processor.handleConnect(ctx.channel(), (MqttConnectMessage) msg);
            break;
        case PUBLISH:
            processor.handlePublish(ctx.channel(), (MqttPublishMessage) msg);
            break;
        case DISCONNECT:
            processor.handleDisconnect(ctx.channel());
            break;
        case PINGREQ:
            processor.handlePingReq(ctx.channel());
            break;
        default:
            String error = String.format(Locale.ENGLISH, "Message type %s is not supported.",
                    msg.fixedHeader().messageType().toString());
            throw new UnsupportedOperationException(error);
        }
    } catch (SQLActionException ex) {
        SQLActionException sqlActionException = (SQLActionException) ex;
        // 4041 is an unknown table exception, 4045 is an unknown schema exception
        if (sqlActionException.errorCode() == 4041 || sqlActionException.errorCode() == 4045) {
            LOGGER.error("Unable to process MQTT message, as the target table does not exist");
        } else {
            LOGGER.error("Unable to process MQTT message: ", sqlActionException.getDetailedMessage());
        }
    } catch (Exception ex) {
        if (ex.getMessage() == null) {
            // print stacktrace if exception has no message
            LOGGER.error("Error processing MQTT message", ex);
        } else {
            // less verbose logging
            LOGGER.error("Error processing MQTT message: {}", ex.getMessage());
        }
    }
}

From source file:io.crate.mqtt.operations.MqttPingIntegrationTest.java

@Test
public void testPing() throws Exception {
    mqttClient.sendMessage(MqttMessages.newPingRequest(MqttQoS.AT_LEAST_ONCE));
    MqttMessage response = mqttClient.lastReceivedMessage();
    assertThat(response.fixedHeader().messageType(), is(MqttMessageType.PINGRESP));
}

From source file:io.moquette.server.ConnectionDescriptorStore.java

License:Open Source License

public boolean sendMessage(MqttMessage message, Integer messageID, String clientID) {
    final MqttMessageType messageType = message.fixedHeader().messageType();
    try {//from w  ww  . j av a  2  s .  co  m
        if (messageID != null) {
            LOG.info("Sending {} message CId=<{}>, messageId={}", messageType, clientID, messageID);
        } else {
            LOG.debug("Sending {} message CId=<{}>", messageType, clientID);
        }

        ConnectionDescriptor descriptor = connectionDescriptors.get(clientID);
        if (descriptor == null) {
            if (messageID != null) {
                LOG.error("Client has just disconnected. {} message could not be sent. CId=<{}>, messageId={}",
                        messageType, clientID, messageID);
            } else {
                LOG.error("Client has just disconnected. {} could not be sent. CId=<{}>", messageType,
                        clientID);
            }
            /*
             * If the client has just disconnected, its connection descriptor will be null. We
             * don't have to make the broker crash: we'll just discard the PUBACK message.
             */
            return false;
        }
        descriptor.writeAndFlush(message);
        return true;
    } catch (Throwable e) {
        String errorMsg = "Unable to send " + messageType + " message. CId=<" + clientID + ">";
        if (messageID != null) {
            errorMsg += ", messageId=" + messageID;
        }
        LOG.error(errorMsg, e);
        return false;
    }
}

From source file:io.moquette.server.netty.metrics.DropWizardMetricsHandler.java

License:Open Source License

@Override
public void channelRead(ChannelHandlerContext ctx, Object message) {
    MqttMessage msg = (MqttMessage) message;
    MqttMessageType messageType = msg.fixedHeader().messageType();
    switch (messageType) {
    case PUBLISH:
        this.publishesMetrics.mark();
        break;//from  w  w  w  . j  a  v  a 2 s.  c om
    case SUBSCRIBE:
        this.subscribeMetrics.mark();
        break;
    case CONNECT:
        this.connectedClientsMetrics.inc();
        break;
    case DISCONNECT:
        this.connectedClientsMetrics.dec();
        break;
    default:
        break;
    }
    ctx.fireChannelRead(message);
}

From source file:io.moquette.Utils.java

License:Open Source License

static byte encodeFlags(MqttMessage message) {
    byte flags = 0;
    if (message.fixedHeader().isDup()) {
        flags |= 0x08;//  w  w  w. j  a v  a2 s  .  c om
    }
    if (message.fixedHeader().isRetain()) {
        flags |= 0x01;
    }

    flags |= (message.fixedHeader().qosLevel().value() & 0x03) << 1;
    return flags;
}

From source file:io.netty.example.mqtt.heartBeat.MqttHeartBeatBrokerHandler.java

License:Apache License

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    MqttMessage mqttMessage = (MqttMessage) msg;
    System.out.println("Received MQTT message: " + mqttMessage);
    switch (mqttMessage.fixedHeader().messageType()) {
    case CONNECT:
        MqttFixedHeader connackFixedHeader = new MqttFixedHeader(MqttMessageType.CONNACK, false,
                MqttQoS.AT_MOST_ONCE, false, 0);
        MqttConnAckVariableHeader mqttConnAckVariableHeader = new MqttConnAckVariableHeader(
                MqttConnectReturnCode.CONNECTION_ACCEPTED, false);
        MqttConnAckMessage connack = new MqttConnAckMessage(connackFixedHeader, mqttConnAckVariableHeader);
        ctx.writeAndFlush(connack);// w ww .  jav  a2 s. co  m
        break;
    case PINGREQ:
        MqttFixedHeader pingreqFixedHeader = new MqttFixedHeader(MqttMessageType.PINGRESP, false,
                MqttQoS.AT_MOST_ONCE, false, 0);
        MqttMessage pingResp = new MqttMessage(pingreqFixedHeader);
        ctx.writeAndFlush(pingResp);
        break;
    case DISCONNECT:
        ctx.close();
        break;
    default:
        System.out.println("Unexpected message type: " + mqttMessage.fixedHeader().messageType());
        ReferenceCountUtil.release(msg);
        ctx.close();
    }
}

From source file:io.vertx.mqtt.impl.MqttClientConnection.java

License:Apache License

/**
 * Handle the MQTT message received from the remote MQTT server
 *
 * @param msg Incoming Packet/*from  w ww .  j a  va  2  s .  com*/
 */
synchronized void handleMessage(Object msg) {

    // handling directly native Netty MQTT messages, some of them are translated
    // to the related Vert.x ones for polyglotization
    if (msg instanceof MqttMessage) {

        MqttMessage mqttMessage = (MqttMessage) msg;

        DecoderResult result = mqttMessage.decoderResult();
        if (result.isFailure()) {
            chctx.pipeline().fireExceptionCaught(result.cause());
            return;
        }
        if (!result.isFinished()) {
            chctx.pipeline().fireExceptionCaught(new Exception("Unfinished message"));
            return;
        }

        log.debug(String.format("Incoming packet %s", msg));
        switch (mqttMessage.fixedHeader().messageType()) {

        case CONNACK:

            io.netty.handler.codec.mqtt.MqttConnAckMessage connack = (io.netty.handler.codec.mqtt.MqttConnAckMessage) mqttMessage;

            MqttConnAckMessage mqttConnAckMessage = MqttConnAckMessage.create(
                    connack.variableHeader().connectReturnCode(), connack.variableHeader().isSessionPresent());
            handleConnack(mqttConnAckMessage);
            break;

        case PUBLISH:

            io.netty.handler.codec.mqtt.MqttPublishMessage publish = (io.netty.handler.codec.mqtt.MqttPublishMessage) mqttMessage;
            ByteBuf newBuf = VertxHandler.safeBuffer(publish.payload(), chctx.alloc());

            MqttPublishMessage mqttPublishMessage = MqttPublishMessage.create(
                    publish.variableHeader().messageId(), publish.fixedHeader().qosLevel(),
                    publish.fixedHeader().isDup(), publish.fixedHeader().isRetain(),
                    publish.variableHeader().topicName(), newBuf);
            handlePublish(mqttPublishMessage);
            break;

        case PUBACK:
            handlePuback(((MqttMessageIdVariableHeader) mqttMessage.variableHeader()).messageId());
            break;

        case PUBREC:
            handlePubrec(((MqttMessageIdVariableHeader) mqttMessage.variableHeader()).messageId());
            break;

        case PUBREL:
            handlePubrel(((MqttMessageIdVariableHeader) mqttMessage.variableHeader()).messageId());
            break;

        case PUBCOMP:
            handlePubcomp(((MqttMessageIdVariableHeader) mqttMessage.variableHeader()).messageId());
            break;

        case SUBACK:

            io.netty.handler.codec.mqtt.MqttSubAckMessage unsuback = (io.netty.handler.codec.mqtt.MqttSubAckMessage) mqttMessage;

            MqttSubAckMessage mqttSubAckMessage = MqttSubAckMessage
                    .create(unsuback.variableHeader().messageId(), unsuback.payload().grantedQoSLevels());
            handleSuback(mqttSubAckMessage);
            break;

        case UNSUBACK:
            handleUnsuback(((MqttMessageIdVariableHeader) mqttMessage.variableHeader()).messageId());
            break;

        case PINGRESP:
            handlePingresp();
            break;

        default:

            this.chctx.pipeline()
                    .fireExceptionCaught(new Exception("Wrong message type " + msg.getClass().getName()));
            break;
        }

    } else {

        this.chctx.pipeline().fireExceptionCaught(new Exception("Wrong message type"));
    }
}

From source file:io.vertx.mqtt.impl.MqttConnection.java

License:Apache License

/**
 * Handle the MQTT message received by the remote MQTT client
 *
 * @param msg message to handle//from   w w  w.j a va  2 s. c  om
 */
synchronized void handleMessage(Object msg) {

    // handling directly native Netty MQTT messages because we don't need to
    // expose them at higher level (so no need for polyglotization)
    if (msg instanceof io.netty.handler.codec.mqtt.MqttMessage) {

        io.netty.handler.codec.mqtt.MqttMessage mqttMessage = (io.netty.handler.codec.mqtt.MqttMessage) msg;

        DecoderResult result = mqttMessage.decoderResult();
        if (result.isFailure()) {
            channel.pipeline().fireExceptionCaught(result.cause());
            return;
        }
        if (!result.isFinished()) {
            channel.pipeline().fireExceptionCaught(new Exception("Unfinished message"));
            return;
        }

        switch (mqttMessage.fixedHeader().messageType()) {

        case CONNECT:
            handleConnect((MqttConnectMessage) msg);
            break;

        case PUBACK:

            io.netty.handler.codec.mqtt.MqttPubAckMessage mqttPubackMessage = (io.netty.handler.codec.mqtt.MqttPubAckMessage) mqttMessage;
            this.handlePuback(mqttPubackMessage.variableHeader().messageId());
            break;

        case PUBREC:

            int pubrecMessageId = ((io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader) mqttMessage
                    .variableHeader()).messageId();
            this.handlePubrec(pubrecMessageId);
            break;

        case PUBREL:

            int pubrelMessageId = ((io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader) mqttMessage
                    .variableHeader()).messageId();
            this.handlePubrel(pubrelMessageId);
            break;

        case PUBCOMP:

            int pubcompMessageId = ((io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader) mqttMessage
                    .variableHeader()).messageId();
            this.handlePubcomp(pubcompMessageId);
            break;

        case PINGREQ:

            this.handlePingreq();
            break;

        case DISCONNECT:

            this.handleDisconnect();
            break;

        default:

            this.channel.pipeline()
                    .fireExceptionCaught(new Exception("Wrong message type " + msg.getClass().getName()));
            break;

        }

        // handling mapped Vert.x MQTT messages (from Netty ones) because they'll be provided
        // to the higher layer (so need for ployglotization)
    } else {

        if (msg instanceof MqttSubscribeMessage) {

            this.handleSubscribe((MqttSubscribeMessage) msg);

        } else if (msg instanceof MqttUnsubscribeMessage) {

            this.handleUnsubscribe((MqttUnsubscribeMessage) msg);

        } else if (msg instanceof MqttPublishMessage) {

            this.handlePublish((MqttPublishMessage) msg);

        } else {

            this.channel.pipeline().fireExceptionCaught(new Exception("Wrong message type"));
        }
    }
}