Search in sources :

Example 1 with Client

use of org.apache.rocketmq.iot.connection.client.Client in project rocketmq-externals by apache.

the class ConsumeMessageIntegrationTest method test.

@Test
public void test() {
    /* handle the CONNECT message */
    MqttConnectMessage connectMessage = getConnectMessage();
    embeddedChannel.writeInbound(connectMessage);
    MqttConnAckMessage connAckMessage = embeddedChannel.readOutbound();
    Client client = clientManager.get(embeddedChannel);
    Assert.assertNotNull(client);
    Assert.assertTrue(consumerId.equals(client.getId()));
    Assert.assertEquals(consumerId, client.getId());
    Assert.assertTrue(client.isConnected());
    Assert.assertEquals(embeddedChannel, client.getCtx().channel());
    Assert.assertTrue(client.isConnected());
    Assert.assertTrue(embeddedChannel.isOpen());
    Assert.assertEquals(MqttConnectReturnCode.CONNECTION_ACCEPTED, connAckMessage.variableHeader().connectReturnCode());
    embeddedChannel.releaseInbound();
    /* handle the SUBSCRIBE message */
    MqttSubscribeMessage subscribeMessage = getMqttSubscribeMessage();
    embeddedChannel.writeInbound(subscribeMessage);
    List<Subscription> subscriptions = subscriptionStore.get(topicName);
    List<String> topics = subscriptionStore.getTopics(topicName);
    MqttSubAckMessage ackMessage = embeddedChannel.readOutbound();
    Assert.assertNotNull(subscriptionStore.get(topicName));
    Assert.assertNotNull(subscriptions);
    Assert.assertNotNull(ackMessage);
    Assert.assertEquals(subscribePacketId, ackMessage.variableHeader().messageId());
    Assert.assertTrue(topics.contains(topicName));
    Assert.assertTrue(isClientInSubscriptions(subscriptions, client));
    embeddedChannel.releaseInbound();
    /* send message to the client */
    MqttPublishMessage publishMessage = getMqttPublishMessage();
    byte[] expectedPayload = new byte[publishMessage.payload().readableBytes()];
    publishMessage.payload().getBytes(0, expectedPayload);
    embeddedChannel.writeInbound(publishMessage);
    MqttPublishMessage receivedMessage = embeddedChannel.readOutbound();
    byte[] actualPayload = new byte[receivedMessage.payload().readableBytes()];
    receivedMessage.payload().getBytes(0, actualPayload);
    Assert.assertEquals(publishMessage.variableHeader().packetId(), receivedMessage.variableHeader().packetId());
    Assert.assertEquals(publishMessage.variableHeader().topicName(), receivedMessage.variableHeader().topicName());
    Assert.assertArrayEquals(expectedPayload, actualPayload);
}
Also used : MqttConnectMessage(io.netty.handler.codec.mqtt.MqttConnectMessage) MqttSubscribeMessage(io.netty.handler.codec.mqtt.MqttSubscribeMessage) MqttPublishMessage(io.netty.handler.codec.mqtt.MqttPublishMessage) MqttSubAckMessage(io.netty.handler.codec.mqtt.MqttSubAckMessage) MqttConnAckMessage(io.netty.handler.codec.mqtt.MqttConnAckMessage) Client(org.apache.rocketmq.iot.connection.client.Client) MqttClient(org.apache.rocketmq.iot.protocol.mqtt.data.MqttClient) Subscription(org.apache.rocketmq.iot.protocol.mqtt.data.Subscription) MqttTopicSubscription(io.netty.handler.codec.mqtt.MqttTopicSubscription) Test(org.junit.Test)

Example 2 with Client

use of org.apache.rocketmq.iot.connection.client.Client in project rocketmq-externals by apache.

the class MqttSubscribeMessageHandler method handleMessage.

/**
 * handle the SUBSCRIBE message from the client
 * <ol>
 * <li>validate the topic filters in each subscription</li>
 * <li>set actual qos of each filter</li>
 * <li>get the topics matching given filters</li>
 * <li>check the client authorization of each topic</li>
 * <li>generate SUBACK message which includes the subscription result for each TopicFilter</li>
 * <li>send SUBACK message to the client</li>
 * </ol>
 *
 * @param message the message wrapping MqttSubscriptionMessage
 * @return
 */
@Override
public void handleMessage(Message message) {
    Client client = message.getClient();
    MqttSubscribeMessage subscribeMessage = (MqttSubscribeMessage) message.getPayload();
    List<MqttTopicSubscription> topicSubscriptions = subscribeMessage.payload().topicSubscriptions();
    List<Integer> grantQoss = new ArrayList<>();
    topicSubscriptions.forEach(s -> {
        String topic = s.topicName();
        int actualQos = MessageUtil.actualQos(s.qualityOfService().value());
        grantQoss.add(actualQos);
        subscriptionStore.append(topic, Subscription.Builder.newBuilder().client((MqttClient) client).qos(actualQos).build());
    });
    MqttSubAckMessage subackMessage = MessageUtil.getMqttSubackMessage(subscribeMessage, new MqttSubAckPayload(grantQoss));
    client.getCtx().writeAndFlush(subackMessage);
}
Also used : MqttClient(org.apache.rocketmq.iot.protocol.mqtt.data.MqttClient) MqttSubscribeMessage(io.netty.handler.codec.mqtt.MqttSubscribeMessage) MqttSubAckMessage(io.netty.handler.codec.mqtt.MqttSubAckMessage) MqttTopicSubscription(io.netty.handler.codec.mqtt.MqttTopicSubscription) ArrayList(java.util.ArrayList) Client(org.apache.rocketmq.iot.connection.client.Client) MqttClient(org.apache.rocketmq.iot.protocol.mqtt.data.MqttClient) MqttSubAckPayload(io.netty.handler.codec.mqtt.MqttSubAckPayload)

Example 3 with Client

use of org.apache.rocketmq.iot.connection.client.Client in project rocketmq-externals by apache.

the class MessageDispatcher method channelRead0.

@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
    if (!(msg instanceof MqttMessage)) {
        return;
    }
    Client client = clientManager.get(ctx.channel());
    if (client == null) {
        client = new MqttClient();
        client.setCtx(ctx);
        clientManager.put(ctx.channel(), client);
    }
    MqttMessage mqttMessage = (MqttMessage) msg;
    Message message = MessageUtil.getMessage(mqttMessage);
    message.setClient(client);
    dispatch(message);
}
Also used : MqttClient(org.apache.rocketmq.iot.protocol.mqtt.data.MqttClient) MqttMessage(io.netty.handler.codec.mqtt.MqttMessage) Message(org.apache.rocketmq.iot.common.data.Message) MqttMessage(io.netty.handler.codec.mqtt.MqttMessage) Client(org.apache.rocketmq.iot.connection.client.Client) MqttClient(org.apache.rocketmq.iot.protocol.mqtt.data.MqttClient)

Example 4 with Client

use of org.apache.rocketmq.iot.connection.client.Client in project rocketmq-externals by apache.

the class MqttPublishMessageHandler method handleMessage.

@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);
    }
}
Also used : MqttMessage(io.netty.handler.codec.mqtt.MqttMessage) MqttPubAckMessage(io.netty.handler.codec.mqtt.MqttPubAckMessage) MqttPublishMessage(io.netty.handler.codec.mqtt.MqttPublishMessage) Client(org.apache.rocketmq.iot.connection.client.Client)

Example 5 with Client

use of org.apache.rocketmq.iot.connection.client.Client in project rocketmq-externals by apache.

the class MqttUnsubscribeMessagHandler method handleMessage.

@Override
public void handleMessage(Message message) {
    Client client = message.getClient();
    MqttUnsubscribeMessage unsubscribeMessage = (MqttUnsubscribeMessage) message.getPayload();
    List<String> unsubscribeTopicFilters = unsubscribeMessage.payload().topics();
    Set<String> subscribedTopicFilters = subscriptionStore.getTopicFilters(client.getId());
    for (String filter : unsubscribeTopicFilters) {
        if (subscribedTopicFilters.contains(filter)) {
            subscriptionStore.getTopics(filter).forEach(topic -> {
                subscriptionStore.remove(topic, client);
            });
        }
    }
    client.getCtx().writeAndFlush(MessageUtil.getMqttUnsubackMessage(unsubscribeMessage));
}
Also used : MqttUnsubscribeMessage(io.netty.handler.codec.mqtt.MqttUnsubscribeMessage) Client(org.apache.rocketmq.iot.connection.client.Client)

Aggregations

Client (org.apache.rocketmq.iot.connection.client.Client)8 MqttClient (org.apache.rocketmq.iot.protocol.mqtt.data.MqttClient)5 MqttMessage (io.netty.handler.codec.mqtt.MqttMessage)4 MqttPublishMessage (io.netty.handler.codec.mqtt.MqttPublishMessage)3 MqttConnAckMessage (io.netty.handler.codec.mqtt.MqttConnAckMessage)2 MqttConnectMessage (io.netty.handler.codec.mqtt.MqttConnectMessage)2 MqttSubAckMessage (io.netty.handler.codec.mqtt.MqttSubAckMessage)2 MqttSubscribeMessage (io.netty.handler.codec.mqtt.MqttSubscribeMessage)2 MqttTopicSubscription (io.netty.handler.codec.mqtt.MqttTopicSubscription)2 Test (org.junit.Test)2 MqttPubAckMessage (io.netty.handler.codec.mqtt.MqttPubAckMessage)1 MqttSubAckPayload (io.netty.handler.codec.mqtt.MqttSubAckPayload)1 MqttUnsubscribeMessage (io.netty.handler.codec.mqtt.MqttUnsubscribeMessage)1 ArrayList (java.util.ArrayList)1 Message (org.apache.rocketmq.iot.common.data.Message)1 Subscription (org.apache.rocketmq.iot.protocol.mqtt.data.Subscription)1