我们正在做下面的过程来与BLE设备配对。
连接()发现服务()配对(绑定)。
有时Android操作系统会以一种奇怪的方式将我们的BT设备拆开,即:
当设备成功配对时,ACTION_BOND_STATE如下所示。
[6:19:28 PM]Himen Patel:04-09 18:18:27.325:D/BluetoothGatt(8380):onCharacteristicWrite()-Device=C2:69:E9:57:93:A4 UUID=860b2c07-e3c5-11e2-a28f-0800200c9a66状态=5 04-09 18:18:27.365:E/millisuntFinished(8380):millisuntFinished=15 04-09 18:18:28.105:E/BelwithDeviceActor(8380):键状态更改为:C2:69:E9:57:93:A4新状态:前:10
04-09 18:18:28.105: E/milisUntilFined(8380): milisUntilFined=20 04-09 18:18:29.135: E/milisUntilFined(8380): milisUntilFined=18 04-09 18:18:30.135: E/milisUntilFined(8380): milisUntilFined=17 04-09 18:18:31.145: E/milisUntilFined(8380): milisUntilFinish=16 04-09 18:18:32.145: E/milisUntilFinish(8380): milisUntilFinish=15
04-09 18:18:33.105:D/BluetoothGatt(8380):onCharacteristicWrite()-Device=C2:69:E9:57:93:A4 UUID=032a0000-0000-0000-0000-000000000000状态=137 04-09 18:18:33.115:E/BelwithDeviceActor(8380):键状态更改为:C2:69:E9:57:93:A4新状态:12之前的:11
04-09 18:18:33.115:I/System。out(8380):UnregisteredReceiver true
现在,当操作系统以奇怪的方式删除配对时,操作状态会发生如下变化。键状态更改为:C2:69:E9:57:93:A4新状态:10。
我们还得到了act=android的即时事件。蓝牙。装置行动在我们的应用程序中,ACL_已断开flg=0x4000010。
重要的是,在这一点上,我们只是失去了与设备的配对,受保护的特性不再适用于我们。如果我们使用系统设置应用程序或BluetoothAdapter::disable()和enable()重新启动bt,我们可以看到我们没有与设备配对。
有趣的是,没有bt重启,系统设置应用程序仍然认为并显示我们与设备配对。
测试时,nexus 4运行4.4.2,nexus 5运行4.4.2,甚至三星galaxy s4运行4.3。
我们的期望是:
我们还观察并获取了嗅探数据,发现当操作系统以奇怪的方式删除绑定时,我们的加密设置为0x000000。
我们也遇到了同样的问题,我们发现“connectGatt”有一个新的“transport”参数(定义连接的传输协议),从SDK v 23开始。因此,如果你想配对你的设备,你应该使用“TRANSPORT_-BREDR”,如果你只想连接到外设而不连接,请使用“TRANSPORT_-LE”文档:https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context,布尔值,android.bluetooth.BluetoothGattCallback,int)
我不知道你是否仍然需要帮助,或者你是否最终解决了自己的问题(你知道,因为你在四月份发布了这个问题),但是我想继续发布我想出的变通方法,因为我知道其他人也是有这个问题。
使用Nexus 7,我运行了与您基本相同的测试,并得出了相同的结论:如果Android平板电脑和远程设备已经绑定,调用BluetoothGatt.discover服务()很有可能会断开和解除绑定平板电脑从远程设备。但是,Android操作系统的某些部分似乎完全忘记了解除绑定;尽管您注册收听绑定更改的广播接收器被通知两个设备之间的绑定已被打破,Android操作系统的其余部分认为该绑定仍然完好无损.由于操作系统认为平板电脑和远程设备是绑定的,平板电脑无法写入远程设备上的任何加密描述符,每当试图写入描述符时,都会给出15(GATT_INSUFFICIENT_ENCRYPTION)的写入状态。
解决方案
关键是在Nexus和远程设备有机会以这种奇怪的方式解开之前解开它们。在我开始蓝牙低能量扫描之前,我要做的是检查平板电脑和远程设备是否已连接。如果它们配对,我使用下面的函数移除键,然后开始扫描。以编程方式取消两个设备的配对可以确保Android操作系统意识到它们不再绑定,因此将经历通常的绑定过程。
下面是用于检查远程设备是否与平板电脑配对的代码,如果是,则取消配对:
// Get the paired devices and put them in a Set
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// Loop through the Set of paired devices, checking to see
// if one of the devices is the device you need to unpair
// from. I use the device name, but I'm sure you can find
// another way to determine whether or not its your device
// -- if you need to. :)
for (BluetoothDevice bt : pairedDevices) {
if (bt.getName().contains("String you know has to be in device name")) {
unpairDevice(bt);
}
}
// Function to unpair from passed in device
private void unpairDevice(BluetoothDevice device) {
try {
Method m = device.getClass().getMethod("removeBond", (Class[]) null);
m.invoke(device, (Object[]) null);
} catch (Exception e) { Log.e(TAG, e.getMessage()); }
}
为什么等待错误,然后通过重启蓝牙来解决它是个坏主意...
正如您在问题中已经指出的,在平板电脑和远程设备神秘地解除绑定后重新启动蓝牙,会迫使Android操作系统意识到它不再绑定到远程设备。这是我最初使用的解决方案,但很快就清楚了,这个“解决方案”带来了两个主要问题:
我只能在万不得已的情况下重启蓝牙。例如,如果解除绑定错误仍然奇迹般地发生,那么您唯一的选择就是重新启动蓝牙。
我正在尝试使用Android Studio作为IDE和Java作为编程语言与温度计BLE设备进行交互。使用智能手机上的应用程序,我发现了该设备在运行过程中暴露的服务:有很多通用服务/特性和一个自定义服务。 首先,我试着阅读 健康温度计服务(UUID=00001809-0000-1000-8000-00805F9B34FB) 从服务列表中恢复特征并访问其描述符: 在这种情况下,我可以看到测量的结果在
我有3台Android设备,三星Galaxy S3手机,三星Tab4和Verizon OEM平板电脑。Verizon OEM平板电脑不支持BLE、API 17。我从android开发者网站安装了“BLE设备扫描”,并在Galaxy S3上运行。它只显示Verizon平板电脑是找到的设备。当我在三星Tab4上运行相同的应用程序时,它只显示Galaxy S3作为找到的设备。如果我只看Galaxy S3
我是android的新手。我有Raspberry PI3设备。我可以通过经典蓝牙连接移动设备到Raspberry PI3。现在我对Raspberry感到困惑,如何通过蓝牙低能量连接移动设备到Raspberry。我们可以将BLE设备连接到android设备,获得特性并可以编写特性。现在我想在Raspberry PI3中做同样的事情,比如(心率监视器,小米手环2)
我是Java和Android开发人员的新手,来自更多的C++背景。我用这个问题作为指导创建了一个kiosk/cosu应用程序。我将应用程序设置为设备管理,使用
我正在尝试在Sony SmartWatch 3上实现BluetoothGattServer。 我可以成功地打开Gatt服务器并做广告。 使用BLE扫描仪应用程序,我在发现我的自定义服务及其自定义特征时得到不一致的结果。 在三星Galaxy Note 8-Android 4.4-上,我可以正确检测自定义服务和自定义特性 这是我在Wear设备上运行的代码: 我还尝试使用自定义生成的UUID从https
我拥有一个极地H10胸带,它以蓝牙低能量运行,并提供心率和心率变化。 我想用Android应用程序读取这些值。由于官方BLE教程中的帮助,我能够连接到设备。现在的问题是从设备中读取心率和心率变异性值。每次设备上有新值可用时,我都要读取该值(并且至少每秒都有新值)。 我找到了以下代码: 假设我与设备有连接,我如何使用它来提取心率和r-r间隔(节拍到节拍间隔)?如果有人能举个简短的例子,我会很高兴。此