【问题标题】:Cannot connect to IBM Watson IoT Platform using Eclipse PAHO MQTT Library for JavaScript无法使用 Eclipse PAHO MQTT Library for JavaScript 连接到 IBM Watson IoT Platform
【发布时间】:2017-08-19 18:37:35
【问题描述】:

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

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

This application 坏了。因此我试图在这个fork 中修复它。

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

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

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

从 213.55.176.207 关闭连接。该操作未经授权。

现在我创建了一个小测试index.html 文件。如果我作为设备连接,它仍然无法工作,但如果我作为应用程序连接,它可以工作,如here 所示。但我已经在平台中创建了设备。如果我使用的是 Watson IoT Platform 的旧实例,它可以工作,但不能使用较新的实例。

我做错了什么?

【问题讨论】:

    标签: javascript ibm-cloud mqtt iot watson-iot


    【解决方案1】:

    在您的应用程序代码中:

    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 不起作用。

    如果您注册一个设备类型为myDevice 的设备,其设备类型为myType,并将其身份验证令牌设置为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

    此外,您应该注意在作为设备连接和作为应用程序连接时主题空间的差异。

    当您作为应用程序连接时,您拥有整个组织范围。因此,要代表设备发布/订阅事件,您将使用以下主题:

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

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

    iot-2/evt/statusEvent/fmt/json

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

    【讨论】: