使用 Android BLE Gatt 时如何接收重新连接通知
How to receive a notification on reconnect when using Android BLE Gatt
在 Android 上使用 BluetoothGattCallback
时,我可以通过覆盖 onConnectionStateChange
并检查 newState
字段来查看绑定设备何时连接和断开连接。但是,我想知道是否有一种方法可以通知我的应用程序重新连接,这就是我想象的当绑定设备暂时无法访问时的情况。
请注意,我在这里使用绑定设备,以便能够获得稳定的 MAC 地址。
关于答案
虽然我从未设法完全测试答案,但给出的答案对我来说确实有意义。我学到的一些东西:
- 设备必须绑定才能可靠地重新连接,因为它们的 MAC 地址是随机的
- 与Android,必须先实现直接连接,这样Android才能缓存连接信息-后续连接可以通过重新连接
进行
- 绑定 Android 很难正确(我还没有)- 相反,我现在更倾向于利用系统 UI 来配对设备
- 使用像 Nordid 这样的库 Android BLE 库 - Android
有很多怪癖
以下问题的旧补充 - 现在应忽略
日志显示 onConnectionStateChange
被调用:
16:21:33.681 D/BluetoothGatt: connect() - device: 57:D4:E9:34:A4:CB, auto: true
16:21:33.682 D/BluetoothGatt: registerApp()
16:21:33.683 D/BluetoothGatt: registerApp() - UUID=b4751d3b-ccdd-44c2-823e-deed18057af3
16:21:33.689 D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
16:22:44.154 D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=57:D4:E9:34:A4:CB
如果设备后来断开连接,我也会看到状态变化:
16:24:25.800 D/BluetoothGatt: onClientConnectionState() - status=8 clientIf=6 device=57:D4:E9:34:A4:CB
如果设备在自动连接的情况下重新连接,则会重新建立连接,但我没有收到任何通知:
16:26:30.519 D/BluetoothGatt: connect() - device: 57:D4:E9:34:A4:CB, auto: true
16:26:30.520 D/BluetoothGatt: registerApp()
16:26:30.521 D/BluetoothGatt: registerApp() - UUID=a973e2a7-b881-404a-875b-b2d25460e023
16:26:30.528 D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
那么,应用如何检测重新连接?
您应该做的是简单地调用 connectGatt
一次并将 autoConnect
参数设置为 true
。当设备第一次连接时,您将收到 onConnectionStateChange
回调,表明它已连接。当连接由于某种原因断开时,您将收到 onConnectionStateChange
指示它现在已断开连接。但是您不必也不应该再次调用 connectGatt
。一旦外围设备再次通告,您的 Android 设备将自动重新连接,您将获得 onConnectionStateChange
.
这将一直有效,直到蓝牙被关闭(因为此时所有蓝牙对象都被静默销毁),或者您的应用进程被终止。开启蓝牙后,需要再次调用connectGatt
在 Android 上使用 BluetoothGattCallback
时,我可以通过覆盖 onConnectionStateChange
并检查 newState
字段来查看绑定设备何时连接和断开连接。但是,我想知道是否有一种方法可以通知我的应用程序重新连接,这就是我想象的当绑定设备暂时无法访问时的情况。
请注意,我在这里使用绑定设备,以便能够获得稳定的 MAC 地址。
关于答案
虽然我从未设法完全测试答案,但给出的答案对我来说确实有意义。我学到的一些东西:
- 设备必须绑定才能可靠地重新连接,因为它们的 MAC 地址是随机的
- 与Android,必须先实现直接连接,这样Android才能缓存连接信息-后续连接可以通过重新连接 进行
- 绑定 Android 很难正确(我还没有)- 相反,我现在更倾向于利用系统 UI 来配对设备
- 使用像 Nordid 这样的库 Android BLE 库 - Android 有很多怪癖
以下问题的旧补充 - 现在应忽略
日志显示 onConnectionStateChange
被调用:
16:21:33.681 D/BluetoothGatt: connect() - device: 57:D4:E9:34:A4:CB, auto: true
16:21:33.682 D/BluetoothGatt: registerApp()
16:21:33.683 D/BluetoothGatt: registerApp() - UUID=b4751d3b-ccdd-44c2-823e-deed18057af3
16:21:33.689 D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
16:22:44.154 D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=57:D4:E9:34:A4:CB
如果设备后来断开连接,我也会看到状态变化:
16:24:25.800 D/BluetoothGatt: onClientConnectionState() - status=8 clientIf=6 device=57:D4:E9:34:A4:CB
如果设备在自动连接的情况下重新连接,则会重新建立连接,但我没有收到任何通知:
16:26:30.519 D/BluetoothGatt: connect() - device: 57:D4:E9:34:A4:CB, auto: true
16:26:30.520 D/BluetoothGatt: registerApp()
16:26:30.521 D/BluetoothGatt: registerApp() - UUID=a973e2a7-b881-404a-875b-b2d25460e023
16:26:30.528 D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
那么,应用如何检测重新连接?
您应该做的是简单地调用 connectGatt
一次并将 autoConnect
参数设置为 true
。当设备第一次连接时,您将收到 onConnectionStateChange
回调,表明它已连接。当连接由于某种原因断开时,您将收到 onConnectionStateChange
指示它现在已断开连接。但是您不必也不应该再次调用 connectGatt
。一旦外围设备再次通告,您的 Android 设备将自动重新连接,您将获得 onConnectionStateChange
.
这将一直有效,直到蓝牙被关闭(因为此时所有蓝牙对象都被静默销毁),或者您的应用进程被终止。开启蓝牙后,需要再次调用connectGatt