如何使用 Amazon Alexa 访问本地 API

Posted

技术标签:

【中文标题】如何使用 Amazon Alexa 访问本地 API【英文标题】:How can I access a local API using Amazon Alexa 【发布时间】:2017-10-19 21:23:44 【问题描述】:

我打算为Amazon Alexa 建立一套技能,这些技能将与在我家的 RaspberryPi 上运行的自定义软件套件集成。

我正在努力弄清楚如何让 Echo / Dot 本身直接对树莓派进行 API 调用 - 无需通过互联网,因为目标设备将只有一个 内联网 em> 连接 - 它将能够从本地网络上的设备接收命令,但无法通过世界访问。

根据我的阅读,典型的工作流程如下

Echo -> Alexa Service -> Lambda

Lambda 函数将数据块返回到智能家居设备的位置;使用这个返回值

是否有可能,在收到 lambda 的响应后,如何让 Alexa 设备本身向本地网络上的设备发出 API 请求?

【问题讨论】:

【参考方案1】:

我有同样的问题,我的解决方案是使用 SQS 作为消息总线,这样我的 RaspberryPi 就不需要从 Internet 访问。

Echo <-> Alexa Service <-> Lambda -> SQS -> RaspberryPi
                             A                 |
                             +------ SQS <-----+

只要满足以下条件就可以正常工作:

您在 RaspberryPi 上启用 SQS 的长轮询(20 秒)并将每个请求的最大消息数设置为 1 您没有在 Alexa 和 RaspberryPi 之间来回发送并发消息

这有以下好处:

最大消息大小为 1 时,SQS 请求将在队列中有一条消息可用时立即返回,即使在满足长轮询超时之前也是如此 在整个月内一次只对 SQS 进行 1 次长轮询,这符合 100 万个请求的 SQS 免费层级 没有特殊的防火墙权限可用于从 Internet 访问您的 RaspberryPi,因此 RaspberryPi 与 lambda 的连接始终“正常工作” 比将您的 RaspberryPi 暴露在互联网上更安全,因为没有开放端口可供恶意程序攻击

【讨论】:

我意识到这已经是四岁了,但我正在考虑为 Alexa 技能做这件事并找到了这篇文章。从长远来看,这对你有什么影响?您是否只是在无限循环中运行它,一旦前一个返回就执行新的长轮询? 这个解决方案还能用吗??我很感兴趣【参考方案2】:

您可以尝试使用 AWS IoT:

Echo <-> Alexa Service <-> Lambda <-> IoT <-> RaspberryPi

我曾打算将它用于我的 Alexa RasberryPi 项目,但放弃了这个想法,因为 AWS IoT 不提供永久免费套餐。但免费套餐不再是问题,因为亚马逊现在提供 Alexa AWS 促销积分。 https://developer.amazon.com/alexa-skills-kit/alexa-aws-credits

【讨论】:

嗯,物联网是一个很好的选择——我还没有真正研究过它,但它似乎正是我所需要的。【参考方案3】:

一种可能性是在您的 rPi 上安装 node-red。 Node-red 有插件 (https://flows.nodered.org/node/node-red-contrib-alexa-local) 来模拟飞利浦色调并让 Alexa 直接与其对话。这是一个即时响应。缺点是它仅适用于 3 个命令:onoffset to x %。非常适用于控制灯光、窗帘和空调的软件/设备。

【讨论】:

... 和 increase%, decrease% Node-RED 是一个不错的选择。将其与dataplicity 服务结合并设置 nginx,您将拥有无限数量的 API 端点。 是的,我使用与 Alexa 不兼容的 tcp/ip 调光器和快门控制,这要归功于 node-red。 @bal simpson - 哇,谢谢不知道 dataplicity。 dataplicity 很棒。通过一些更改,您可以从任何地方访问您 Pi 上的 Node-Red。为什么不创建自定义技能并将其定向到 Node-Red 上的端点?您可以拥有更大的控制权,也可以只拥有一项技能,根据您使用的设备名称完成所有操作。【参考方案4】:

不久前在this 论坛上回答了这个问题,我很害怕告诉你,从那以后情况就没有改变了:

Alexa 是基于云的,需要访问互联网/亚马逊服务器才能运行,因此您不能仅在没有外部访问的情况下在 Intranet 中使用它。

【讨论】:

我明白,通过要求 Alexa 做某事,我绝对会使用 Alexa 服务,因此为此需要网络访问;我的问题更重要的是,在我得到 Alexa 网络服务的响应后,我可以让集线器本身发出 API 请求说,10.0.0.10:8080 从这个意义上说,我将拥有互联网Alexa 上的连接,但最终命令应在本地执行 - 以避免在我的网络中出现一个漏洞,让 lambda 函数接触。 为什么亚马逊每个人都允许这样做。当然,他们希望通过 Web 服务强制进行所有通信。 是的,我想他们希望你(我们所有人)被锁定>:D 是否有任何 Alexa Echo 替代方案可以仅在本地运行,只需几个基本短语? @VladimirVukanac 不是离线/本地,但他们有 echosim.io/welcome 用于测试【参考方案5】:

我见过几种解决方法。

第一种方法是我用过的: 我设置 If This Then That (IFTTT) 来监听来自 Alexa 的特定短语,然后通过 Telegram 安全聊天/消息服务传输命令,在该服务中,我使用运行在我的树莓派上的“聊天机器人”来阅读和处理这些消息。

我最近看到的第二种方法是使用 IFTTT 将行添加到树莓派可以监控和操作的谷歌电子表格中。

我对这两种方法的性能/延迟并不特别满意,但如果我使用类似的方法编写自定义 Alexa 服务,它至少可以消除 IFTTT 延迟。

【讨论】:

【参考方案6】:

只需使用https://ngrok.com/ 之类的服务打开一个 SSH 隧道进入您的 rPi,然后作为您的端点或从 lambda 与它通信。

【讨论】:

抱歉,没有看到@u.gen 响应,这是等效的,但它不依赖于节点。【参考方案7】:

您可以通过使用代理来实现这一点。 BST 有一个工具,我目前使用那个http://docs.bespoken.tools/en/latest/commands/proxy/

因此,您可以使用本地机器,而不是使用Lambda

基本上它变成了Echo -&gt; Alexa Service -&gt; Local Machine

安装 npm bst 到你的本地机器https://www.npmjs.com/package/bespoken-tools

npm install bespoken-tools --save

转到您的项目 index.js 文件夹并运行代理命令

bst proxy lambda index.js

这将为您提供如下网址: https://proxy.bespoken.tools?node-id=xxx-xxx-xxx-xxx-xxxxxxxx

现在转到 developer.amazon 上的您的 alexa 技能,然后单击以配置您的技能。

选择你的服务端点为 https 并输入 BST 打印出来的 url

然后点击保存,你的本地机器就成为了最终的终点。

【讨论】:

感谢您的回复,但这仍然不是我想要的,因为这与在我的防火墙上打一个洞没有什么不同 - 除了在这个解决方案中我将使用中间件.我想我需要构建自己的中间件来执行此操作,以便我可以让其他用户将自己的端点设置到他们的本地环境中:/ 不过很高兴知道,Alexa 端点是可定制的。 你在尝试Echo -&gt; Local Machine 吗?我认为目前这是不可能的。 我的理想数据包流将是Echo -&gt; Alexa Services -&gt; Lambda -&gt; Echo -&gt; Local Machine,最终端点将是房子内的一块硬件,它本身不会有云连接。 我可能需要推出一些自定义代理软件来充当中间人,并且可能必须将我的应用程序变成基于云的应用程序才能按预期工作。跨度>

以上是关于如何使用 Amazon Alexa 访问本地 API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Amazon Alexa 捕获小数?

Amazon Alexa登录授权(Android)

Alexa 技能未在 Amazon Alexa 应用程序中调用,但可在开发控制台中使用

如何将 Amazon Alexa SDK 集成到 Android 应用程序?

从 Amazon Alexa 技能包发送 HTTP 发布请求

Amazon Alexa Skills Kit:如何与外部应用程序帐户/用户 ID 关联