1、注册并登录亚马逊
自行注册账号就行,不需要银行卡什么的
2、开始配置技能
1、打开网站 https://developer.amazon.com/zh/
进入亚马逊开发页面,然后点击 “alexa” 按钮进入技能配置页面
2、技能说明
点击create Alexa Skills
;
3、介绍页
点击create Alexa Skills
后会进入一个介绍页面,有需要的可以看下介绍,然后点击 console
按钮进入控制台页面
4、控制台
直接点此链接也可进入控制台:https://developer.amazon.com/alexa/console/ask
,
因为现在还没有技能,所有我们需要先创建一个技能出来,点击create skill
按钮
5、创建技能
依次填写技能名称、语言环境、模式(选择智能家具)
6、配置技能
这里有一点需要说明下,亚马逊的语音控制需要配合 Lamdba
使用, 每一个区域使用不同的端点, 下面会讲解如何配置lambda
3、配置lambda
1、 打开链接: https://us-east-1.console.aws.amazon.com/console/home?nc2=h_ct®ion=us-east-1&src=header-signin#
点击 lambda
按钮
2、创建lambda
点击创建函数
按钮
3、填写创建信息
依次填写 函数名称、运行时环境,其他默认既然,然后点击创建函数
按钮
创建后如下图,注意:其中的 函数 ARN 就是我们等下需要用到的 端点,而右上角就是端点所在的区域,每个区域都有不同的端点
4、函数代码
接下来我们需要上传自己的函数代码,在上传之前,先来看看代码
pom.xml
文件内容如下
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- aws iot -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-iot-device-sdk-java</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-iot-device-sdk-java-samples</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
<build>
<finalName>xx-common-alexa-${profiles.active}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources/</directory>
<excludes>
<exclude>dev/*</exclude>
<exclude>test/*</exclude>
<exclude>prod/*</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources/${profiles.active}</directory>
</resource>
</resources>
</build>
<!-- 执行打包命令,如:mvn clean package -Pprod-->
<profiles>
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
AlexaResponse.java
文件内容如下
package com.xx.alexa.vo;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class AlexaResponse<T> implements Serializable {
/** 请求ID **/
private String reqId;
/** 请求时间戳(10位) **/
private Long time;
/** 响应状态码 **/
private int code;
/** 响应消息 **/
private String message;
/** 响应数据 **/
private T data;
}
AlexaHandler.java
文件内容如下
package com.xx.alexa;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.xx.alexa.vo.AlexaResponse;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
import java.util.Properties;
public class AlexaHandler implements RequestHandler<Map<String,Object>, Object> {
private String requestUrl = null;
private RestTemplate restTemplate = new RestTemplate();
@Override
public Object handleRequest(Map<String, Object> event, Context context) {
// LambdaLogger logger = context.getLogger();
LambdaLogger logger = null;
loadApiUrl(logger);
String json = request(event,logger);
AlexaResponse response = JSONUtil.parseObj(json).toBean(AlexaResponse.class);
return response.getData();
}
protected String request(Map<String, Object> event,LambdaLogger logger){
String body = JSONUtil.toJsonStr(event);
HttpHeaders headers = getHeaders();
String response = "";
long time = System.currentTimeMillis();
try {
ResponseEntity<String> responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, new HttpEntity(body,headers), String.class);
response = responseEntity.getBody();
} catch (HttpServerErrorException e){
response = e.getResponseBodyAsString();
logger.log(StrUtil.format("亚马逊AlexaAPI, 调用失败. error:{}",response));
}catch (Exception e){
response = e.getMessage();
logger.log(StrUtil.format("亚马逊AlexaAPI, 调用失败. error:{}",e.getMessage()));
}finally {
Long curTime = System.currentTimeMillis();
logger.log(StrUtil.format("亚马逊AlexaAPI, apiUrl:{}, 耗时:{}ms, body:{}, response:{}", requestUrl,(curTime-time),body,response));
}
return response;
}
private HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json;charset=UTF-8");
return headers;
}
public void loadApiUrl(LambdaLogger logger){
if(StrUtil.isEmpty(requestUrl)){
Properties properties = new Properties();
try {
properties.load(ResourceUtil.getStream("config.properties"));
requestUrl = (String) properties.get("requestUrl");
System.out.println(requestUrl);
} catch (Exception e) {
logger.log(StrUtil.format("加载requestUrl失败. error:{}",e.getMessage()));
}
}
}
public static void main(String[] args) {
AlexaHandler handler = new AlexaHandler();
handler.loadApiUrl(null);
}
}
config.properties
文件内容如下
requestUrl=https://yexindong.hnlhzw.cn/trd-service/v1/alexa/service
最后看看java代码的项目结构
5、打包
输入以下命令将项目打成jar包,其中 dev表示环境
mvn clean package -Pdev
6、上传函数jar包
再次回到刚才的页面,因为我缩写的语言是java,所以我选择的文件是jar包;
将刚才打包好的jar包上传到亚马逊,因为是国外网站,有可能会上传失败,多试几次就好;
7、修改处理程序的方法
点击运行时设置的编辑按钮
将处理程序改为你的 全类名 + 方法明 : com.xx.alexa.AlexaHandler::handleRequest
,其中 :
com.xx.alexa.AlexaHandler
是全类名handleRequest
是方法名称
最后点击保存按钮
修改完成
8、添加触发器
点击 添加触发器
按钮
之后我们需要选择一个源
我们用的是语音控制,所以选择 alexa
在技能控制台将技能编号复制过去,然后点击添加
按钮
到此,一个触发器就创建好了
9、复制端点
将 lambda中的函数 ARN 复制到 技能的默认端点
和 北美端点
10、配置关联账号
填写相应的授权信息,使用auth2.0协议
需要注意的是,身份验证方案
这一栏,要选择 请求正文中的凭据