亚马逊AWS官方博客

使用 Amazon Lambda 和 DynamoDB构建 Alexa WWA 智能家居设备的 SmartHome Skill

亚马逊的 Alexa 生态中的智能设备按照其设备认证有如下两类。分别为 Alexa Built-in(ABI) 设备,以及 Work with Alexa(WWA) 设备。ABI 的设备允许用户通过您的硬件和 Alexa 进行对话,获得和 Echo Speaker 类似的工作体验。WWA 的设备可以被 Echo Speaker 等 ABI 设备来控制来工作。本文我们将介绍如何使用 Amazon Lambda 和 DynamoDB 构建 WWA 的智能家居设备,让我们的设备具备听懂 Alexa 指令的能力来工作。与之前的文章不同,之前的文章 Alexa 入门实验 以及 手把手教你如何用Lambda + Alexa调用echo设备 着重在 ABI 设备,本文会关注 WWA 设备。

环境准备

由于本实验中涉及的组件较多,我们分别需要在本地开发环境分别准备好

  1. 亚马逊 Alexa 的开发者账号 https://developer.amazon.com/
  2. 亚马逊云科技的账号 https://aws.amazon.com/
  3. Python 3.7 以上的运行环境 https://www.python.org

Login With Amazon 登陆组件注册

在 Alexa 中,我们为了完成 3P 登陆,需要集成账号系统,此处我们使用 Login With Amazon 来作为 OAuth 的组件,登陆之后,点击 Create a New Security Profile 来创建一个新的登陆应用,将被用于 Alexa SmartHome Skill 授权页。

按照需求填写自己合适的内容并 Save。

点击 Show Client ID 并记录下 Oauth2 的 Credentials 的信息。并保存记录。

[Login with Amazon Client ID]
amzn1.application-oa2-client.XXXXXXX
[Login with Amazon Client Secret]
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx

此处的信息将在后续的 Account Linking 中用到,接下来我们将在 Alexa Skill 控制台中创建 Skill。

创建 Smart Home Skill

Smart Home Skill 是 Alexa Skill Model 中的一种,其中包含了智能家居中常见的设备的指令控制的接口。构建智能家居 IoT 设备我们一般使用 Smart Home Skill,其中包含了常见的品类,包含门铃,猫眼,安防摄像头等。进入 Alexa ASK 后,点击 Create Skill 来创建 Skill,这里我们以 skill-sample-python-smarthome-switch 为例作为 SKill 的名字,Skill 的 Model 选择 SmartHome Skill。

创建完成之后会提供 Skill ID,在下一步创建 Lambda 函数中我们会用到。下面空着的 Default endpoint 也会在创建 Lambda 中获得并填写。

创建 Amazon Lambda 函数

我们首先登陆到 Lambda 的控制台 ,创建新的 function。Runtime 选择 Python 3.7 来创建一个 Python 3.7 运行时的

点击 Trigger 选择 Alexa 后选择 Smart Home,在这一步中填写上一节在 Alexa 控制台中获得的 Skill ID 将 Lambda 和 Alexa 的 Skill 绑定。

之后我们在记录下 Function Arn 回填到 Alexa 控制台的 Endpoint 中,以便于 Alexa 端识别 Skill 的 Endpoint。

完成 Alexa 的 Account Linking

所有的 Smart Home, Video 和 Meeting SKill,都需要和身份认证提供商(Identity Provider)集成,以便于做账号登陆,获取用户信息的上下文。我们接下来处理 Alexa 的 Account Linking,以便于第三方登录,通过 Oauth 获取用户信息,构建智能家居应用。

我们点击 Account Linking,并依次填写在 LWA 步骤中创建的登陆系统中的 Clinet ID 和 Secriet。

Your Web Authorization URI 填写 https://www.amazon.com/ap/oa

Access Token URI 填写 https://api.amazon.com/auth/o2/token

Scope 代表在 OAuth 权限的 Scope,这里我们仅获取用户 Profile 即可,我们填写 profile:user_id

Alexa Redirect URLs 中我们填写 Login With Amazon 中的 Return Url 用作 Oauth 登陆的 Redirect URLs。

完成后的 Account Linking 应为下图所示。

至此,我们完成了 Alexa Skill 和对应 Amazon Lambda 的绑定,接下来我们将创建 DynamoDB 表并部署 Lambda Function。

创建 DynamoDB 表

Amazon DynamoDB 是一种完全托管式、无服务器的 NoSQL 键值数据库,旨在运行任何规模的高性能应用程序。可以轻松满足满足数百万用户的高并发性和连接,以及每秒数百万个请求。我们参考以下配置创建 DynamoDB 的表,并用于作为 SmartHome Skill 的后端数据库。

部署 Lambda 函数

我们接下来下载项目所用到的工程。

git clone https://github.com/alexa/skill-sample-python-smarthome-switch

并 cd 到 目录 skill-sample-python-smarthome-switch/lambda/smarthome 下,运行 zip -r package.zip alexa/ lambda_function.py 来将代码打包。

我们重新登录 Lambda 的控制台,然后上传 Zip 代码包,来将项目部署。

我们接下来配置 Lambda 的 IAM 角色,以便 Lambda 能够访问所需的云上资源。

点击 Configuration 后选择 Excution Role,并更改 Policy 。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "dynamodb:UpdateItem",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

登陆并测试

由于 Smart Home Skill 需要 Account Linking,为了测试方便,我们使用手机 Alexa APP 来登陆来进行 Account Linking 并模拟 Echo 音响对话。

此处我们构建的是一个简单的开关应用。我们可以使用如下 directive 来进行控制。

“Alexa turn on/off the Sample Switch”

我们也可以登陆 DynamoDB,看到 SmartHome 表中有记录的数据。

至此我们完成了 Alexa 的 3P 登陆,Skill 创建,DyanmoDB 表和 Lambda Skll 的部署,并用手机 Alexa APP 完成了 SmartHome Skill 的控制。

本篇作者

Aonan Guan

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,曾任算法工程师和部署平台全栈软件开发工程师。

郑辉

亚马逊云科技解决方案架构师,负责基于亚马逊云计算方案架构的咨询和设计,在国内推广亚马逊云平台技术和各种解决方案。同时负责物联网行业解决方案开发和推广,在物联网,移动端开发等领域有着广泛的设计和实践经验。

汪建业

亚马逊云科技解决方案架构师,负责基于AWS云计算方案架构的咨询和设计,同时致力于 AWS IoT 和大数据服务在国内和全球企业客户的应用和推广。十余年分布式应用、大数据的分布式处理经验。