如何通过物联网提高 AWS Lambda 和 Web 应用程序之间 MQTT 消息的可靠性
How to increase reliability of MQTT messages between AWS Lambda and web app via IoT
我在持续接收由 Lambda 函数发布并由 Web 应用程序订阅的 MQTT 消息时遇到问题(在 IoT 中使用名为 "workstation" 的 "thing")。有时我会立即得到它们,但有些断断续续,但大多数情况下,如果我完全得到它们,我会在很长时间的延迟后得到它们。我总是能够连接和订阅。我试过 qos 0 和 1。
编辑:如果我只使用不带 $aws/... 前缀的通用主题字符串,并且 qos 为 1,我现在倾向于收到我发送的大部分消息。但它们很少是直接的,它们往往会叠加并一次通过多个。还有几个完全丢失了。
我有一个服务于 Alexa 技能的 Lambda 函数,它发布到 IoT MQTT topic/thing,如下所示:
var params = {
// have also tried topic strings without $aws/things/ prefix here
topic: '$aws/things/workstation/',
payload: new Buffer('test message'),
qos: 0
};
iotData.publish(params, function(err, data) {
if (err) console.log('ERR: ', err); // an error occurred
else if (data) console.log('DATA: ', data); // successful response
});
然后我有一个使用 AWS IOT 设备 SDK 的 Web 应用程序订阅了该 MQTT 通道并侦听如下消息:
var device = awsIoT.device({
keyPath: './keys/abcd1234xyz-private.pem.key',
certPath: './keys/abcd1234xyz-certificate.pem.crt',
caPath: './keys/root-CA.crt',
clientId: 'workstation',
region: 'us-east-1',
host: "abcd1234xyz.iot.us-east-1.amazonaws.com",
port: 8883
});
device.on('connect', function() {
console.log('connect');
// have also tried topic strings without $aws/things/ prefix here
device.subscribe('$aws/things/workstation/');
});
device.on('message', function(topic, payload) {
console.log('message', topic, payload.toString());
});
Web 应用程序的每个用户最终都使用相同的客户端 ID 吗?客户端 ID 和证书对将断开任何重复的连接。此外,$aws 是影子主题(和其他诊断主题)的前缀。也许使用 things/workstation?
我在持续接收由 Lambda 函数发布并由 Web 应用程序订阅的 MQTT 消息时遇到问题(在 IoT 中使用名为 "workstation" 的 "thing")。有时我会立即得到它们,但有些断断续续,但大多数情况下,如果我完全得到它们,我会在很长时间的延迟后得到它们。我总是能够连接和订阅。我试过 qos 0 和 1。
编辑:如果我只使用不带 $aws/... 前缀的通用主题字符串,并且 qos 为 1,我现在倾向于收到我发送的大部分消息。但它们很少是直接的,它们往往会叠加并一次通过多个。还有几个完全丢失了。
我有一个服务于 Alexa 技能的 Lambda 函数,它发布到 IoT MQTT topic/thing,如下所示:
var params = {
// have also tried topic strings without $aws/things/ prefix here
topic: '$aws/things/workstation/',
payload: new Buffer('test message'),
qos: 0
};
iotData.publish(params, function(err, data) {
if (err) console.log('ERR: ', err); // an error occurred
else if (data) console.log('DATA: ', data); // successful response
});
然后我有一个使用 AWS IOT 设备 SDK 的 Web 应用程序订阅了该 MQTT 通道并侦听如下消息:
var device = awsIoT.device({
keyPath: './keys/abcd1234xyz-private.pem.key',
certPath: './keys/abcd1234xyz-certificate.pem.crt',
caPath: './keys/root-CA.crt',
clientId: 'workstation',
region: 'us-east-1',
host: "abcd1234xyz.iot.us-east-1.amazonaws.com",
port: 8883
});
device.on('connect', function() {
console.log('connect');
// have also tried topic strings without $aws/things/ prefix here
device.subscribe('$aws/things/workstation/');
});
device.on('message', function(topic, payload) {
console.log('message', topic, payload.toString());
});
Web 应用程序的每个用户最终都使用相同的客户端 ID 吗?客户端 ID 和证书对将断开任何重复的连接。此外,$aws 是影子主题(和其他诊断主题)的前缀。也许使用 things/workstation?