如何使用Amazon Alexa访问本地API

时间:2017-05-19 16:51:24

标签: api aws-lambda alexa alexa-skills-kit alexa-skill

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

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

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

nm -f label_image | grep event_base
  U _event_base_dispatch
  U _event_base_new

Lambda函数将向智能家居设备返回一团数据;使用此返回值

  

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

7 个答案:

答案 0 :(得分:7)

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

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

只要符合以下条件,这项工作正常:

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

这样可以带来以下好处:

  • 最大邮件大小为1,即使在满足长轮询超时之前,只要队列中有一条消息可用,SQS请求就会返回
  • 每个SQS一次只进行1次长时间轮询,这符合SQS免费等级的100万次请求
  • 没有从互联网访问您的RaspberryPi的特殊防火墙权限,因此RaspberryPi与lambda的连接总是“正常”
  • 比将RaspberryPi暴露给互联网更安全,因为没有暴露的恶意程序攻击的开放端口

答案 1 :(得分: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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

前一段时间在this论坛上得到了答案,我不敢告诉你情况自那以后没有改变:

  

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

答案 4 :(得分:1)

我曾经使用过几种解决方法。

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

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

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

答案 5 :(得分:0)

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

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

基本上它变成了Echo -> Alexa Service -> 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打印的网址

enter image description here

然后单击“保存”,然后将本地计算机作为最终结束点。

答案 6 :(得分:0)

只需使用https://ngrok.com/之类的服务在您的rPi中打开SSH隧道,然后作为端点或通过lambda与之通信即可。