List of usage examples for io.netty.handler.codec.mqtt MqttPublishMessage variableHeader
@Override
public MqttPublishVariableHeader variableHeader()
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; }/*from ww w . ja v a2s . c o 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 ww .j a v a 2 s . co m break; default: logger.trace("{} {} <{}> Unknown message type received.", direction, messageType, clientID); } } }
From source file:io.crate.mqtt.operations.MqttIngestService.java
/** * Parse the payload of the provided mqtt message and find which {@link IngestRule}s match the message properties. * For every matched rule, execute the insert into the rule's target table. * If we encounter exceptions whilst executing the rules we try to send the ackCallback that failure that's not a * "row already exists" (because, in case of messages with the isDup flag set to true, we will send the PUBACK reply * to the message).//from w w w. ja va 2 s. c o m * We do not want to acknowledge the message until all message rules are successfully applied (if * the only detected failure(s) is "row already exists", namely {@link VersionConflictEngineException}, we trigger * the ackCallback, as for QoS 1 (at least once) we expect message redeliveries) */ public void doInsert(String clientId, MqttPublishMessage msg, BiConsumer<Object, Throwable> ackCallback) { if (isInitialized == false) { throw new IllegalStateException("Service was not initialized"); } Map<String, Object> payload = parsePayloadToMap(msg.content()); if (payload == null) { return; } Set<Tuple<Predicate<Row>, IngestRule>> predicateAndIngestRules = predicateAndIngestRulesReference.get(); int packetId = msg.variableHeader().packetId(); Object[] args = new Object[] { clientId, packetId, msg.variableHeader().topicName(), payload }; List<Object> argsAsList = Arrays.asList(args); boolean messageMatchedRule = false; boolean callbackNotified = false; Session session = sqlOperations.createSession(Schemas.DOC_SCHEMA_NAME, crateUser, Option.NONE, 1); List<CompletableFuture<?>> insertOperationsFuture = new ArrayList<>(predicateAndIngestRules.size()); for (Tuple<Predicate<Row>, IngestRule> entry : predicateAndIngestRules) { if (entry.v1().test(new RowN(args))) { messageMatchedRule = true; IngestRule ingestRule = entry.v2(); try { session.parse(ingestRule.getName(), "insert into " + TableIdent.fromIndexName(ingestRule.getTargetTable()).fqn() + " (\"client_id\", \"packet_id\", \"topic\", \"ts\", \"payload\") " + "values (?, ?, ?, CURRENT_TIMESTAMP, ?)", FIELD_TYPES); session.bind(Session.UNNAMED, ingestRule.getName(), argsAsList, null); BaseResultReceiver resultReceiver = new BaseResultReceiver(); insertOperationsFuture.add(resultReceiver.completionFuture().exceptionally(t -> { if (SQLExceptions.isDocumentAlreadyExistsException(t)) { if (msg.fixedHeader().isDup()) { // we are dealing with QoS1, so redeliveries and duplicate insert exceptions are // normal in case of a duplicate message - indicated by the isDup flag return null; } } Exceptions.rethrowUnchecked(t); return null; })); session.execute(Session.UNNAMED, 0, resultReceiver); session.sync(); } catch (SQLActionException e) { ackCallback.accept(null, e); callbackNotified = true; break; } } } session.close(); if (callbackNotified == false) { CompletableFuture<Void> allResultsComplete = CompletableFuture .allOf(insertOperationsFuture.toArray(new CompletableFuture[0])); allResultsComplete.whenComplete((r, t) -> { if (t != null) { // the actual cause is wrapped in a CompletionException by CompletableFuture#allOf ackCallback.accept(null, t.getCause()); } else { ackCallback.accept(r, null); } }); } if (messageMatchedRule == false) { LOGGER.warn( "Message with client_id {} and packet_id {} did not match any rule. The message will not be " + "acknowledged", clientId, packetId); } if (LOGGER.isDebugEnabled()) { LOGGER.debug("Parsed MQTT message into arguments: {}", argsAsList); } }
From source file:io.crate.mqtt.protocol.MqttProcessor.java
public void handlePublish(Channel channel, MqttPublishMessage msg) { final MqttQoS qos = msg.fixedHeader().qosLevel(); String clientId = NettyUtils.clientID(channel); switch (qos) { case AT_LEAST_ONCE: SendPubAckCallback ackCallback = new SendPubAckCallback(channel, msg.variableHeader().packetId(), msg.fixedHeader().isDup()); ingestService.doInsert(clientId, msg, ackCallback); break;/* www .j ava 2s .c om*/ default: String message = String.format(Locale.ENGLISH, "QoS %s (%s) is not supported.", qos.value(), qos.name()); throw new UnsupportedOperationException(message); } }
From source file:io.moquette.server.Server.java
License:Open Source License
/** * Use the broker to publish a message. It's intended for embedding applications. It can be used * only after the server is correctly started with startServer. * * @param msg//w ww .j a v a2 s. c o m * the message to forward. * @param clientId * the id of the sending server. * @throws IllegalStateException * if the server is not yet started */ public void internalPublish(MqttPublishMessage msg, final String clientId) { final int messageID = msg.variableHeader().messageId(); if (!m_initialized) { LOG.error("Moquette is not started, internal message cannot be published. CId={}, messageId={}", clientId, messageID); throw new IllegalStateException("Can't publish on a server is not yet started"); } LOG.debug("Publishing message. CId={}, messageId={}", clientId, messageID); m_processor.internalPublish(msg, clientId); }
From source file:io.moquette.spi.impl.BrokerInterceptor.java
License:Open Source License
@Override public void notifyTopicPublished(final MqttPublishMessage msg, final String clientID, final String username) { int messageId = msg.variableHeader().messageId(); String topic = msg.variableHeader().topicName(); for (final InterceptHandler handler : this.handlers.get(InterceptPublishMessage.class)) { LOG.debug(/*w w w . j ava 2 s . c om*/ "Notifying MQTT PUBLISH message to interceptor. CId={}, messageId={}, topic={}, interceptorId={}", clientID, messageId, topic, handler.getID()); executor.execute(new Runnable() { @Override public void run() { handler.onPublish(new InterceptPublishMessage(msg, clientID, username)); } }); } }
From source file:net.anyflow.lannister.message.Message.java
License:Apache License
public static Message newMessage(String clientId, MqttPublishMessage published) { return new Message(published.variableHeader().messageId(), published.variableHeader().topicName(), clientId, NettyUtil.copy(published.payload()), published.fixedHeader().qosLevel(), published.fixedHeader().isRetain()); }
From source file:net.anyflow.lannister.packetreceiver.PublishReceiver.java
License:Apache License
@Override protected void channelRead0(ChannelHandlerContext ctx, MqttPublishMessage msg) throws Exception { logger.debug("packet incoming [message={}]", msg.toString()); Statistics.SELF.add(Statistics.Criterion.MESSAGES_PUBLISH_RECEIVED, 1); Session session = Session.NEXUS.get(ctx.channel().id()); if (session == null) { logger.error("None exist session message [message={}]", msg.toString()); ctx.channel().disconnect().addListener(ChannelFutureListener.CLOSE).addListener(fs -> // [MQTT-4.8.0-1] Plugins.SELF.get(DisconnectEventListener.class).disconnected(new AbnormalDisconnectEventArgs())); return;//from w w w . ja v a 2 s . co m } session.setLastIncomingTime(new Date()); if (!TopicMatcher.isValid(msg.variableHeader().topicName(), false)) { session.dispose(true); return; } Message message = Message.newMessage(session.clientId(), msg); if (!Plugins.SELF.get(PublishEventListener.class).allowPublish(new PublishEventArgs() { @Override public IMessage message() { return message; } })) { session.dispose(true); return; } // TODO What to do when sender re-publish message corrensponds to // unacked status? // TODO Until it has received the corresponding PUBREL packet, the // Receiver MUST acknowledge any subsequent PUBLISH packet with the same // Packet Identifier by sending a PUBREC. It MUST NOT cause duplicate // messages to be delivered to any onward recipients in this // case.[MQTT-4.3.3-2]. final Topic topic = Topic.NEXUS.publish(message); switch (msg.fixedHeader().qosLevel()) { case AT_MOST_ONCE: return; // QoS 0 do not send any acknowledge packet [MQTT-3.3.4-1] case AT_LEAST_ONCE: session.send(MessageFactory.puback(msg.variableHeader().messageId())).addListener( f -> topic.removeInboundMessageStatus(session.clientId(), msg.variableHeader().messageId())); // [MQTT-3.3.4-1],[MQTT-2.3.1-6] logger.debug("Inbound message status REMOVED [clientId={}, messageId={}]", session.clientId(), msg.variableHeader().messageId()); return; case EXACTLY_ONCE: session.send(MessageFactory.pubrec(msg.variableHeader().messageId())) .addListener(f -> topic.setInboundMessageStatus(session.clientId(), msg.variableHeader().messageId(), InboundMessageStatus.Status.PUBRECED)); // [MQTT-3.3.4-1],[MQTT-2.3.1-6] return; default: session.dispose(true); // [MQTT-3.3.1-4] return; } }
From source file:org.apache.activemq.artemis.core.protocol.mqtt.MQTTProtocolHandler.java
License:Apache License
void handlePublish(MqttPublishMessage message) throws Exception { session.getMqttPublishManager().handleMessage(message.variableHeader().packetId(), message.variableHeader().topicName(), message.fixedHeader().qosLevel().value(), message.payload(), message.fixedHeader().isRetain()); }
From source file:org.thingsboard.mqtt.MqttChannelHandler.java
License:Apache License
private void invokeHandlersForIncomingPublish(MqttPublishMessage message) { boolean handlerInvoked = false; for (MqttSubscription subscription : ImmutableSet.copyOf(this.client.getSubscriptions().values())) { if (subscription.matches(message.variableHeader().topicName())) { if (subscription.isOnce() && subscription.isCalled()) { continue; }//from w w w . j a va 2 s. co m message.payload().markReaderIndex(); subscription.setCalled(true); subscription.getHandler().onMessage(message.variableHeader().topicName(), message.payload()); if (subscription.isOnce()) { this.client.off(subscription.getTopic(), subscription.getHandler()); } message.payload().resetReaderIndex(); handlerInvoked = true; } } if (!handlerInvoked && client.getDefaultHandler() != null) { client.getDefaultHandler().onMessage(message.variableHeader().topicName(), message.payload()); } message.payload().release(); }