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

如何使用MQTT Paho在RabbitMQ队列中进行订阅,rabbitmq,mqtt,Rabbitmq,Mqtt,我正在尝试从我的Android应用程序连接到一个名为“消息”的队列 生产者(AMQP协议下的一个webservices)已经连接,可以通过RabbitMQ管理面板进行检查 要从我的Android设备连接,我要这样编码 private void connect() throws Exception { this.sampleClient = new MqttClient(this.broker, this.clientId); MqttConnectOptions connOp

我正在尝试从我的Android应用程序连接到一个名为“消息”的队列

生产者(AMQP协议下的一个webservices)已经连接,可以通过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队列部分时,“messages”是0个使用者,并且已经自动设置了一个名为“mqtt-subscription-Sampleqos1”的新队列


发生了什么事?如何订阅“消息”队列?

这个问题有两个要点

根据RabbitMQ MQTT文档:

首先,通过mqtt插件将每个队列自动绑定到amq.topicexchange

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


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

首先,确保MQTT插件已启用:
rabbitmq插件启用rabbitmq\u MQTT

从客户端(这里是Android应用程序),您需要订阅一个主题,比如说,主题my/Android/app/messages

this.sampleClient.subscribe("my/android/app/messages");
然后,从服务器端,由于RabbitMQ的实现,您需要使用适当的路由键my.android.app.messages将消息发送到特殊的exchange“amq.topic”(注意“/”和“.”、MQTT use/和AMQP use之间的映射)。例如,如果您使用pika AMQP Python库发布,代码如下所示:

channel.basic_publish(
    exchange='amq.topic',
    routing_key='my.android.app.messages',
    body='hello world'
)
在您的情况下,您希望从队列“messages”接收消息,基本上无法直接从MQTT客户机上的AMQP队列接收订户消息。解决方法是创建一个在服务器端运行的服务,充当AMQP订户,从“messages”队列接收消息,并使用正确的路由密钥将消息透明转发到exchange amq.topic

希望我的回答对你有帮助