我正在使用RxAndroidBle
库扫描BLE设备并与之连接。我还需要与此找到的设备配对,而无需显示有关密钥配对的系统对话框。绑定机制为JustWorks
。
我已经按照我在下面发布的要旨(创建@dglozano)创建了BroadcastReceiver
,以实现这一目标。
代码要点: https://gist.github.com/dglozano/9b0ce38a558eeca16137909bd368698c
它实际上工作得很好,但是我想了解为什么当我仅使用rxBleDevice.bluetoothDevice.createBond()
时会显示Dialog
,但是当我用自己的BroadcastReceiver
处理它时,为什么没有。是否以某种方式注销了将处理设备BOND_STATE
的普通BroadcastReceiver?为什么我的BroadcastReceiver
对此有主要控制权?我很感兴趣-当我注册自己的receiver
时会发生什么。
答案 0 :(得分:0)
好的,我知道了。
我对这个BroadcastReceiver
处理这个系统Dialog
的第一印象是错误的。我们仅使用此接收器来仔细检查BOUND_STATE
。与配对对话框无关,这个假设是错误的。
因此,第一个重要的事实是,只有createBond()
方法是必需的。剩下的就是建立它。
最重要的事实是,这是“正当工作”配对方法。 There我们可以阅读有关BLE安全和“ Just works”的信息。您可以在这里阅读:
在这种方法中,TK设置为0。
TK是一个临时密钥。
现在,让我们暂时回到我们的Android createBond()
方法。在文档中,我们可以阅读:
Android系统服务将处理必要的用户交互,以确认并完成绑定过程。
但是,如果它处理用户交互,为什么不显示对话框?当我们将这两件事结合在一起时,我们就会找到答案。当“临时密钥”值设置为0时,对于Android处理程序而言,不需要显示“配对密钥”对话框。
Bluetooth 4.0 / 4.1和Bluetooth 4.2之间有很小的变化,但它不会对此行为产生影响。您可以详细了解here。
TL:DR 使用“ Just works”配对方法意味着将Temporary Key值设置为0,这意味着我们在配对过程中不需要它。 createBound()
方法仅处理必要的用户交互,因此,当我们不需要配对密钥时,我们不需要与用户交互。这就是为什么未显示Dialog
的原因-因为它不是必需的。