设备 GattServer 连接后停止广播
The device GattServer stops advertising after connecting to it
这是 link 的 Android GitHub 上的 GATT 服务器示例:
https://github.com/androidthings/sample-bluetooth-le-gattserver
在树莓派 3 上设置服务器非常简单。
我不明白的是,为什么 GATT 服务器会在您连接到设备然后断开连接(BLE 连接)后停止广播。
...gattserver I/GattServerActivity: BluetoothDevice CONNECTED: 67:2F:1A:B4:1F:86
...gattserver D/BluetoothGattServer: onConnectionUpdated() - Device=67:2F:1A:B4:1F:86 interval=6 latency=0 timeout=2000 status=0
...gattserver D/BluetoothGattServer: onConnectionUpdated() - Device=67:2F:1A:B4:1F:86 interval=39 latency=0 timeout=2000 status=0
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver D/GattServerActivity: Config descriptor read
...gattserver I/GattServerActivity: Read LocalTimeInfo
...gattserver D/BluetoothGattServer: onServerConnectionState() - status=0 serverIf=5 device=67:2F:1A:B4:1F:86
...gattserver I/GattServerActivity: BluetoothDevice DISCONNECTED: 67:2F:1A:B4:1F:86
...gattserver I/GattServerActivity: No subscribers registered
以上是设备的 LogCat 中显示的内容。
第一行显示我的 phone 能够连接到设备。
(使用这个免费且优秀的应用程序:https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp)
连接后我可以读取它的特征(读取 CurrentType、读取 LocalTimeInfo 等)
当断开 phone/app 与设备的连接时,GattServerActivity 指出我正常断开连接并继续 运行...
但是再次尝试从 phone/app 扫描设备时发现 RPi 上的 GATT 服务器已经变成僵尸...
LogCat(不在应用程序中,不在系统中)没有错误...
有人有想法吗?
问题似乎是 GATT 服务器在断开连接时没有重新开始广告?您应该可以添加一个新行 here 以重新开始投放广告。
尝试过重新开始广告,但没有用,所以我停下来重新开始,结果成功了。在树莓派 3B 上测试
@Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "BluetoothDevice CONNECTED: " + device);
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.i(TAG, "BluetoothDevice DISCONNECTED: " + device);
//Remove device from any active subscriptions
mRegisteredDevices.remove(device);
stopAdvertising();
startAdvertising();
}
}
这是 link 的 Android GitHub 上的 GATT 服务器示例:
https://github.com/androidthings/sample-bluetooth-le-gattserver
在树莓派 3 上设置服务器非常简单。
我不明白的是,为什么 GATT 服务器会在您连接到设备然后断开连接(BLE 连接)后停止广播。
...gattserver I/GattServerActivity: BluetoothDevice CONNECTED: 67:2F:1A:B4:1F:86
...gattserver D/BluetoothGattServer: onConnectionUpdated() - Device=67:2F:1A:B4:1F:86 interval=6 latency=0 timeout=2000 status=0
...gattserver D/BluetoothGattServer: onConnectionUpdated() - Device=67:2F:1A:B4:1F:86 interval=39 latency=0 timeout=2000 status=0
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver I/GattServerActivity: Read CurrentTime
...gattserver D/GattServerActivity: Config descriptor read
...gattserver I/GattServerActivity: Read LocalTimeInfo
...gattserver D/BluetoothGattServer: onServerConnectionState() - status=0 serverIf=5 device=67:2F:1A:B4:1F:86
...gattserver I/GattServerActivity: BluetoothDevice DISCONNECTED: 67:2F:1A:B4:1F:86
...gattserver I/GattServerActivity: No subscribers registered
以上是设备的 LogCat 中显示的内容。 第一行显示我的 phone 能够连接到设备。 (使用这个免费且优秀的应用程序:https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp)
连接后我可以读取它的特征(读取 CurrentType、读取 LocalTimeInfo 等)
当断开 phone/app 与设备的连接时,GattServerActivity 指出我正常断开连接并继续 运行...
但是再次尝试从 phone/app 扫描设备时发现 RPi 上的 GATT 服务器已经变成僵尸...
LogCat(不在应用程序中,不在系统中)没有错误...
有人有想法吗?
问题似乎是 GATT 服务器在断开连接时没有重新开始广告?您应该可以添加一个新行 here 以重新开始投放广告。
尝试过重新开始广告,但没有用,所以我停下来重新开始,结果成功了。在树莓派 3B 上测试
@Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "BluetoothDevice CONNECTED: " + device);
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.i(TAG, "BluetoothDevice DISCONNECTED: " + device);
//Remove device from any active subscriptions
mRegisteredDevices.remove(device);
stopAdvertising();
startAdvertising();
}
}