出于安全原因,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物联网平台的旧实例,它可以正常工作,但不能使用更新的实例。
我做错了什么?
答案 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
平台使用发布设备的标识来确定属于哪个设备,而使用应用程序时,应用程序决定将事件分配给哪个设备。