上次打算整个通用的智能音箱接入平台,结果自定义技能不给做智能家居控制,翻车了。后来改用智能家居技能实现,虽然基础功能是没问题,但想要统一语音控制命令,不论是实现的成本还是使用的学习成本都太大,只得先搁浅了。目前瀚思彼岸论坛中已经有天猫精灵、小度音箱两个实现度比较高的插件了,将上个项目的成果改造下,提供一个免公网IP与智能音箱平台对接的新方法吧。
0.插件说明
技术架构
- 智能音箱技能平台(自建skill)<=__http__=>插件中转服务<=__mqtt__=>本地插件<=__http__=>HA智能音箱服务/HA Oauth服务
效果
- 外网访问
https://ai-home.ljr.im/h2m2h/{app_key}/ABC
,将通过mqtt将请求发给本地插件,由本地插件代理访问https://localhost:8123/ABC
INFO:只支持小量文本格式内容页面,比如json。
处理流程
- 音箱skill平台将指令发送给插件中转服务(http服务)
- 中转服务通过url区分用户,将指令加密后分发给相应的本地插件(用户)
- 本地插件生成本地http请求与HA智能音箱服务/HA Oauth服务进行通信
- 得到的处理结果原路返回给音箱skill平台
多用户安全性保障
- mqtt启用TLS
- acl来隔离不同用户的主题
- 对mqtt消息进行加密
注意事项
- 需要相应的智能音箱插件(使用HA自带oauth认证的)使用,本插件只提供代理通道
- 授权页面仍需要在本地环境进行访问
- 天猫精灵测试偶尔无法授权,感觉天猫精灵服务器间歇抽风
- 多用户使用环境下稳定性待测试
1.环境
- HA 0.86.4 和 HA 0.82.1
- 天猫精灵插件或小度音箱插件
- http2mqtt2hass插件
2.使用说明
2.1本地智能音箱服务
参考相应插件介绍进行搭建
2.2http2mqtt2hass插件
- 获取账号
前往账号获取页面,获取app_key,app_secret - 插件配置
1
2
3
4
5
6
7
8
9
10
11
12#{HA配置目录}/configuration.yaml
http2mqtt2hass:
broker: mqtt.ljr.im # MQTT Broker
port: 28883 # MQTT Port
app_key: xxx # 获取的app_key
app_secret: xxx # 获取的app_secret
certificate: xxx # 插件目录内ca.crt的全路径
tls_insecure: true # 不变
allowed_uri: # 允许本地访问的路径
- /auth/token # HA的Oauth服务地址
- /dueros_gate # 小度音箱插件服务
- /ali_genie_gate # 天猫精灵插件服务音箱插件的服务地址
见插件代码中所继承了HomeAssistantView类的类所定义的url变量。
- 平台配置
1
2
3
4
5
6
7
8
9
10
11#前往音箱技能平台进行设置
#授权地址
https://{本地HA访问地址}/auth/authorize
#Client_Id,回调地址域名那一串即可
小度:https://xiaodu.baidu.com
天猫:https://open.bot.tmall.com
#Token地址
https://ai-home.ljr.im/h2m2h/{app_key}/auth/token
#WebService地址(服务网关)
小度:https://ai-home.ljr.im/h2m2h/{app_key}/dueros_gate
天猫:https://ai-home.ljr.im/h2m2h/{app_key}/ali_genie_gate注意
{本地HA访问地址}、{app_key}替换成相应的字符串。
3.小结
- 尝试将授权页面也通过mqtt代理访问,但mqtt消息传200k长的消息就获取不全导致错误,分次传输处理又太麻烦,不折腾了。
- 智能音箱插件将汉字处理成’\uxxxx’字符串,返回给小度音箱平台无法识别。