public MqttQoS getQos() { return msg.fixedHeader().qosLevel(); } }
@Override public void retain(Topic topic, MqttPublishMessage msg) { final ByteBuf payload = msg.content(); byte[] rawPayload = new byte[payload.readableBytes()]; payload.getBytes(0, rawPayload); final RetainedMessage toStore = new RetainedMessage(msg.fixedHeader().qosLevel(), rawPayload); storage.put(topic, toStore); }
static MqttFixedHeader validateFixedHeader(MqttFixedHeader mqttFixedHeader) { switch (mqttFixedHeader.messageType()) { case PUBREL: case SUBSCRIBE: case UNSUBSCRIBE: if (mqttFixedHeader.qosLevel() != MqttQoS.AT_LEAST_ONCE) { throw new DecoderException(mqttFixedHeader.messageType().name() + " message must have QoS 1"); } default: return mqttFixedHeader; } }
private static ByteBuf encodePublishMessage( ByteBufAllocator byteBufAllocator, MqttPublishMessage message) { MqttFixedHeader mqttFixedHeader = message.fixedHeader(); MqttPublishVariableHeader variableHeader = message.variableHeader(); ByteBuf payload = message.payload().duplicate(); String topicName = variableHeader.topicName(); byte[] topicNameBytes = encodeStringUtf8(topicName); int variableHeaderBufferSize = 2 + topicNameBytes.length + (mqttFixedHeader.qosLevel().value() > 0 ? 2 : 0); int payloadBufferSize = payload.readableBytes(); int variablePartSize = variableHeaderBufferSize + payloadBufferSize; int fixedHeaderBufferSize = 1 + getVariableLengthInt(variablePartSize); ByteBuf buf = byteBufAllocator.buffer(fixedHeaderBufferSize + variablePartSize); buf.writeByte(getFixedHeaderByte1(mqttFixedHeader)); writeVariableLengthInt(buf, variablePartSize); buf.writeShort(topicNameBytes.length); buf.writeBytes(topicNameBytes); if (mqttFixedHeader.qosLevel().value() > 0) { buf.writeShort(variableHeader.messageId()); } buf.writeBytes(payload); return buf; }
@Override public void retain(Topic topic, MqttPublishMessage msg) { final ByteBuf payload = msg.content(); byte[] rawPayload = new byte[payload.readableBytes()]; payload.getBytes(0, rawPayload); final RetainedMessage toStore = new RetainedMessage(msg.fixedHeader().qosLevel(), rawPayload); queueMap.put(topic, toStore); }
private static int getFixedHeaderByte1(MqttFixedHeader header) { int ret = 0; ret |= header.messageType().value() << 4; if (header.isDup()) { ret |= 0x08; } ret |= header.qosLevel().value() << 1; if (header.isRetain()) { ret |= 0x01; } return ret; }
void sendPublish(MqttPublishMessage publishMsg) { final int packetId = publishMsg.variableHeader().packetId(); final String topicName = publishMsg.variableHeader().topicName(); final String clientId = getClientId(); MqttQoS qos = publishMsg.fixedHeader().qosLevel(); if (LOG.isTraceEnabled()) { LOG.trace("Sending PUBLISH({}) message. MessageId={}, CId={}, topic={}, payload={}", qos, packetId, clientId, topicName, DebugUtils.payload2Str(publishMsg.payload())); } else { LOG.debug("Sending PUBLISH({}) message. MessageId={}, CId={}, topic={}", qos, packetId, clientId, topicName); } sendIfWritableElseDrop(publishMsg); }
@Override public void handleMessage(Message message) { Client client = message.getClient(); MqttPublishMessage publishMessage = (MqttPublishMessage) message.getPayload(); messageStore.put(message); int qos = MessageUtil.actualQos(publishMessage.fixedHeader().qosLevel().value()); if (qos == MqttQoS.AT_LEAST_ONCE.value()) { MqttPubAckMessage pubAckMessage = MessageUtil.getMqttPubackMessage(publishMessage); client.getCtx().writeAndFlush(pubAckMessage); } else if (qos == MqttQoS.EXACTLY_ONCE.value()) { MqttMessage pubrecMessage = MessageUtil.getMqttPubrecMessage(publishMessage); client.getCtx().writeAndFlush(pubrecMessage); } }
private static Result<MqttPublishVariableHeader> decodePublishVariableHeader( ByteBuf buffer, MqttFixedHeader mqttFixedHeader) { final Result<String> decodedTopic = decodeString(buffer); if (!isValidPublishTopicName(decodedTopic.value)) { throw new DecoderException("invalid publish topic name: " + decodedTopic.value + " (contains wildcards)"); } int numberOfBytesConsumed = decodedTopic.numberOfBytesConsumed; int messageId = -1; if (mqttFixedHeader.qosLevel().value() > 0) { final Result<Integer> decodedMessageId = decodeMessageId(buffer); messageId = decodedMessageId.value; numberOfBytesConsumed += decodedMessageId.numberOfBytesConsumed; } final MqttPublishVariableHeader mqttPublishVariableHeader = new MqttPublishVariableHeader(decodedTopic.value, messageId); return new Result<MqttPublishVariableHeader>(mqttPublishVariableHeader, numberOfBytesConsumed); }
public static MqttSubAckMessage getMqttSubackMessage(MqttSubscribeMessage message, MqttSubAckPayload payload) { MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.SUBACK, false, message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), 0 ); MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(message.variableHeader().messageId()); return new MqttSubAckMessage(fixedHeader, variableHeader, payload); }
public static MqttMessage getMqttPubrecMessage(MqttPublishMessage message) { MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.PUBREC, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), message.fixedHeader().remainingLength() ); return new MqttMessage(fixedHeader); }
public static MqttMessage getMqttPingrespMessage(MqttMessage message) { assert message.fixedHeader().messageType() == MqttMessageType.PINGREQ; MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.PINGRESP, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), 0 ); return new MqttMessage(fixedHeader); }
public static MqttUnsubAckMessage getMqttUnsubackMessage(MqttUnsubscribeMessage message) { MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.UNSUBACK, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), 0 ); MqttMessageIdVariableHeader variableHeader = MqttMessageIdVariableHeader.from(message.variableHeader().messageId()); return new MqttUnsubAckMessage(fixedHeader, variableHeader); }
public static MqttMessage getMqttPubcompMessage(MqttMessage message) { assert message.fixedHeader().messageType() == MqttMessageType.PUBREL; MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.PUBCOMP, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), message.fixedHeader().remainingLength() ); return new MqttMessage(fixedHeader); }
public static MqttMessage getMqttPubrelMessage(MqttMessage message) { assert message.fixedHeader().messageType() == MqttMessageType.PUBREC; MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.PUBREL, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), message.fixedHeader().remainingLength() ); return new MqttMessage(fixedHeader); }
public static MqttPubAckMessage getMqttPubackMessage(MqttPublishMessage message) { MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.PUBACK, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), message.fixedHeader().remainingLength() ); return new MqttPubAckMessage(fixedHeader, MqttMessageIdVariableHeader.from(message.variableHeader().packetId())); }
static byte encodeFlags(MqttMessage message) { byte flags = 0; if (message.fixedHeader().isDup()) { flags |= (byte) 0x08; } if (message.fixedHeader().isRetain()) { flags |= (byte) 0x01; } flags |= (byte) ((message.fixedHeader().qosLevel().value() & 0x03) << 1); return flags; }
public static MqttConnAckMessage getMqttConnackMessage(MqttConnectMessage message, MqttConnectReturnCode returnCode) { assert message.fixedHeader().messageType() == MqttMessageType.CONNECT; MqttConnAckVariableHeader variableHeader = new MqttConnAckVariableHeader( returnCode, message.variableHeader().isCleanSession() ); MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.CONNACK, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), 0); return new MqttConnAckMessage(fixedHeader, variableHeader); }
static void verifyPublishIsReceived(EmbeddedChannel embCh, MqttQoS expectedQos, String expectedPayload) { final MqttPublishMessage publishReceived = embCh.flushOutbound().readOutbound(); final String payloadMessage = DebugUtils.payload2Str(publishReceived.payload()); assertEquals("Sent and received payload must be identical", expectedPayload, payloadMessage); assertEquals("Expected QoS don't match", expectedQos, publishReceived.fixedHeader().qosLevel()); }
static void verifyReceiveRetainedPublish(EmbeddedChannel embeddedChannel, String expectedTopic, String expectedContent, MqttQoS expectedQos) { MqttPublishMessage receivedPublish = embeddedChannel.flushOutbound().readOutbound(); assertEquals(receivedPublish.fixedHeader().qosLevel(), expectedQos); assertPublishIsCorrect(expectedTopic, expectedContent, receivedPublish); assertTrue("MUST be retained publish", receivedPublish.fixedHeader().isRetain()); }