AWS Lambda 无法正确发布到 IoT 主题
AWS Lambda cannot publish to IoT topic properly
我使用 JavaScript 编写了 Lambda 函数,它响应我的声音并打开我的 Raspberry 上的 LED。
但是我在将其状态发布到我的事物主题时遇到了问题。虽然 Alexa 的响应是正确的("Turning on" 如果我要求打开它,"Turning off" 如果我要求关闭),我的主题并不总是得到状态变化。有时它会获取数据,有时它不会,在多次调用后它会批量获取数据,我什至无法理解在该批量中创建数据序列的逻辑。
var AWS = require('aws-sdk');
var config = {};
config.IOT_BROKER_ENDPOINT = "xxxxxx.iot.us-east-1.amazonaws.com";
config.IOT_BROKER_REGION = "us-east-1";
config.IOT_THING_NAME = "raspberry";
var iotData = new AWS.IotData({endpoint: config.IOT_BROKER_ENDPOINT});
var topic = 'LED';
exports.handler = function (event, context) {
...
...
function updatePowerState (intent, session, callback) {
var speechOutput = '';
var newValue = '';
var repromptText = '';
const cardTitle = 'Power';
var sessionAttributes = {};
const shouldEndSession = true;
var value = intent.slots.PowerState.value;
if(value == 'on' || value == 'off') {
newValue = value.toUpperCase();
speechOutput = 'Turning your lamp ' + value;
updateShadow(newValue);
} else {
speechOutput = 'I didnt understand you. Please, repeat your request.';
}
callback(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
}
function updateShadow(newValue) {
let payload = {
state: {
desired: {
power_state: newValue
}
}
};
var JSON_payload = JSON.stringify(payload);
var updates = {
topic: topic,
payload: JSON_payload,
qos: 0
};
iotData.publish(updates, (err, data) => {
if(err) {
console.log(err);
}
else {
console.log('Success!');
}
});
}
你对它的成因有什么想法吗?谢谢!
像 iotData.publish 这样的异步方法会导致 AWS Lambda 出现问题,因为您请求执行并且 lambda 函数很快就会结束,而无需等待响应和处理请求。
另一个问题可能是您的权限。
var AWS = require('aws-sdk');
var iotdata = new AWS.IotData({endpoint: 'iotCoreEndpoint.iot.us-east-1.amazonaws.com'});
exports.handler = async (event) => {
var params = {
topic: 'topic/topicName',
payload: JSON.stringify(event.body),
qos: 0
};
await iotdata.publish(params).promise()
};
只需确保添加所需的权限,或者您可以将以下策略附加到您的 lambda 角色:AWSIoTWirelessFullPublishAccess
我使用 JavaScript 编写了 Lambda 函数,它响应我的声音并打开我的 Raspberry 上的 LED。 但是我在将其状态发布到我的事物主题时遇到了问题。虽然 Alexa 的响应是正确的("Turning on" 如果我要求打开它,"Turning off" 如果我要求关闭),我的主题并不总是得到状态变化。有时它会获取数据,有时它不会,在多次调用后它会批量获取数据,我什至无法理解在该批量中创建数据序列的逻辑。
var AWS = require('aws-sdk');
var config = {};
config.IOT_BROKER_ENDPOINT = "xxxxxx.iot.us-east-1.amazonaws.com";
config.IOT_BROKER_REGION = "us-east-1";
config.IOT_THING_NAME = "raspberry";
var iotData = new AWS.IotData({endpoint: config.IOT_BROKER_ENDPOINT});
var topic = 'LED';
exports.handler = function (event, context) {
...
...
function updatePowerState (intent, session, callback) {
var speechOutput = '';
var newValue = '';
var repromptText = '';
const cardTitle = 'Power';
var sessionAttributes = {};
const shouldEndSession = true;
var value = intent.slots.PowerState.value;
if(value == 'on' || value == 'off') {
newValue = value.toUpperCase();
speechOutput = 'Turning your lamp ' + value;
updateShadow(newValue);
} else {
speechOutput = 'I didnt understand you. Please, repeat your request.';
}
callback(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
}
function updateShadow(newValue) {
let payload = {
state: {
desired: {
power_state: newValue
}
}
};
var JSON_payload = JSON.stringify(payload);
var updates = {
topic: topic,
payload: JSON_payload,
qos: 0
};
iotData.publish(updates, (err, data) => {
if(err) {
console.log(err);
}
else {
console.log('Success!');
}
});
}
你对它的成因有什么想法吗?谢谢!
像 iotData.publish 这样的异步方法会导致 AWS Lambda 出现问题,因为您请求执行并且 lambda 函数很快就会结束,而无需等待响应和处理请求。
另一个问题可能是您的权限。
var AWS = require('aws-sdk');
var iotdata = new AWS.IotData({endpoint: 'iotCoreEndpoint.iot.us-east-1.amazonaws.com'});
exports.handler = async (event) => {
var params = {
topic: 'topic/topicName',
payload: JSON.stringify(event.body),
qos: 0
};
await iotdata.publish(params).promise()
};
只需确保添加所需的权限,或者您可以将以下策略附加到您的 lambda 角色:AWSIoTWirelessFullPublishAccess