无法使用 JavaScript 的 Eclipse PAHO MQTT 库连接到 IBM Watson IoT Platform

Cannot connect to IBM Watson IoT Platform using Eclipse PAHO MQTT Library for JavaScript

出于安全原因,IBM 最近似乎停止接受与 MQTT borker 的非 TLS 连接。

我喜欢一个小应用程序,它使用 JavaScript 从智能手机读取加速度计传感器数据,并通过 MQTT 将其发送到消息代理。

This application is broken. Therefore I'm trying to fix it in this fork

如前所述,非 TLS 连接会被拒绝,这就是我启用 TLS 的原因:

        window.client.connect({
            onSuccess: onConnectSuccess,
            onFailure: onConnectFailure,
            userName: "use-token-auth",
            password: window.password,
            useSSL: true
});

它仍然没有连接。在 IBM Watson IoT Platform 上,我在日志中看到了这个错误,没有其他错误:

Closed connection from 213.55.176.207. The operation is not authorized.

现在我创建了一个小测试index.html file. If I'm connecting as a device, it still doesn't work, but if I'm connecting as an application it works, as can be seen here。但我已经在平台中创建了设备。如果我使用的是旧的 Watson IoT Platform 实例,它可以工作,但不能使用较新的实例。

我做错了什么?

在您的应用程序代码中,您有:

window.client = new Paho.MQTT.Client("bmzc5i.messaging.internetofthings.ibmcloud.com", 8883, 'a:myOrgId:'+Math.random().toString(16).substr(2, 8));

没问题,应用连接时id的格式是a:orgId:uniqueIdentifierForTheApplication

uniqueIdentifierForTheApplication 可以是任何字符串(在允许的字符集中),并且不需要预先注册,所以在这里生成随机数在 99% 的情况下都有效。

window.client = new Paho.MQTT.Client("bmzc5i.messaging.internetofthings.ibmcloud.com", 8883, 'd:bmzc5i:'+Math.random().toString(16).substr(2, 8));

当设备连接时,id 的格式为 d:orgId:typeId:deviceId。要连接设备,必须先注册它,因此 d:orgId:randomNumber 的 ID 将不起作用。

如果您注册了一个设备类型为 ID myType 且 ID 为 myDevice 的设备,并将其身份验证令牌设置为 myToken,那么您将形成如下连接:

window.client = new Paho.MQTT.Client("bmzc5i.messaging.internetofthings.ibmcloud.com", 8883, 'd:bmzc5i:myType:myDevice'); window.client.connect({ onSuccess: onConnectSuccess, onFailure: onConnectFailure, userName: "use-token-auth", password: "myToken", useSSL: true

另外,作为设备连接和作为应用程序连接时,您应该注意主题 space 的区别。

当您作为应用程序连接时,您拥有整个组织范围。因此,对于代表设备的 publish/subscribe 事件,您可以使用以下主题:

发布到 iot-2/type/myType/id/myDevice/evt/statusEvent/fmt/json

当您作为设备连接时,您只有设备范围(这是一种安全机制,用于限制受感染设备可能造成的损害)。所以对于一个设备来说,同样的事情是通过发布到:

iot-2/evt/statusEvent/fmt/json

平台使用进行发布的设备的身份来确定属于哪个设备,而对于应用程序,应用程序决定将事件分配给哪个设备。