-
DuerOS开放平台
-
技能开放平台
-
自定义技能
- 自定义技能简介
- 自定义技能创建
-
有屏技能
-
技能交互模型
-
自定义技能协议
- 处理DuerOS发送的请求
-
技能部署
-
技能开发样例
- 账户关联
-
技能测试
-
技能发布
-
技能付费
-
个性化服务
-
内容播报技能
-
小技能
-
平台能力扩展
-
SDK
-
预览版功能
- 全双工(Preview)
-
APP技能(Preview)
-
-
智能家居开放平台
- 品牌使用规范
-
开发者服务条款
- 小度音箱对蓝牙Mesh设备的认证,使用Static OOB方案,以三元组方案实现。
- 三元组
- 包含内容:三元组包含三个字段,分别是ProductId、Mac、Secret,一机一密。
- 如何申请:设备出厂前需要申请三元组,需要烧录在模组中。后续设备入网和音箱交互时,三元组会作为key用于计算认证信息,认证完成后才可以加入音箱网络,被音箱控制。开发者可以免费申请20个调试三元组,在对接完成后申请较多的三元组时需要和小度商务沟通购买。
- 如何使用:蓝牙Mesh外设的ProductID和MAC地址通过广播Device UUID传输给小度音箱,最后给到小度云端;小度云端会查询到Secret,经过计算得到AuthValue下发给音箱,音箱作为Provisioner和外设根据同样计算方法算出的AuthValue完成双向认证。
- AuthValue计算方法:将ProductID,MAC,Secret三元组通过英文逗号连接,然后取SHA256(ProductID,MAC,Secret) 计算结果的前16字节,这里用于计算SHA256的英文字母全部为小写。计算过程示例如下:
字段名 | 计算的值 |
说明 |
---|---|---|
ProductID | "006adb79" | 十进制值7003001,对应的十六进制值是0x6adb79 |
MAC地址 | "d4607512797d" | "D4:60:75:12:79:7D" |
Secret | "4922eb7a0a45818da4347cd4ed1b4cf9" | 百度提供 |
连接后的串 | "006adb79,d4607512797d,4922eb7a0a45818da4347cd4ed1b4cf9" | 按照逗号,英文字母保持小写 |
SHA256的结果 | "b8a39cc092ef95b4bd8c07dd270af03828ec45337e39a32f45cbe8b76c69ed13" | 对连接的串按照SHA256计算求值 |
AuthValue | "b8a39cc092ef95b4bd8c07dd270af03" | 取SHA256结果的前32位 |
- 整个流程可以概括为:硬件设备烧录第三方厂商提供的三元组,小度音箱扫描到设备UUID, 解析出MAC地址和CID等信息,查询CID对应厂商的接口,获取到MAC地址对应的三元组用于后续的认证,最终完成设备入网。
- 过程:
- 灯泡出厂前烧录厂商三元组<ProductID, MAC, Secret>
- 用户拿到灯泡, 开箱并接通电源, 灯泡默认处于待配网状态
- 用户对音箱说『连接灯泡』, 音箱开始扫描设备, 扫描到灯泡, 获取到灯泡UUID, 从UUID中解析出CID, ProductID, MAC地址等信息
- 如果CID是特定厂商的, 通过mac地址, 调用厂商接口, 获取到三元组信息以及设备类型等信息
- 从接口获取到设备类型, 比如吸顶灯, 询问用户是否给吸顶灯配网, 在用户确认后, 用三元组算出AuthValue下发给音箱端, 完成后续的配网过程
- 接口:
- CID对应的厂商接口地址URL, 要求接口必须是https服务, 厂商在对接前需要和百度约定
- 请求方式: POST
- 表头: Content-Type:application/json
- 参数:
字段名 | 必选 | 类型 | 说明 |
---|---|---|---|
appId | 是 | string | 第三方厂商给百度分配的appId, 默认值是"BAIDU" |
data | 是 | string | 百度请求的json数据转字符串, 使用百度自己的私钥加密并base64_encode处理后, 生成的字符。json数据格式参照下表『接口请求的加密字段列表』。 |
- 返回:
字段名 | 必选 | 类型 | 说明 |
---|---|---|---|
status | 是 | int | 状态码, 成功则返回0 |
msg | 是 | string | 错误信息, 默认为空, 有错误时准确填报相应错误 |
data | 是 | string | 第三方返回的json数据转字符串, 使用第三方自己的私钥加密并base64_encode处理后, 生成的字符串。json数据格式参照下表『接口返回的加密字段列表』。 |
字段名 | 必选 | 类型 | 说明 |
---|---|---|---|
mac | 是 | string | 设备MAC地址 |
字段名 | 必选 | 类型 | 说明 |
---|---|---|---|
productId | 是 | string | 产品ProductID |
secret | 是 | string | 厂商按照某种算法, 类似于MD5或者SHA256算法, 生成32位字符串secret |
deviceType | 是 | string | 设备类型, 比如球泡灯, 彩灯, 吸顶灯, 窗帘, 插座等 |
friendlyName | 是 | string | 设备名,配网成功后显示的名称 |
friendlyDescription | 是 | string | 设备描述,配网成功后设备列表中,显示的设备简介 |
actions | 是 | array | 设备支持的操作, 比如turnOn, turnOff, setBrightnessPercentage, setColorTemperature, setMode等,详细列表参考发现设备文档中的『设备操作类型』 |
modelName | 是 | string | 设备型号名称 |
version | 是 | string | 供应商提供的设备版本 |
- 接口认证方案:
- 采用非对称加密方式, 双方均可认证对方身份
- 百度云平台拥有自己的私钥和公钥, 第三方平台也拥有自己的公钥和私钥
- 生成公钥和私钥的方式:
- $ openssl genrsa -out rsa_private_key.pem 1024
- $ openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
- $ openssl rsa -in rsa_private_key.pem -pubout -out public_key.pem
- 执行完成后, private_key.pem和public_key.pem就是一对有效的私钥和公钥
- 生成公钥和私钥的方式:
- 百度云平台和第三方平台互换自己的公钥并存储在自己的云中
- 过程:
- 百度请求第三方接口地址, 请求数据appId='BAIDU', data是设备MAC地址经过百度自己的私钥RSA加密, 并使用base64_encode后生成的字符串
- 第三方接口收到请求后, 首先用base64_decode处理得到数据data, 通过appId来寻找对应的平台的公钥, RSA解密获得MAC地址, 查询MAC的相关信息, 生成json字符串(确保请求来自百度)
- 第三方将json字符串通过第三方自己的私钥RSA加密, 并使用base64_encode编码生成字符串data; status=0, msg="", 有异常时status和msg可以置为其他值
- 百度收到数据后, 用base64_decode处理得到数据data, 然后用对方的公钥RSA解密获得json数据(确保数据来自第三方云平台)