如何使用MQTT Paho在RabbitMQ队列中进行订阅

时间:2014-12-01 12:59:51

标签: rabbitmq mqtt

我正在尝试从我的Android应用程序连接到一个名为" message"的队列。

生产者(AMQP协议下的一个web服务)已经连接,可以通过RabbitMQ管理面板进行检查。

要从我的Android设备连接,我就像这样编码。

private void connect() throws Exception {

    this.sampleClient = new MqttClient(this.broker, this.clientId);

    MqttConnectOptions connOpts = new MqttConnectOptions();
    connOpts.setUserName("user");
    connOpts.setPassword("user".toCharArray());
    /*connOpts.setConnectionTimeout(60 * 10);
    connOpts.setKeepAliveInterval(60 * 5);*/
    connOpts.setCleanSession(true);

    this.sampleClient.connect(connOpts);

    this.sampleClient.setCallback(this);

    this.sampleClient.subscribe("messages");

    if(!this.sampleClient.isConnected()){

        System.out.println("Not Connected");
        return;
    }

    System.out.println("Connected");
}

我尝试过" amq.topic"," amq.topic。*"," amq.topic.messages"等...但是当我查看RabbitMQ队列部分"消息"有0个消费者,并且已经设置了一个名为" mqtt-subscription-Sampleqos1"的新队列。自动。

发生了什么?我怎样才能写出"消息"队列?

2 个答案:

答案 0 :(得分:8)

关于这个问题有两点重要。

根据RabbitMQ MQTT文档:http://www.rabbitmq.com/mqtt.html

首先,mqtt-plugin会自动将每个队列绑定到 amq.topic

其次,每个订阅者都有自己的队列,如下所示: mqtt-subscription- {cliend_id} {qosX} (其中X是订阅的qos级别)

因此,生产者必须将消息发布到“amq.topic”交换,并且“amq.topic ..”路由密钥,接收者必须订阅“amq.topic ..”routing-key。

答案 1 :(得分:0)

首先,确保已启用MQTT插件:rabbitmq-plugins enable rabbitmq_mqtt

在客户端(这是您的Android应用),您需要主题的订阅者,可以说主题my / android / app / messages

this.sampleClient.subscribe("my/android/app/messages");

然后,从服务器端开始,由于RabbitMQ的实现,您需要使用适当的路由键my.android.app.messages将消息发送到特殊的交换“ amq.topic”(注意“ /”和“ 。',MQTT使用/和AMQP使用。)。例如,如果您通过pika AMQP Python lib发布,代码将如下所示:

channel.basic_publish(
    exchange='amq.topic',
    routing_key='my.android.app.messages',
    body='hello world'
)

在您的情况下,您希望从队列“消息”接收消息,基本上没有办法直接从MQTT客户端上的该AMQP队列中订阅消息。解决方法是创建一个在服务器端运行的服务,作为AMQP订阅者,从“消息”队列接收消息,并透明转发消息以使用适当的路由密钥交换amq.topic。

希望我的回答有帮助。