【问题标题】:AWS Lambda cannot publish to IoT topic properlyAWS Lambda 无法正确发布到 IoT 主题
【发布时间】:2022-01-22 22:28:14
【问题描述】:

我使用 JavaScript 编写了 Lambda 函数,它会响应我的声音并打开我的 Raspberry 上的 LED。 但是我在将其状态发布到我的事物主题时遇到了问题。虽然 Alexa 响应正确(如果我要求将其打开,则为“打开”,如果要求关闭,则为“关闭”),但我的主题并不总是会发生状态变化。有时它会获取数据,有时它不会,在多次调用后它会批量获取数据,我什至无法获得在该批量中创建数据序列的逻辑。

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!');
  }
});
}

您对其原因有什么想法吗?谢谢!

【问题讨论】:

    标签: node.js aws-lambda aws-iot


    【解决方案1】:

    iotData.publish 等异步方法会导致 AWS Lambda 出现问题,因为您请求执行,而 lambda 函数很快结束,无需等待响应并处理请求。

    另一个问题可能是您的权限。

    【讨论】:

    • 如果我没猜错 - 我给了它完整的 Lambda 和 IoT 访问权限。我对它的异步问题有想法,但我根本无法解决它,因为我是 node.js 和 js 的新手。更改方法还是使用 promises/async-await 使其正常工作更好?
    • 不知道你使用的这个库有没有同步发布的方法,如果有方法可以使用,问题会解决,否则需要实现async-await。跨度>
    【解决方案2】:
    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

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 2019-11-04
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2018-03-25
      相关资源
      最近更新 更多