2017-07-13 40 views
0

我試圖訂閱來自Eclipse Paho MQTT客戶端的簡單主題「foo」。Eclipse Kapua經紀人:未授權訂閱主題

代理由Eclipse Kapua管理,可通過tcp:// localhost:1883使用憑證「kapua-broker」和「kapua-password」進行訪問。

我發佈的值是這樣的:

send(new Payload.Builder().put("testKey","testVal"),"foo");

這基本上發送一個地圖( 「密押」, 「名爲testVal的」)的主題爲 「foo」。要訂閱這個話題,我有以下代碼(主機= 「localhost」,則端口= 1883):

String topic = "foo"; 
    String broker = "tcp://"+host+":"+Integer.toString(port); 
    String clientId = "supply-chain-control-simulation-listener"; 
    String username = "kapua-broker"; 
    String password = "kapua-password"; 

    try { 
     MqttClient client = new MqttClient(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 MqttCallback() { 
      @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); 
     if (client.isConnected()) 
      logger.info("Connected"); 
     else 
      logger.error(client.getDebug().toString()); 
     client.subscribe(topic,2); 
    } catch(MqttException me) { 
     logger.error("reason "+me.getReasonCode()); 
     logger.error("msg "+me.getMessage()); 
     logger.error("loc "+me.getLocalizedMessage()); 
     logger.error("cause "+me.getCause()); 
     logger.error("excep "+me); 
     me.printStackTrace(); 
    } 

的連接工作,但認購輸出這個錯誤:

15:40 :03.240 [ActiveMQ NIO Worker 0]警告oekbcpKapuaSecurityBrokerFilter - 用戶1:kapua-broker(供應鏈控制模擬偵聽器 - tcp://172.17.0.1:40888 - conn id 1734706196170193882)未被授權讀取:話題://VirtualTopic.foo

回答

1

在卡普阿,您可以根據您的用戶許可進行發佈/訂閱。

如果您的用戶只能發佈broker:connect許可/訂閱只在題目:

{account-name}/{connectionClientId}/{semanticTopic} 

在特定情況下,你應該發佈/訂閱的話題:

kapus-sys/supply-chain-control-simulation-listener/foo 

kapua-sys是賬戶用戶kapua-broker所屬的名稱, ,而supply-chain-control-simulation-listener是用於創建連接的clientId。

請注意,用於連接和帳戶名稱的用戶名是卡普阿兩種不同的東西。一個帳戶有多個用戶。

1

不要調用connect後馬上,而是移到該呼叫到connectComplete回調:

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經紀人來了,你需要配置它以允許訪問該主題。

+1

感謝您的回答。你說得對,這種方式更清潔,但不幸的是我仍然得到相同的錯誤。問題是我不控制經紀人,它是Kapua項目的一部分,並使用它,我只是啓動一個碼頭集裝箱。 –