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);
}
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);
}
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);
}
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);
}
}
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));
}
Aggregations