2017-07-13 1 views
0

Eclipse Paho MQTTクライアントから簡単なトピック "foo"を購読しようとしています。Eclipse Kapuaブローカー:トピックを購読する権限がありません

ブローカーはEclipse Kapuaによって管理され、資格情報が「kapua-broker」および「kapua-password」のtcp:// localhost:1883からアクセスできます。

私は値をこのように公開しています:

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

これは基本的に、トピック "foo" というマップで( "とtestkey"、 "testValという")を送信します。

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分このトピックを購読するには、私は次のコード(ホスト= "localhost" を、ポート= 1883)を持っています:03.240 [ActiveMQ NIOワーカー0] WARN 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です。

接続に使用するユーザー名とアカウント名は、カプトアの2つの異なる点に注意してください。アカウントには複数のユーザーがいます。

1

Do not subscribeすぐ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

あなたの答えをありがとう。あなたはこのようにきれいですが、残念ながら私はまだ同じエラーが発生します。問題は、私がブローカーをコントロールしていないことです。それは、カプルアプロジェクトの一部であり、それを使用するには、ドッキング用のコンテナを始めるだけです。 –

関連する問題