由于安全原因,IBM最近似乎停止接受到MQTT borker的非TLS连接。
我喜欢一个小应用程序,它使用JavaScript从智能手机读取加速度传感器数据,并通过MQTT发送给消息代理。
如前所述,非TLS连接被拒绝,这就是我启用TLS的原因:
window.client.connect({
onSuccess: onConnectSuccess,
onFailure: onConnectFailure,
userName: "use-token-auth",
password: window.password,
useSSL: true
});但还是没有联系。在IBM平台上,我在日志中看到了这个错误,没有别的:
封闭连接自213.55.176.207。该操作未获授权。
现在,我创建了一个测试index.html文件。如果我是作为设备连接,它仍然不工作,但如果我连接作为一个应用程序,它可以工作,如可以看到的这里。但我已经在平台上创建了设备。如果我使用的是沃森IoT平台的旧实例,那么它可以工作,但对于更新的实例则不行。
我做错了什么?
发布于 2017-08-21 08:34:03
在应用程序的代码中,您有以下内容:
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 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
平台使用进行发布的设备的标识来确定属于哪个设备,而在应用程序中,应用程序决定将事件分配给哪个设备。
https://stackoverflow.com/questions/45775107
复制相似问题