接入流程
公司已有自己的halo app--云平台--网关设备,现在需要支持alexa控制设备(智能家居私有云对接aws智能家居云)
alexa控制设备的流程

halo云平台需要实现接口功能
-
Oauth2.0鉴权
-
实现Discovery、ReportState、PowerController、BrightnessController、ColorTemperatureController、ThermostatController等技能api接口
-
基于lambda-runtime实现alexa-->lambda-->halo云平台转发
创建技能
登录alexa开发者平台,创建smart home技能




创建/发布Lambda函数
登录aws控制台,创建/发布lambda函数

选择美国和欧洲地区,发布lambda函数(因为技能alexa技能只支持北美、欧洲/印度、中东)

lambda函数我们可以选择在aws控制台进行创建并编写lambda具体实现接口代码(官方文档也有实例,python、nodejs等),也可以基于官方lambda-runtime实现,然后发布到aws指定区域,由于我们是用rust自己实现了alexa discover、reportstate等相关技能特性后端接口,lambda只是作为透传转发技能的请求
rust
use std::sync::LazyLock;
use std::time::Duration;
use anyhow::anyhow;
use reqwest::Client;
use serde_json::Value;
use tracing::{error, info};
const DEFAULT_URL: &'static str = "halo云实现技能接口的请求地址";
static DEFAULT_HTTP_CLIENT: LazyLock<Client> = LazyLock::new(|| {
Client::builder()
.connect_timeout(Duration::from_secs(5))
.no_proxy()
.build()
.unwrap()
});
#[tokio::main]
async fn main() -> Result<(), lambda_runtime::Error> {
tracing_subscriber::fmt()
.with_target(false)
.without_time()
.init();
let service_fn = lambda_runtime::service_fn(handle);
lambda_runtime::run(service_fn).await?;
Ok(())
}
#[inline]
async fn handle
(
event: lambda_runtime::LambdaEvent<Value>
) -> Result<Value, lambda_runtime::Error>
{
info!("lambda_event ======> {:?}", event);
let resp_value = DEFAULT_HTTP_CLIENT
.post(DEFAULT_URL)
.json(&event.payload)
.send()
.await
.map_err(|err| {
error!("send msg error =======> {err}");
anyhow!(err)
})?
.json::<Value>()
.await
.map_err(|err| {
error!("parse msg error =======> {err}");
anyhow!(err)
})?;
info!("resp_value ======> {resp_value}");
Ok(resp_value)
}
打包此lambda函数并发布到北美、欧洲地区
shell
# 打包
cargo lambda build --release --bin alexa-lambda
# 发布lambda,--region 指定发布区域
cargo lambda deploy --binary-name alexa-lambda --region us-east-1
lambda添加alexa触发器,并设置技能id


分别发布lambda函数到北美、欧洲地区,并设置alexa触发器

配置技能
smart home配置,关联技能和lambda函数

账号关联设置


测试
1、alexa开发者账号地区设置

2、安装/设置Alexa app
-
手机系统语言设置为英文,手机连接翻墙的网络
-
在google play应用商城安装Alexa App
-
登录alexa app登录alexa 开发者账号(创建技能的账号),跳过相关无关紧要设置
3、alexa app关联技能
图2滚动到底部,找到Your Skills







4、发现设备
由于Alexa不会自动轮询请求设备列表,被动式的,需要我们通过语音/输入:discover my devices,Alexa才会向lambda发送Discovery请求获取设备列表(需要等一段时间,在设备菜单栏中才会刷新设备列表)


5、控制设备
进入设备详情页,Alexa不会主动调Report State获取设备属性,查阅官方文档,是会主动调的,也不知道什么原因,需要主动询问Alexa这个设备的状态,它才会发起Report state请求,同步设备属性,刷新APP UI设备属性值





6、在alexa开发者控制台测试设备
