【问题标题】:What to answer an AWS Lambda when answering Alexa Smart Home Skill asynchronous via event gateway?在通过事件网关异步回答 Alexa Smart Home Skill 时如何回答 AWS Lambda?
【发布时间】:2020-09-19 18:55:29
【问题描述】:

我正在为 Alexa 开发一项智能家居技能。因此,来自 Alexa 的所有请求都发送到我的 AWS Lambda 函数,然后将请求转发到我们的服务器,该服务器与各个智能家居设备联系。 因此,根据 Alexa 文档 (https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-response.html#response),我可以同步回答这些请求,这意味着我一直等到设备上的操作完成(而 lambda 和我们的服务器之间的 http 连接保持打开状态 -> 导致收费为lambda 运行时间更长)并通过 lambda 将响应发送回 Alexa。

另一种选择是通过将答案作为新的 http 请求发送到 Alexa 事件网关来异步回答。

由于某些操作需要一些时间(考虑到从我们的服务器到智能家居设备的方式、执行操作、应答等),我更喜欢异步方法,因为它还可以节省 lambda 的时间。我已经实现了所有必要的组件来回答异步,但我不知道我应该回答 lambda,以防我回答异步。

我的 Lambda 目前看起来有点像这样:

const https = require('https');

exports.handler = function (request, context) {

    function handleServerRequest(request, context) {

        const doPostRequest = () => {

            const data = request;

            return new Promise((resolve, reject) => {
                const options = {
                    host: 'xxx.ngrok.io',
                    path: '/dyn/alexa/request',
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    }
                };

                /* ... perform https request and resolve promise*/
            });
        };


        doPostRequest().then((response) => {

            log("DEBUG", "Server Response: ", JSON.stringify(response));

            // in case the server decides to answer async (via event gateway) it 
            // immediately answers the https request with a flag "async: true". 

            if(response.async) {
                // -> WHAT TO TELL THE LAMBDA HERE?
                //context.succeed();
                return;
            }
            context.succeed(response);
        });

    }

    handleServerRequest(request, context, "");


当我只是在没有正确响应的情况下执行 context.succeed() 时,我会在 Alexa 应用程序中收到一个错误,告诉我“设备没有反应”,然后在 Alexa 收到后尽快指示正确状态通过事件网关的有效 StateReport 指令。

如果我会异步回答,如何正确结束 lambda 函数?

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda alexa alexa-skill


    【解决方案1】:

    我就此联系了 Alexa 支持。我从谈话中得到的是

    处理异步响应的文档化方法是发送 任何同步响应之前的异步响应

    根据经验,“任何类型的同步响应”包括返回 null、空对象,甚至在不向输出流写入任何内容的情况下返回(在 Java 11 Lambda 函数的上下文中)。

    这对我来说破坏了异步响应的大部分意义,因为 Lambda 函数不能完全委托给设备云并返回,而是必须等待它响应。或者干脆休眠直到超时,希望设备云在此之前异步响应。

    【讨论】:

      【解决方案2】:

      我有同样的问题。 我刚刚验证了在处理程序中发送 DeferredResponse 同步 并稍后 POST 异步更新 到 Alexa 事件网关,它可以工作。

      我测试了 PowerControllerPowerLevelController 的请求,在不久的将来我会测试其他的。

      【讨论】:

        【解决方案3】:

        根据我的经验,您可以发送同步或异步响应(不能同时发送),这需要事先设置。

        要设置异步响应,请参阅doc,其中提到:

        在权限页面上,滑动发送 Alexa 事件以指示您的技能将发送异步响应和/或更改报告事件。

        【讨论】:

        • 但这怎么可能,因为 Alexa 发送的某些指令只能同步回复?例如Discover 或 Authorization.Grant 指令?
        • 是的,并非所有接口都支持异步响应。您必须实现您的逻辑,以根据收到的事件同步或异步响应指令。
        猜你喜欢
        • 2019-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 2019-11-09
        • 2020-10-15
        • 1970-01-01
        相关资源
        最近更新 更多