Example usage for io.netty.handler.codec.mqtt MqttMessageFactory newMessage

List of usage examples for io.netty.handler.codec.mqtt MqttMessageFactory newMessage

Introduction

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

Prototype

public static MqttMessage newMessage(MqttFixedHeader mqttFixedHeader, Object variableHeader, Object payload) 

Source Link

Usage

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

License:Apache License

@Override
public MqttMessage toServerMessage(IOTMessage internalMessage) {

    switch (internalMessage.getMessageType()) {

    case PublishMessage.MESSAGE_TYPE:

        PublishMessage pubMsg = (PublishMessage) internalMessage;
        //We generate a publish message.
        MqttPublishVariableHeader respVariableHeader = new MqttPublishVariableHeader(pubMsg.getTopic(),
                pubMsg.getMessageId());/* w ww . j  a  v  a 2 s .c om*/

        MqttFixedHeader respFixedHeader = new MqttFixedHeader(MqttMessageType.PUBLISH, pubMsg.getIsDuplicate(),
                MqttQoS.valueOf(pubMsg.getQos()), pubMsg.getIsRetain(), 0);
        ByteBuf content = Unpooled.wrappedBuffer((byte[]) pubMsg.getPayload());

        return MqttMessageFactory.newMessage(respFixedHeader, respVariableHeader, content);

    case AcknowledgeMessage.MESSAGE_TYPE:

        //Generate a PUBACK for qos 1 messages.
        AcknowledgeMessage ackMsg = (AcknowledgeMessage) internalMessage;
        MqttFixedHeader ackFixedHeader = new MqttFixedHeader(MqttMessageType.PUBACK, ackMsg.isDup(),
                MqttQoS.valueOf(ackMsg.getQos()), ackMsg.isRetain(), 0);
        MqttMessageIdVariableHeader msgIdVariableHeader = MqttMessageIdVariableHeader
                .from(ackMsg.getMessageId());
        return MqttMessageFactory.newMessage(ackFixedHeader, msgIdVariableHeader, null);

    case PublishReceivedMessage.MESSAGE_TYPE:

        //We need to generate a PUBREC message to acknowledge reception of message.
        PublishReceivedMessage pubrec = (PublishReceivedMessage) internalMessage;
        MqttFixedHeader recFixedHeader = new MqttFixedHeader(MqttMessageType.PUBREC, false,
                MqttQoS.valueOf(pubrec.getQos()), false, 0);
        msgIdVariableHeader = MqttMessageIdVariableHeader.from(pubrec.getMessageId());
        return MqttMessageFactory.newMessage(recFixedHeader, msgIdVariableHeader, null);

    case ReleaseMessage.MESSAGE_TYPE:

        //We need to generate a PUBREL message to release cached message.
        ReleaseMessage pubrel = (ReleaseMessage) internalMessage;
        MqttFixedHeader relFixedHeader = new MqttFixedHeader(MqttMessageType.PUBREL, pubrel.isDup(),
                MqttQoS.valueOf(pubrel.getQos()), false, 0);
        msgIdVariableHeader = MqttMessageIdVariableHeader.from(pubrel.getMessageId());
        return MqttMessageFactory.newMessage(relFixedHeader, msgIdVariableHeader, null);

    case CompleteMessage.MESSAGE_TYPE:

        //We need to generate a PUBCOMP message to acknowledge finalization of transmission of qos 2 message.
        CompleteMessage destroyMessage = (CompleteMessage) internalMessage;
        MqttFixedHeader compFixedHeader = new MqttFixedHeader(MqttMessageType.PUBCOMP, false,
                MqttQoS.valueOf(destroyMessage.getQos()), false, 0);
        msgIdVariableHeader = MqttMessageIdVariableHeader.from(destroyMessage.getMessageId());
        return MqttMessageFactory.newMessage(compFixedHeader, msgIdVariableHeader, null);

    case Ping.MESSAGE_TYPE:

        Ping ping = (Ping) internalMessage;
        //We need to generate a PINGRESP message to respond to a PINGREQ.
        recFixedHeader = new MqttFixedHeader(MqttMessageType.PINGRESP, ping.isDup(),
                MqttQoS.valueOf(ping.getQos()), ping.isRetain(), 0);
        return MqttMessageFactory.newMessage(recFixedHeader, null, null);

    case ConnectAcknowledgeMessage.MESSAGE_TYPE:

        ConnectAcknowledgeMessage connAck = (ConnectAcknowledgeMessage) internalMessage;
        MqttFixedHeader connAckFixedHeader = new MqttFixedHeader(MqttMessageType.CONNACK, connAck.isDup(),
                MqttQoS.valueOf(connAck.getQos()), connAck.isRetain(), 0);
        MqttConnAckVariableHeader conAckVariableHeader = new MqttConnAckVariableHeader(connAck.getReturnCode());
        //Todo: Raise netty codec issue for lack of codec 3.2.2.2 Session Present flag.

        return MqttMessageFactory.newMessage(connAckFixedHeader, conAckVariableHeader, null);

    case SubscribeAcknowledgeMessage.MESSAGE_TYPE:

        SubscribeAcknowledgeMessage subAckMsg = (SubscribeAcknowledgeMessage) internalMessage;
        MqttSubAckPayload payload = new MqttSubAckPayload(subAckMsg.getGrantedQos());

        MqttFixedHeader subAckFixedHeader = new MqttFixedHeader(MqttMessageType.SUBACK, subAckMsg.isDup(),
                MqttQoS.valueOf(subAckMsg.getQos()), subAckMsg.isRetain(), 0);
        MqttMessageIdVariableHeader subAckVariableHeader = MqttMessageIdVariableHeader
                .from(subAckMsg.getMessageId());
        return MqttMessageFactory.newMessage(subAckFixedHeader, subAckVariableHeader, payload);

    case UnSubscribeAcknowledgeMessage.MESSAGE_TYPE:

        UnSubscribeAcknowledgeMessage unSubAckMsg = (UnSubscribeAcknowledgeMessage) internalMessage;
        respFixedHeader = new MqttFixedHeader(MqttMessageType.UNSUBACK, unSubAckMsg.isDup(),
                MqttQoS.valueOf(unSubAckMsg.getQos()), unSubAckMsg.isRetain(), 0);
        MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader
                .from(unSubAckMsg.getMessageId());
        return MqttMessageFactory.newMessage(respFixedHeader, variableHeader, null);

    default:
        /**
         *
         * Internally these are not expected to get here.
         * In such cases we just return a null
         * and log this anomaly as a gross error.
         *
         *
         * if(internalMessage instanceof ConnectMessage ||
         * internalMessage instanceof SubscribeMessage ||
         * internalMessage instanceof UnSubscribeMessage ||
         * internalMessage instanceof DisconnectMessage ||
         * internalMessage instanceof WillMessage ){
         * }
         **/

        return null;
    }

}

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

License:Apache License

private void doConnect(int port, String host, String serverName,
        Handler<AsyncResult<MqttConnAckMessage>> connectHandler) {

    log.debug(String.format("Trying to connect with %s:%d", host, port));
    this.client.connect(port, host, serverName, done -> {

        // the TCP connection fails
        if (done.failed()) {
            log.error(String.format("Can't connect to %s:%d", host, port), done.cause());
            if (connectHandler != null) {
                connectHandler.handle(Future.failedFuture(done.cause()));
            }//from  ww w  . j ava2 s . c  o m
        } else {
            log.info(String.format("Connection with %s:%d established successfully", host, port));

            NetSocketInternal soi = (NetSocketInternal) done.result();
            ChannelPipeline pipeline = soi.channelHandlerContext().pipeline();
            this.connectHandler = connectHandler;

            if (options.isAutoGeneratedClientId()
                    && (options.getClientId() == null || options.getClientId().isEmpty())) {
                options.setClientId(generateRandomClientId());
            }

            initChannel(pipeline);
            this.connection = new MqttClientConnection(this, soi, options);

            soi.messageHandler(msg -> connection.handleMessage(msg));
            soi.closeHandler(v -> handleClosed());

            // an exception at connection level
            soi.exceptionHandler(this::handleException);

            MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.CONNECT, false, AT_MOST_ONCE,
                    false, 0);

            MqttConnectVariableHeader variableHeader = new MqttConnectVariableHeader(PROTOCOL_NAME,
                    PROTOCOL_VERSION, options.hasUsername(), options.hasPassword(), options.isWillRetain(),
                    options.getWillQoS(), options.isWillFlag(), options.isCleanSession(),
                    options.getKeepAliveTimeSeconds());

            MqttConnectPayload payload = new MqttConnectPayload(
                    options.getClientId() == null ? "" : options.getClientId(), options.getWillTopic(),
                    options.getWillMessage() != null ? options.getWillMessage().getBytes(StandardCharsets.UTF_8)
                            : null,
                    options.hasUsername() ? options.getUsername() : null,
                    options.hasPassword() ? options.getPassword().getBytes() : null);

            io.netty.handler.codec.mqtt.MqttMessage connect = MqttMessageFactory.newMessage(fixedHeader,
                    variableHeader, payload);

            this.write(connect);
        }

    });
}

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

License:Apache License

/**
 * See {@link MqttClient#disconnect(Handler)} for more details
 *//*from  ww  w . j  a va2s.  c o  m*/
@Override
public MqttClient disconnect(Handler<AsyncResult<Void>> disconnectHandler) {

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.DISCONNECT, false, AT_MOST_ONCE, false,
            0);

    io.netty.handler.codec.mqtt.MqttMessage disconnect = MqttMessageFactory.newMessage(fixedHeader, null, null);

    this.write(disconnect);

    if (disconnectHandler != null) {
        disconnectHandler.handle(Future.succeededFuture());
    }

    this.connection.close();
    return this;
}

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

License:Apache License

/**
 * See {@link MqttClient#publish(String, Buffer, MqttQoS, boolean, boolean, Handler)} for more details
 *//* w ww . j  av a2s.  c  o m*/
@Override
public MqttClient publish(String topic, Buffer payload, MqttQoS qosLevel, boolean isDup, boolean isRetain,
        Handler<AsyncResult<Integer>> publishSentHandler) {

    if (countInflightQueue >= options.getMaxInflightQueue()) {
        String msg = String.format("Attempt to exceed the limit of %d inflight messages",
                options.getMaxInflightQueue());
        log.error(msg);
        MqttException exception = new MqttException(MqttException.MQTT_INFLIGHT_QUEUE_FULL, msg);
        if (publishSentHandler != null) {
            publishSentHandler.handle(Future.failedFuture(exception));
        }
        return this;
    }

    if (!isValidTopicName(topic)) {
        String msg = String.format(
                "Invalid Topic Name - %s. It mustn't contains wildcards: # and +. Also it can't contains U+0000(NULL) chars",
                topic);
        log.error(msg);
        MqttException exception = new MqttException(MqttException.MQTT_INVALID_TOPIC_NAME, msg);
        if (publishSentHandler != null) {
            publishSentHandler.handle(Future.failedFuture(exception));
        }
        return this;
    }

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBLISH, isDup, qosLevel, isRetain, 0);

    MqttPublishVariableHeader variableHeader = new MqttPublishVariableHeader(topic, nextMessageId());

    ByteBuf buf = Unpooled.copiedBuffer(payload.getBytes());

    io.netty.handler.codec.mqtt.MqttMessage publish = MqttMessageFactory.newMessage(fixedHeader, variableHeader,
            buf);

    switch (qosLevel) {
    case AT_LEAST_ONCE:
        qos1outbound.put(variableHeader.messageId(), publish);
        countInflightQueue++;
        break;
    case EXACTLY_ONCE:
        qos2outbound.put(variableHeader.messageId(), publish);
        countInflightQueue++;
        break;
    }

    this.write(publish);

    if (publishSentHandler != null) {
        publishSentHandler.handle(Future.succeededFuture(variableHeader.messageId()));
    }

    return this;
}

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

License:Apache License

/**
 * See {@link MqttClient#subscribe(Map, Handler)} for more details
 *///from   w  ww  .j ava2  s .  c o  m
@Override
public MqttClient subscribe(Map<String, Integer> topics, Handler<AsyncResult<Integer>> subscribeSentHandler) {

    Map<String, Integer> invalidTopics = topics.entrySet().stream().filter(e -> !isValidTopicFilter(e.getKey()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    if (invalidTopics.size() > 0) {
        String msg = String.format("Invalid Topic Filters: %s", invalidTopics);
        log.error(msg);
        MqttException exception = new MqttException(MqttException.MQTT_INVALID_TOPIC_FILTER, msg);
        if (subscribeSentHandler != null) {
            subscribeSentHandler.handle(Future.failedFuture(exception));
        }
        return this;
    }

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.SUBSCRIBE, false, AT_LEAST_ONCE, false,
            0);

    MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(nextMessageId());
    List<MqttTopicSubscription> subscriptions = topics.entrySet().stream()
            .map(e -> new MqttTopicSubscription(e.getKey(), valueOf(e.getValue())))
            .collect(Collectors.toList());

    MqttSubscribePayload payload = new MqttSubscribePayload(subscriptions);

    io.netty.handler.codec.mqtt.MqttMessage subscribe = MqttMessageFactory.newMessage(fixedHeader,
            variableHeader, payload);

    this.write(subscribe);

    if (subscribeSentHandler != null) {
        subscribeSentHandler.handle(Future.succeededFuture(variableHeader.messageId()));
    }
    return this;
}

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

License:Apache License

/**
 * See {@link MqttClient#unsubscribe(String, Handler)} )} for more details
 *///  w  w  w .  ja  v  a 2  s. c o m
@Override
public MqttClient unsubscribe(String topic, Handler<AsyncResult<Integer>> unsubscribeSentHandler) {

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.UNSUBSCRIBE, false, AT_LEAST_ONCE, false,
            0);

    MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(nextMessageId());

    MqttUnsubscribePayload payload = new MqttUnsubscribePayload(Stream.of(topic).collect(Collectors.toList()));

    io.netty.handler.codec.mqtt.MqttMessage unsubscribe = MqttMessageFactory.newMessage(fixedHeader,
            variableHeader, payload);

    this.write(unsubscribe);

    if (unsubscribeSentHandler != null) {
        unsubscribeSentHandler.handle(Future.succeededFuture(variableHeader.messageId()));
    }
    return this;
}

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

License:Apache License

/**
 * See {@link MqttClient#ping()} for more details
 *///from   w  w  w . jav  a2  s  . c o m
@Override
public MqttClient ping() {

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PINGREQ, false, MqttQoS.AT_MOST_ONCE,
            false, 0);

    io.netty.handler.codec.mqtt.MqttMessage pingreq = MqttMessageFactory.newMessage(fixedHeader, null, null);

    this.write(pingreq);

    return this;
}

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

License:Apache License

/**
 * Sends PUBACK packet to server/*from   w w  w.j  av  a  2  s .  c o  m*/
 *
 * @param publishMessageId identifier of the PUBLISH message to acknowledge
 */
void publishAcknowledge(int publishMessageId) {

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBACK, false, AT_MOST_ONCE, false, 0);

    MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(publishMessageId);

    io.netty.handler.codec.mqtt.MqttMessage puback = MqttMessageFactory.newMessage(fixedHeader, variableHeader,
            null);

    this.write(puback);
}

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

License:Apache License

/**
 * Sends PUBREC packet to server/*from w  ww .  j a  v  a2 s  . c o  m*/
 *
 * @param publishMessage a PUBLISH message to acknowledge
 */
void publishReceived(MqttPublishMessage publishMessage) {

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBREC, false, AT_MOST_ONCE, false, 0);

    MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(publishMessage.messageId());

    io.netty.handler.codec.mqtt.MqttMessage pubrec = MqttMessageFactory.newMessage(fixedHeader, variableHeader,
            null);

    qos2inbound.put(publishMessage.messageId(), publishMessage);
    this.write(pubrec);
}

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

License:Apache License

/**
 * Sends PUBCOMP packet to server/*from   www.j a  va  2 s  .  c om*/
 *
 * @param publishMessageId identifier of the PUBLISH message to acknowledge
 */
void publishComplete(int publishMessageId) {

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBCOMP, false, AT_MOST_ONCE, false, 0);

    MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(publishMessageId);

    io.netty.handler.codec.mqtt.MqttMessage pubcomp = MqttMessageFactory.newMessage(fixedHeader, variableHeader,
            null);

    this.write(pubcomp);
}