Mqtt Eclipse Kapua代理:未授权订阅主题

Mqtt Eclipse Kapua代理:未授权订阅主题,mqtt,paho,kapua,Mqtt,Paho,Kapua,我试图从EclipsePAHOMQTT客户机订阅一个简单的主题“foo” 代理由EclipseKapua管理,可通过tcp://localhost:1883 具有凭证“kapua broker”和“kapua password” 我以这种方式发布了一个值: send(new Payload.Builder().put(“testKey”、“testVal”)、“foo”); 这基本上发送一个主题为“foo”的映射(“testKey”、“testVal”)。要订阅此主题,我有以下代码(host=

我试图从EclipsePAHOMQTT客户机订阅一个简单的主题“foo”

代理由EclipseKapua管理,可通过tcp://localhost:1883 具有凭证“kapua broker”和“kapua password”

我以这种方式发布了一个值:

send(new Payload.Builder().put(“testKey”、“testVal”)、“foo”);
这基本上发送一个主题为“foo”的映射(“testKey”、“testVal”)。要订阅此主题,我有以下代码(host=“localhost”,port=1883):

String topic=“foo”;
String broker=“tcp://”+host+:“+Integer.toString(端口);
字符串clientId=“供应链控制模拟侦听器”;
字符串username=“kapua broker”;
String password=“kapua password”;
试一试{
MqttClient=新的MqttClient(代理,clientId);
MqttConnectOptions connOpts=新的MqttConnectOptions();
connOpts.setCleansion(真);
connOpts.setUserName(用户名);
setPassword(password.toCharArray());
connOpts.setCleansion(真);
logger.info(“连接到代理:“+broker”);
setCallback(新的MqttCallback(){
@凌驾
public void connectionLost(可丢弃可丢弃){
logger.info(“订阅已停止”);
}
@凌驾
public void messageArrived(字符串s,MqttMessage MqttMessage)引发异常{
记录者信息;
logger.info(mqttMessage.getPayload().toString());
}
@凌驾
公共无效交付完成(IMqttDeliveryToken IMqttDeliveryToken){
}
});
client.connect(connOpts);
if(client.isConnected())
logger.info(“已连接”);
其他的
logger.error(client.getDebug().toString());
订阅(主题2);
}捕获(MqttException me){
logger.error(“reason”+me.getReasonCode());
logger.error(“msg”+me.getMessage());
logger.error(“loc”+me.getLocalizedMessage());
logger.error(“cause”+me.getCause());
记录器错误(“例外”+me);
me.printStackTrace();
}
连接正常,但订阅输出此错误:


15:40:03.240[ActiveMQ NIO Worker 0]警告o.e.k.b.c.p.KapuaSecurityBrokerFilter-用户1:kapua broker(供应链控制模拟侦听器-tcp://172.17.0.1:40888 -连接id 1734706196170193882)未被授权阅读以下内容:topic://VirtualTopic.foo

不要在调用
connect
后立即订阅
,而是将调用移动到回调中:

IMqttAsyncClient client = new MqttAsyncClient(broker, clientId);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setUserName(username);
connOpts.setPassword(password.toCharArray());
connOpts.setCleanSession(true);
logger.info("Connecting to broker: "+broker);
client.setCallback(new MqttCallbackExtended() {
    @Override
    public void connectComplete(boolean reconnect, String brokerAddress) {
        logger.info("Connected");
        client.subscribe(topic,2);
    }
    @Override
    public void connectionLost(Throwable throwable) {
        logger.info("Subscriptions stopped");
    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        logger.info(s);
        logger.info(mqttMessage.getPayload().toString());
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

    }
});
client.connect(connOpts);

也就是说,您的错误可能来自您正在使用的MQTT代理,您需要将其配置为允许访问该主题。

不要在调用
connect
后立即订阅
,而是将该调用移动到回调中:

IMqttAsyncClient client = new MqttAsyncClient(broker, clientId);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setUserName(username);
connOpts.setPassword(password.toCharArray());
connOpts.setCleanSession(true);
logger.info("Connecting to broker: "+broker);
client.setCallback(new MqttCallbackExtended() {
    @Override
    public void connectComplete(boolean reconnect, String brokerAddress) {
        logger.info("Connected");
        client.subscribe(topic,2);
    }
    @Override
    public void connectionLost(Throwable throwable) {
        logger.info("Subscriptions stopped");
    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        logger.info(s);
        logger.info(mqttMessage.getPayload().toString());
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

    }
});
client.connect(connOpts);

也就是说,您的错误可能来自您正在使用的MQTT代理,您需要将其配置为允许访问该主题。

在Kapua中,您可以根据用户权限发布/订阅

如果您的用户只有
broker:connect
权限,则您只能发布/订阅主题:

{account-name}/{connectionClientId}/{semanticTopic}
kapus-sys/supply-chain-control-simulation-listener/foo
在您的具体情况下,您应该发布/订阅以下主题:

{account-name}/{connectionClientId}/{semanticTopic}
kapus-sys/supply-chain-control-simulation-listener/foo
kapua sys
是用户kapua broker所属的帐户名, 而
supply chain control simulation listener
是用于创建连接的客户端ID


请注意,用于连接的用户名和帐户名在Kapua中是两个不同的东西。一个帐户有多个用户。

在Kapua,您可以根据您的用户权限发布/订阅

如果您的用户只有
broker:connect
权限,则您只能发布/订阅主题:

{account-name}/{connectionClientId}/{semanticTopic}
kapus-sys/supply-chain-control-simulation-listener/foo
在您的具体情况下,您应该发布/订阅以下主题:

{account-name}/{connectionClientId}/{semanticTopic}
kapus-sys/supply-chain-control-simulation-listener/foo
kapua sys
是用户kapua broker所属的帐户名, 而
supply chain control simulation listener
是用于创建连接的客户端ID


请注意,用于连接的用户名和帐户名在Kapua中是两个不同的东西。一个帐户有多个用户。

谢谢您的回答。你说得对,这样比较干净,但不幸的是我还是会犯同样的错误。问题是我没有控制代理,它是Kapua项目的一部分,使用它我只是启动一个docker容器。谢谢你的回答。你说得对,这样比较干净,但不幸的是我还是会犯同样的错误。问题是我没有控制代理,它是Kapua项目的一部分,要使用它,我只需要启动一个docker容器。