# 深入了解中枢网关
TIP
本文档是对中枢网关及测试专用固件的深入讲解,请您先了解中枢网关的基础配置与操作后再阅读本篇文档
# 网关授权
开发者在申请网关授权时通常只会提供一个网关 did,每次申请我们都会给出一个授权码,看上去一个授权码关联了一个用户账号和一个网关 did。
实际上在平台这里,授权码实际是和开发者所属的企业开发组关联的。当开发者提交申请时,我们会为开发者所属的企业组生成一个授权码,一个授权码背后关联的是两个白名单:用户白名单和网关白名单。
认证测试平台在检查网关权限时会使用授权码找到对应的用户白名单和网关白名单,平台会先检查当前用户是否属于白名单用户,如果在白名单内又会继续检查用户绑定的中枢网关是否属于白名单,如果两次检查都成功则说明用户可以正常连接网关,此时客户端才会被授权连接网关,否则客户端会弹出相应的错误信息。
下面我们来看几种特殊的场景:
我和同事属于同一企业组,我们都各自申请了授权码,我们可以交换使用网关吗?
首先,如果你们不重新绑定网关只是在工位上互换网关肯定是会出问题的。因为授权时,客户端拿到的是您账户下绑定的中枢网关(此时放在别人工位上),因此客户端依然会连接原来那个网关,并不会连接您手边的网关,测试时肯定会发生各种让人意想不到的问题。
但如果您和同事都重新绑定了对方的网关,那么根据授权规则,此时客户端获取到的授权中枢网关就是新绑定的网关,你们各自都可以正常使用网关(前提是新绑定的网关也分别在你们各自的工位上)。
TIP
切记自己申请的授权网关一定要放在自己工位上,否则可能会出现如连接不上网关、查询不到设备等奇怪的问题。
为什么我重新登录后中枢网关的授权就没有了?
客户端不会删除您配置的授权码,所以需要您检查当前登录的账号是否申请过授权码,在登录时浏览器可能默认帮您选择了其他账号;如果当前账号没有申请过授权码,那么用户白名单里就不存在这个账号,网关授权不通过客户端就会弹窗提示“未授权用户”
我有多个测试用账号该如何申请权限?
首先根据授权规则,您所有的测试账号都必须单独申请授权码,这样我们后台人员才会把所有测试账号加入用户白名单。如果您的测试账号都属于同一企业组,由于同一企业组使用的是相同授权码,因此您在切换账号时不会出现任何权限问题。但如果您测试账号属于多个不同的企业组,切换到其他企业组时需要同时修改使用对应企业组的授权码。
有新产品要提测,我还需要申请授权吗?
网关授权只检查用户和网关 id 是否在白名单内,并不会检查测试产品,因此只要您的账号和网关 id 没变就不需要再申请授权。
# 专用固件
为配合测试平台客户端实现蓝牙产品验收测试,我们开发了小米中枢网关的测试专用固件,开发者在测试蓝牙产品时需要先为中枢网关烧入测试专用固件。关于如何更新测试专用固件请参考中枢网关的基础配置与操作,这里不再赘述。出于安全考虑,测试专用固件去除了大部分市售中枢网关功能,只保留了测试必须的功能,因此刷入了专用固件的网关为测试平台专用。
WARNING
开发者请不要在执行其他手工测试用例时使用,否则将出现无法预料的问题。 我们建议将刷入了专用固件的网关做好标记,以免他人拿走使用阻塞您和他人测试工作。
测试专用固件的目标是帮助平台实现蓝牙产品的测试,因此固件内实现了许多蓝牙产品测试相关的 API,例如扫描蓝牙产品未配网广播包、扫描周围未配网的蓝牙设备等等。平台需要和网关建立一条 RPC 通道才可以和网关通信调用相关的 API。在设计上网关只建立一条 RPC 通道,即使有多个客户端尝试和网关连接,网关在成功与第一个客户端连接后会拒绝其他客户端的连接,其他客户端将收到连接超时的弹窗。
TIP
测试蓝牙产品的关键 API 往往会在专用固件中实现,因此当您收到新的固件推送时请尽快更新固件,以免固件 bug 对您的测试产生不必要的影响
# 连接网关
在中枢网关的基础配置与操作中介绍过平台如何与中枢网关进行连接。在平台完成网关授权检查后会查询网关的基础信息,其中就包含了网关 ip 和连接 Wi-Fi 的 ssid,平台会启动 gatewayd 后台进程并通过 ip 和网关建立 RPC 通信通道。测试时平台会经过建立好的 RPC 通道和网关通信,调用测试专用固件的 API 进行测试。
由于网关重启后需要一段时间初始化,重启后立刻连接网关会造成 RPC 通道建立失败的问题,因此目前只有在执行蓝牙产品测试用例或者用户点击“连接网关”时平台才会启动 gatewayd 服务。gatewayd 服务在启动后会立即尝试与网关建立 RPC 通道,如果此时网关初始化未完成,gatewayd 将无法建立 RPC 通道,客户端会在超时后杀掉 gatewayd 服务。
TIP
重启网关后等蓝灯恢复常亮后需再等 5-10s 才可以让平台连接网关
WARNING
目前网关会偶尔出现 RPC 通道关闭失败的问题,我们目前还在跟进解决中,开发者应当尽量避免频繁连接/断开中枢网关