/** * Create the SUBACK response from a list of topicFilters */ private MqttSubAckMessage doAckMessageFromValidateFilters(List<MqttTopicSubscription> topicFilters, int messageId) { List<Integer> grantedQoSLevels = new ArrayList<>(); for (MqttTopicSubscription req : topicFilters) { grantedQoSLevels.add(req.qualityOfService().value()); } MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.SUBACK, false, AT_MOST_ONCE, false, 0); MqttSubAckPayload payload = new MqttSubAckPayload(grantedQoSLevels); return new MqttSubAckMessage(fixedHeader, from(messageId), payload); }
public void subscribeClientToTopics(MqttSubscribeMessage msg, String clientID, String username, MQTTConnection mqttConnection) { // verify which topics of the subscribe ongoing has read access permission int messageID = messageId(msg); List<MqttTopicSubscription> ackTopics = authorizator.verifyTopicsReadAccess(clientID, username, msg); MqttSubAckMessage ackMessage = doAckMessageFromValidateFilters(ackTopics, messageID); // store topics subscriptions in session List<Subscription> newSubscriptions = ackTopics.stream() .filter(req -> req.qualityOfService() != FAILURE) .map(req -> { final Topic topic = new Topic(req.topicName()); return new Subscription(clientID, topic, req.qualityOfService()); }).collect(Collectors.toList()); for (Subscription subscription : newSubscriptions) { subscriptions.add(subscription); } // add the subscriptions to Session Session session = sessionRegistry.retrieve(clientID); session.addSubscriptions(newSubscriptions); // send ack message mqttConnection.sendSubAckMessage(messageID, ackMessage); publishRetainedMessagesForSubscriptions(clientID, newSubscriptions); for (Subscription subscription : newSubscriptions) { interceptor.notifyTopicSubscribed(subscription, username); } }
LOG.debug("Client will be subscribed to the topic CId={}, username: {}, messageId: {}, topic: {}", clientID, username, messageId, topic); qos = req.qualityOfService(); } else { LOG.warn("Topic filter is not valid CId={}, username: {}, messageId: {}, topic: {}", clientID,
buf.writeShort(topicNameBytes.length); buf.writeBytes(topicNameBytes, 0, topicNameBytes.length); buf.writeByte(topic.qualityOfService().value());
topicSubscriptions.forEach(s -> { String topic = s.topicName(); int actualQos = MessageUtil.actualQos(s.qualityOfService().value()); grantQoss.add(actualQos); subscriptionStore.append(
/** * Constructor * * @param messageId message identifier * @param topicSubscriptions list with topics and related quality of service levels (from Netty) */ public MqttSubscribeMessageImpl(int messageId, List<io.netty.handler.codec.mqtt.MqttTopicSubscription> topicSubscriptions) { this.messageId = messageId; this.topicSubscriptions = topicSubscriptions.stream().map(ts -> { return new MqttTopicSubscriptionImpl(ts.topicName(), ts.qualityOfService()); }).collect(Collectors.toList()); }
/** * Constructor * * @param messageId message identifier * @param topicSubscriptions list with topics and related quality of service levels (from Netty) */ public MqttSubscribeMessageImpl(int messageId, List<io.netty.handler.codec.mqtt.MqttTopicSubscription> topicSubscriptions) { this.messageId = messageId; this.topicSubscriptions = topicSubscriptions.stream().map(ts -> { return new MqttTopicSubscriptionImpl(ts.topicName(), ts.qualityOfService()); }).collect(Collectors.toList()); }
/** * Constructor * * @param messageId message identifier * @param topicSubscriptions list with topics and related quality of service levels (from Netty) */ public MqttSubscribeMessageImpl(int messageId, List<io.netty.handler.codec.mqtt.MqttTopicSubscription> topicSubscriptions) { this.messageId = messageId; this.topicSubscriptions = topicSubscriptions.stream().map(ts -> { return new MqttTopicSubscriptionImpl(ts.topicName(), ts.qualityOfService()); }).collect(Collectors.toList()); }
/** * As per MQTT Spec. Subscribes this client to a number of MQTT topics. * * @param subscriptions * @return An array of integers representing the list of accepted QoS for each topic. * @throws Exception */ int[] addSubscriptions(List<MqttTopicSubscription> subscriptions) throws Exception { int[] qos = new int[subscriptions.size()]; for (int i = 0; i < subscriptions.size(); i++) { addSubscription(subscriptions.get(i)); qos[i] = subscriptions.get(i).qualityOfService().value(); } return qos; }
/** * As per MQTT Spec. Subscribes this client to a number of MQTT topics. * * @param subscriptions * @return An array of integers representing the list of accepted QoS for each topic. * @throws Exception */ int[] addSubscriptions(List<MqttTopicSubscription> subscriptions) throws Exception { int[] qos = new int[subscriptions.size()]; for (int i = 0; i < subscriptions.size(); i++) { addSubscription(subscriptions.get(i)); qos[i] = subscriptions.get(i).qualityOfService().value(); } return qos; }
private List<Subscription> doStoreSubscription(List<MqttTopicSubscription> ackTopics, String clientID) { ClientSession clientSession = this.sessionsRepository.sessionForClient(clientID); List<Subscription> newSubscriptions = new ArrayList<>(); for (MqttTopicSubscription req : ackTopics) { // TODO this is SUPER UGLY if (req.qualityOfService() == FAILURE) { continue; } final Topic topic = new Topic(req.topicName()); Subscription newSubscription = new Subscription(clientID, topic, req.qualityOfService()); clientSession.subscribe(newSubscription); newSubscriptions.add(newSubscription); } return newSubscriptions; }
boolean addSubscription(MqttTopicSubscription subscription, WildcardConfiguration wildcardConfiguration) { // synchronized to prevent race with removeSubscription synchronized (subscriptions) { addressMessageMap.putIfAbsent(MQTTUtil.convertMQTTAddressFilterToCore(subscription.topicName(), wildcardConfiguration), new ConcurrentHashMap<Long, Integer>()); MqttTopicSubscription existingSubscription = subscriptions.get(subscription.topicName()); if (existingSubscription != null) { if (subscription.qualityOfService().value() > existingSubscription.qualityOfService().value()) { subscriptions.put(subscription.topicName(), subscription); return true; } } else { subscriptions.put(subscription.topicName(), subscription); return true; } } return false; }
boolean addSubscription(MqttTopicSubscription subscription, WildcardConfiguration wildcardConfiguration) { // synchronized to prevent race with removeSubscription synchronized (subscriptions) { addressMessageMap.putIfAbsent(MQTTUtil.convertMQTTAddressFilterToCore(subscription.topicName(), wildcardConfiguration), new ConcurrentHashMap<Long, Integer>()); MqttTopicSubscription existingSubscription = subscriptions.get(subscription.topicName()); if (existingSubscription != null) { if (subscription.qualityOfService().value() > existingSubscription.qualityOfService().value()) { subscriptions.put(subscription.topicName(), subscription); return true; } } else { subscriptions.put(subscription.topicName(), subscription); return true; } } return false; }
/** * Create the SUBACK response from a list of topicFilters */ private MqttSubAckMessage doAckMessageFromValidateFilters(List<MqttTopicSubscription> topicFilters, int messageId) { List<Integer> grantedQoSLevels = new ArrayList<>(); for (MqttTopicSubscription req : topicFilters) { grantedQoSLevels.add(req.qualityOfService().value()); } MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.SUBACK, false, AT_MOST_ONCE, false, 0); MqttSubAckPayload payload = new MqttSubAckPayload(grantedQoSLevels); return new MqttSubAckMessage(fixedHeader, from(messageId), payload); }
private void subBack(Channel channel, MqttSubscribeMessage mqttSubscribeMessage, int num) { MqttFixedHeader mqttFixedHeader = new MqttFixedHeader(MqttMessageType.SUBACK, false, MqttQoS.AT_MOST_ONCE, false, 0); MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(mqttSubscribeMessage.variableHeader().messageId()); List<Integer> grantedQoSLevels = new ArrayList<>(num); for (int i = 0; i < num; i++) { grantedQoSLevels.add(mqttSubscribeMessage.payload().topicSubscriptions().get(i).qualityOfService().value()); } MqttSubAckPayload payload = new MqttSubAckPayload(grantedQoSLevels); MqttSubAckMessage mqttSubAckMessage = new MqttSubAckMessage(mqttFixedHeader, variableHeader, payload); channel.writeAndFlush(mqttSubAckMessage); }
synchronized void start() throws Exception { for (MqttTopicSubscription subscription : session.getSessionState().getSubscriptions()) { String coreAddress = MQTTUtil.convertMQTTAddressFilterToCore(subscription.topicName(), session.getWildcardConfiguration()); Queue q = createQueueForSubscription(coreAddress, subscription.qualityOfService().value()); createConsumerForSubscriptionQueue(q, subscription.topicName(), subscription.qualityOfService().value()); } }
synchronized void start() throws Exception { for (MqttTopicSubscription subscription : session.getSessionState().getSubscriptions()) { String coreAddress = MQTTUtil.convertMQTTAddressFilterToCore(subscription.topicName(), session.getWildcardConfiguration()); Queue q = createQueueForSubscription(coreAddress, subscription.qualityOfService().value()); createConsumerForSubscriptionQueue(q, subscription.topicName(), subscription.qualityOfService().value()); } }
public void processSubscribe(Channel channel, MqttSubscribeMessage msg) { List<MqttTopicSubscription> topicSubscriptions = msg.payload().topicSubscriptions(); if (this.validTopicFilter(topicSubscriptions)) { String clientId = (String) channel.attr(AttributeKey.valueOf("clientId")).get(); List<Integer> mqttQoSList = new ArrayList<Integer>(); topicSubscriptions.forEach(topicSubscription -> { String topicFilter = topicSubscription.topicName(); MqttQoS mqttQoS = topicSubscription.qualityOfService(); SubscribeStore subscribeStore = new SubscribeStore(clientId, topicFilter, mqttQoS.value()); subscribeStoreService.put(topicFilter, subscribeStore); mqttQoSList.add(mqttQoS.value()); LOGGER.debug("SUBSCRIBE - clientId: {}, topFilter: {}, QoS: {}", clientId, topicFilter, mqttQoS.value()); }); MqttSubAckMessage subAckMessage = (MqttSubAckMessage) MqttMessageFactory.newMessage( new MqttFixedHeader(MqttMessageType.SUBACK, false, MqttQoS.AT_MOST_ONCE, false, 0), MqttMessageIdVariableHeader.from(msg.variableHeader().messageId()), new MqttSubAckPayload(mqttQoSList)); channel.writeAndFlush(subAckMessage); // 发布保留消息 topicSubscriptions.forEach(topicSubscription -> { String topicFilter = topicSubscription.topicName(); MqttQoS mqttQoS = topicSubscription.qualityOfService(); this.sendRetainMessage(channel, topicFilter, mqttQoS); }); } else { channel.close(); } }
private void addSubscription(MqttTopicSubscription subscription) throws Exception { String topicName = CompositeAddress.extractAddressName(subscription.topicName()); MqttTopicSubscription s = session.getSessionState().getSubscription(topicName); int qos = subscription.qualityOfService().value(); String coreAddress = MQTTUtil.convertMQTTAddressFilterToCore(topicName, session.getWildcardConfiguration()); session.getSessionState().addSubscription(subscription, session.getWildcardConfiguration()); Queue q = createQueueForSubscription(coreAddress, qos); if (s == null) { createConsumerForSubscriptionQueue(q, topicName, qos); } else { consumerQoSLevels.put(consumers.get(topicName).getID(), qos); } session.getRetainMessageManager().addRetainedMessagesToQueue(q, topicName); }
private void addSubscription(MqttTopicSubscription subscription) throws Exception { String topicName = CompositeAddress.extractAddressName(subscription.topicName()); MqttTopicSubscription s = session.getSessionState().getSubscription(topicName); int qos = subscription.qualityOfService().value(); String coreAddress = MQTTUtil.convertMQTTAddressFilterToCore(topicName, session.getWildcardConfiguration()); session.getSessionState().addSubscription(subscription, session.getWildcardConfiguration()); Queue q = createQueueForSubscription(coreAddress, qos); if (s == null) { createConsumerForSubscriptionQueue(q, topicName, qos); } else { consumerQoSLevels.put(consumers.get(topicName).getID(), qos); } session.getRetainMessageManager().addRetainedMessagesToQueue(q, topicName); }