Mqtt 连接失败,出现异常 'Not authorized to connect (5)' android
Mqtt connection failed with exception 'Not authorized to connect (5)' android
您好,我正在尝试使用我刚刚注册的 android 设备连接到 mqtt,但我一直收到错误
Not authorized to connect (5)
这是我的一些代码
client = new MqttAndroidClient(context, connectionURI, clientID);
client.setCallback(callbacks);
String username = IOT_DEVICE_USERNAME;
char[] password = this.getAuthorizationToken().toCharArray();
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName(username);
options.setPassword(password);
Log.d(TAG, "Connecting to server: " + connectionURI);
try {
// connect
return client.connect(options, context, listener);
} catch (MqttException e) {
Log.e(TAG, "Exception caught while attempting to connect to server", e.getCause());
throw e;
}
其中 IOT_DEVICE_USERNAME 是一个字符串 "use-token-auth"
connectionUri 是 "tcp://<"organization">.messaging.internetofthings.ibmcloud.com:8883"
其他有趣的是,就在这个错误之前,我得到了这个日志
Unregister alarmreceiver to MqttServiced:<"organisation">:<"DeviceType">:<"deviceId">
这里是错误的stackTrace
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: Not authorized to connect (5)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:28)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:988)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:140)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:152)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.lang.Thread.run(Thread.java:818)
我发现了这个错误:
令牌验证失败(Device/gateway 未在数据库中找到):ClientID='d:4rxa4d:AndroidDevice:1c39476b8dd0'
您是否已在 Watson IoT Platform 中为您的组织创建了 AndroidDevice 设备类型并将 ID 1c39476b8dd0 注册到您的组织?
此 tutorial 展示了如何注册设备。
问题已解决。我确实将其用作客户端 ID 作为 MqttAndroidClient 对象的构造函数的输入。
String iotClientId = "d:"+ORG+":"+DEVICE_TYPE+":"+DEVICE_ID;
但是,由于我将 Android 设备注册为网关,因为它实际上连接到传感器实际所在的多个外围设备。为了解决这个问题,我将上面的行设置为
String iotClientId = "g:"+ORG+":"+DEVICE_TYPE+":"+DEVICE_ID;
您好,我正在尝试使用我刚刚注册的 android 设备连接到 mqtt,但我一直收到错误
Not authorized to connect (5)
这是我的一些代码
client = new MqttAndroidClient(context, connectionURI, clientID);
client.setCallback(callbacks);
String username = IOT_DEVICE_USERNAME;
char[] password = this.getAuthorizationToken().toCharArray();
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName(username);
options.setPassword(password);
Log.d(TAG, "Connecting to server: " + connectionURI);
try {
// connect
return client.connect(options, context, listener);
} catch (MqttException e) {
Log.e(TAG, "Exception caught while attempting to connect to server", e.getCause());
throw e;
}
其中 IOT_DEVICE_USERNAME 是一个字符串 "use-token-auth" connectionUri 是 "tcp://<"organization">.messaging.internetofthings.ibmcloud.com:8883"
其他有趣的是,就在这个错误之前,我得到了这个日志
Unregister alarmreceiver to MqttServiced:<"organisation">:<"DeviceType">:<"deviceId">
这里是错误的stackTrace
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: Not authorized to connect (5)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:28)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:988)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:140)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:152)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-06 12:27:24.214 9009-9009/wibicom.wibeacon3 W/System.err: at java.lang.Thread.run(Thread.java:818)
我发现了这个错误:
令牌验证失败(Device/gateway 未在数据库中找到):ClientID='d:4rxa4d:AndroidDevice:1c39476b8dd0'
您是否已在 Watson IoT Platform 中为您的组织创建了 AndroidDevice 设备类型并将 ID 1c39476b8dd0 注册到您的组织?
此 tutorial 展示了如何注册设备。
问题已解决。我确实将其用作客户端 ID 作为 MqttAndroidClient 对象的构造函数的输入。
String iotClientId = "d:"+ORG+":"+DEVICE_TYPE+":"+DEVICE_ID;
但是,由于我将 Android 设备注册为网关,因为它实际上连接到传感器实际所在的多个外围设备。为了解决这个问题,我将上面的行设置为
String iotClientId = "g:"+ORG+":"+DEVICE_TYPE+":"+DEVICE_ID;