我正在尝试制作一个使用 Android 新的蓝牙低功耗 API 的应用程序。为此,我从 API 级别 18 附带的 BLE 示例开始。
当我了解到 Android 不能充当外围设备时,我将 Android 手机置于中央模式,扫描其周围的 BLE 设备。为此,我使用模拟心脏传感器的 Nordic 平台进行了一些测试。一切都以完美的方式运行!
在此之后,我尝试选择一个iPhone(iOS 7 beta 4),并将其放在外围设备中,并模拟一个心率传感器作为之前的测试。 Android 应用程序能够看到设备并连接到它。但是在连接激活后,2 台设备会在 3-4 秒内相互断开连接。除此之外,当我在 Android 端调用 discoverServices() 时,不会触发回调!在某些情况下,即使 iOS 蓝牙芯片关闭,Android 设备也会收到“已连接”事件。这很奇怪。为了证明这一点,我将 Nordic Board 置于中央模式,我能够正确连接到 iOS 设备,没有任何问题。
可能是什么? Android 或 iOS 存在一些限制,不允许从 Android 连接到 iOS,反之亦然?
谢谢。
编辑:经过一番艰苦的测试,我在 AOSP 页面上提出了一个问题。可以查看here
最佳答案
添加摘要供引用:
会是什么? Android 或 iOS 有一些限制,不允许从 Android 连接到 iOS,反之亦然?
当通过调用 connectGatt(...) 连接到宣传为双模(BLE 和 BR/EDR)设备的 GATT 服务器时,内部添加的 TRANSPORT_AUTO 标志使 Android 默认为 BR/EDR 模式(link )。
以下解决方法是可能的:
- 外设端:通过调整停止宣传 BR/EDR 功能 适当的标志 (link)
- 中央端:将传输参数显式设置为 TRANSPORT_LE 通过调用 connectGatt() 的隐藏版本使用 反射(reflection)
例子:
public void connectToGatt(BluetoothDevice device) {
...
Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);
int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null); // LE = 2, BREDR = 1, AUTO = 0
BluetoothGatt mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);
...
}
2016 年 4 月编辑
正如 Arbel Israeli 在评论中指出的那样,Google 引入了 connectGatt(...) 的重载版本,允许在 Android M 中指定传输。
关于android - 如何通过 BLE(蓝牙低功耗)将 Android 设备连接到 iOS 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052593/