小度音箱对接Dueros开放平台有相关资料,包括认证流程和协议介绍。
技能开放平台 (baidu.com)
云云对接
根据资料,直接接入需要特定硬件支持,所以选用云云对接方式。
DuerOS开放平台 | 资源中心 (baidu.com)
云云对接主要框架是:小度音箱——技能云——设备云——设备
技能云服务器是小度音箱发出请求时的服务器,技能云服务器收到请求后将请求封装成上面所说的开放协议发送给设备云服务器,我们需要实现的就是设备云服务器对开放协议的解析和封装。
OAuth2.0
设备云服务器如何实现,按照开放协议即可,主要还是介绍控制请求之前的认证授权设置。
小度音箱认证授权采用OAuth2.0,JAVA和PHP都有相关包接口,博主以C来实现OAuth2.0认证服务器。
OAuth2.0的认证分为四种授权模式,对接小度音箱主要用授权码Code模式,其他三种略过。
OAuth2.0 Code流程如下图:
在这里提醒一下,服务器需要https且合法的ssl证书,自签名无效。
博主服务器使用的花生壳免费域名,阿里云的免费ssl证书,属于白嫖。
OAuth2.0 服务器和技能
按照上面流程,肯定是搭建一个HTTPS服务器,这里博主移植了libevent来封装服务器,很好用,安利一波。
搭建好之后先不用处理url的请求,回到Dueros,创建技能,因为OAuth2.0的授权是在创建的技能中发起的:技能开放平台 (baidu.com)
按照提示填写对应的设置:
授权地址指的是OAuth2.0服务器的地址,client_id和client_Secret是授权时可用作验证的用户标识,其实可以不校验。
Token地址用来获取访问令牌和刷新令牌的服务器,博主把它也集成到OAuth2.0服务中。
WebService是资源/设备云服务器的地址,同样也集成到了OAuth2.0服务器中。
回调地址是授权之后需要重定向的处理地址,技能自生成的,后面会讲到。
授权调试
之前说到,HTTPS服务器没有处理url,技能创建后点击授权肯定是没反应的,这时就可以调试打印授权的请求数据包进行处理的封装了。
授权:
/authorize?client_id=xiaodu&response_type=code&redirect_uri=https%3A%2F%2Fxiaodu.baidu.com%2Fsaiya%2Fauth%2Ffd6bf3b312813ff35869d264d037667b&state=faabeba62d428ed27feb8296d36a8198&dueros_uid=faabeba62d428ed27feb8296d36a8198&scope=all
从请求看出,rediret_uri是回调地址,那么我们需要返回302重定向的包,根据OAuth2.0流程,我们还需要返回code,所以http header添加Location,值为redirect_url?code=xxxxxx
令牌:
/token?client_id=xiaodu&grant_type=authorization_code&client_secret=xiaodu&redirect_uri=https%3A%2F%2Fxiaodu.baidu.com%2Fsaiya%2Fauth%2Ff331729a2d258017b270552bc7872bd3&dueros_uid=faabeba62d428ed27feb8296d36a8198&code=xiaodu
从请求看出,code是授权码,用来获取令牌,那么我们需要返回令牌,http响应200,body为json
{
"access_token", "12345678-1234-5678-1234-1234567890ab",
"token_type", "bearer",
"refresh_token", "87654321-1234-5678-4321-1234567890ab",
"scope", "all",
"expires", :3600
}
封装处理了上面两步,再次返回技能点击授权,成功后出现以下界面:
真机调试
此时按照资料进行真机调试,发现设备,控制设备,查询设备等指令,你的资源服务器也就是设备云服务器都会受到对应的协议数据,一一对应处理即可。
本文省略业务逻辑上的流程,只求快速对接打通节点,可以按照这些步骤先调通链路,如果那个环节没通,评论告诉我。