List of usage examples for io.netty.handler.codec.mqtt MqttSubscribePayload MqttSubscribePayload
public MqttSubscribePayload(List<MqttTopicSubscription> topicSubscriptions)
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; }