【发布时间】:2018-08-06 16:18:37
【问题描述】:
当我尝试使用MQTT.js (https://github.com/mqttjs/MQTT.js) 连接到 Azure IotHub 时,我不断回复 Connection refused: Not authorized。
SAS 密码是使用 Microsoft 设备资源管理器 (https://github.com/Azure/azure-iot-sdk-csharp/tree/master/tools/DeviceExplorer) 生成的,因此提供正确的读/写连接详细信息以及未来的到期日期,我假设它是正确且有效的。
我还要求通过 rejectUnauthorized: false 启用 TLS/SSL(根据 Microsoft Azure 文档:https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support#tlsssl-configuration)(如 https://github.com/mqttjs/MQTT.js#client 的 MQTT.js 文档中所述)。
如何使用 3rd 方 MQTT 库和 SAS 令牌通过 Javascript 进行连接?
这是一段 Javascript 代码的 sn-p:
var MQTT = require("async-mqtt");
const deviceId = "<PUT_SOMETHING_HERE>";
const iotHubName = "<PUT_SOMETHING_HERE>";
const url = `${iotHubName}.azure-devices.net/${deviceId}/api-version=2016-11-14`;
const iotHubTopic = `devices/${deviceId}/messages/events/`
var client = MQTT.connect(`mqtts://${url}:8883`, {
username: url,
password: `SharedAccessSignature sr=${iotHubName}.azure-devices.net&sig=<COMBINATION_OF_PASSWORDS_URL_ENCODED>&se=<EPOCH_EXPIRY>&skn=<ACCESS_POLICY_NAME>`,
rejectUnauthorized: false, // https://github.com/mqttjs/MQTT.js#client
});
// this is code from the MQTT.js example, but I don't even reach it
async function doStuff() {
console.log("Starting");
try {
await client.publish(iotHubTopic, "It works!");
// This line doesn't run until the server responds to the publish
await client.end();
// This line doesn't run until the client has disconnected without error
console.log("Done");
} catch (e){
// Do something about it!
console.log("Error while sending a message...");
console.log(e.stack);
process.exit();
}
}
const ceremony = () => {
return new Promise((resolve, reject) => {
client.on("connect", doStuff);
return resolve();
})
.then((stuff) => {
console.log("Done?", stuff);
})
.catch((err) => {
console.log("Err...", err);
process.exit();
});
}
ceremony();
输出是这样的:
Done? undefined
events.js:183
throw er; // Unhandled 'error' event
^
Error: Connection refused: Not authorized
at MqttClient._handleConnack (<PATH_TO_THE_JS_PROJECT>/node_modules/mqtt/lib/client.js:896:15)
at MqttClient._handlePacket (<PATH_TO_THE_JS_PROJECT>/node_modules/mqtt/lib/client.js:332:12)
at work (<PATH_TO_THE_JS_PROJECT>/node_modules/mqtt/lib/client.js:274:12)
at Writable.writable._write (<PATH_TO_THE_JS_PROJECT>/node_modules/mqtt/lib/client.js:284:5)
at doWrite (<PATH_TO_THE_JS_PROJECT>/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:428:64)
at writeOrBuffer (<PATH_TO_THE_JS_PROJECT>/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:417:5)
at Writable.write (<PATH_TO_THE_JS_PROJECT>/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:334:11)
at TLSSocket.ondata (_stream_readable.js:639:20)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7)
【问题讨论】:
-
为什么不使用IoT Hub Device SDK?第 3 方 MQTT 库在 Azure IoT Hub 中是一种偶然发现,因为它不是一个真正的 代理(至少它不应该那样使用)。
-
刚刚试了一下,确实,它会抛出未经身份验证的 MQTTS,但可以在 Websockets 上运行,
var client = MQTT.connect(`wss://${url}`,... -
不,说得太早了。挂在
wss://。 -
@evilSnobu 我需要使用 MQTT(没有 AMQP 或其他协议),并且我试图避免包含我不会使用的代码,例如IoT Hub SDK 包含我不需要的不同协议的代码。另外:普通 MQTT 是 IoT Hub 官方文档中的一个有效选项。
-
不一定。你只能导入这个包:npmjs.com/package/azure-iot-device-mqtt。对于
Message类型,您可以从azure-iot-commonlib 中借用代码。
标签: node.js azure mqtt azure-iot-hub sasl