Example usage for io.netty.handler.codec.mqtt MqttSubscribePayload MqttSubscribePayload

List of usage examples for io.netty.handler.codec.mqtt MqttSubscribePayload MqttSubscribePayload

Introduction

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

Prototype

public MqttSubscribePayload(List<MqttTopicSubscription> topicSubscriptions) 

Source Link

Usage

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

License:Apache License

/**
 * See {@link MqttClient#subscribe(Map, Handler)} for more details
 *//*from  w  w w . j a  va 2  s.  com*/
@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:net.anyflow.lannister.message.MessageFactory.java

License:Apache License

public static MqttSubscribeMessage subscribe(int messageId, MqttTopicSubscription... topicSubscriptions) {
    int topicNameSize = 0;
    int topicCount = topicSubscriptions.length;

    for (MqttTopicSubscription item : topicSubscriptions) {
        topicNameSize += item.topicName().getBytes(CharsetUtil.UTF_8).length;
    }/*ww  w. j  a  v  a 2s.c  o m*/

    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.SUBSCRIBE, false, MqttQoS.AT_LEAST_ONCE,
            false, 2 + topicNameSize + topicCount);
    MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(messageId);
    MqttSubscribePayload payload = new MqttSubscribePayload(Lists.newArrayList(topicSubscriptions));

    return new MqttSubscribeMessage(fixedHeader, variableHeader, payload);
}

From source file:org.thingsboard.mqtt.MqttClientImpl.java

License:Apache License

private Future<Void> createSubscription(String topic, MqttHandler handler, boolean once, MqttQoS qos) {
    if (this.pendingSubscribeTopics.contains(topic)) {
        Optional<Map.Entry<Integer, MqttPendingSubscription>> subscriptionEntry = this.pendingSubscriptions
                .entrySet().stream().filter((e) -> e.getValue().getTopic().equals(topic)).findAny();
        if (subscriptionEntry.isPresent()) {
            subscriptionEntry.get().getValue().addHandler(handler, once);
            return subscriptionEntry.get().getValue().getFuture();
        }//  w  w  w  .jav  a  2 s  .  co  m
    }
    if (this.serverSubscriptions.contains(topic)) {
        MqttSubscription subscription = new MqttSubscription(topic, handler, once);
        this.subscriptions.put(topic, subscription);
        this.handlerToSubscribtion.put(handler, subscription);
        return this.channel.newSucceededFuture();
    }

    Promise<Void> future = new DefaultPromise<>(this.eventLoop.next());
    MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.SUBSCRIBE, false, MqttQoS.AT_LEAST_ONCE,
            false, 0);
    MqttTopicSubscription subscription = new MqttTopicSubscription(topic, qos);
    MqttMessageIdVariableHeader variableHeader = getNewMessageId();
    MqttSubscribePayload payload = new MqttSubscribePayload(Collections.singletonList(subscription));
    MqttSubscribeMessage message = new MqttSubscribeMessage(fixedHeader, variableHeader, payload);

    final MqttPendingSubscription pendingSubscription = new MqttPendingSubscription(future, topic, message);
    pendingSubscription.addHandler(handler, once);
    this.pendingSubscriptions.put(variableHeader.messageId(), pendingSubscription);
    this.pendingSubscribeTopics.add(topic);
    pendingSubscription.setSent(this.sendAndFlushPacket(message) != null); //If not sent, we will send it when the connection is opened

    pendingSubscription.startRetransmitTimer(this.eventLoop.next(), this::sendAndFlushPacket);

    return future;
}