android - 如何通过 BLE(蓝牙低功耗)将 Android 设备连接到 iOS 设备

标签 android ios bluetooth-lowenergy core-bluetooth android-4.3-jelly-bean

我正在尝试制作一个使用 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 )。

以下解决方法是可能的:

  1. 外设端:通过调整停止宣传 BR/EDR 功能 适当的标志 (link)
  2. 中央端:将传输参数显式设置为 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/

相关文章:

android - 从链接或电子邮件启动 Android 应用程序

ios - 强引用 `self` 使对象保持事件状态(暂时) : evil?

c++ - <<(按位左移)对 Swift 中的数组有什么作用?

ios - 如何阻止 fiddler 查看我的 iOS 应用程序和服务器之间的 HTTPS 数据

ios - 第一个字符比其余字符大的 AttributedString -> 行距问题

ios - 从 BLE 设备获取通知

python - 使用 python 查找低功耗蓝牙

java - 从 Android 接收 Base64 编码的字符串到 C# 应用程序

android - Android系统从armeabi,armeabi-v7a,arm64-v8a加载原生库(so文件)有什么规律?

android - 运行从gradle代码复制类型的gradle任务