无法使用Eclipse PAHO MQTT Library for JavaScript连接到IBM Watson IoT Platform

时间:2017-08-19 18:37:35

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

出于安全原因,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物联网平台的旧实例,它可以正常工作,但不能使用更新的实例。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

在您的应用程序代码中:

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。要连接设备,必须先注册,因此ID为d:orgId:randomNumber将无效。

如果您注册ID为myDevice且ID为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

平台使用发布设备的标识来确定属于哪个设备,而使用应用程序时,应用程序决定将事件分配给哪个设备。