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

我正在尝试使用 Android 的 新低耗电蓝牙空气污染指数开发一个应用程序。为此,我从 空气污染指数十八级附带的 BLE 示例开始。

当我读到 Android 不能作为一个外设,我把 Android 手机放在中央模式,扫描周围的 BE 设备。为此,我使用模拟心脏传感器的北欧平台进行了一些测试。一切都很完美!

在这之后,我尝试挑选一个 IPhone (iOS 7 beta 4),并把它放在一个外围的方式,模拟一个 心率传感器作为以前的测试。Android 应用程序可以看到设备并连接到它。但是当连接被激活后,这两个设备会在3-4秒内断开彼此的连接。除此之外,当我在 Android 端调用 Discovery Services ()时,不会触发回调!在某些情况下,Android 设备接收“连接”事件,即使 iOS 蓝牙芯片是关闭的。这太奇怪了。为了证明这一点,我把 北欧委员会在中央模式和我能够正确地连接到 iOS 设备没有问题。

会是什么呢?Android 或 iOS 有一些限制,不允许从 Android 连接到 iOS 或反之亦然?

谢谢。

编辑: 经过一些艰苦的测试,我在 AOSP 页面上提出了一个问题。它可以被检查 给你

21634 次浏览

我已经编写了一个简单的工作示例,相对简单,并将其包含在 Github: https://github.com/GitGarage上的开源代码中。到目前为止,它只在 Android Nexus 9和 iPhone5s 上进行了测试,但我认为它也可以在 Nexus 6和各种类型的 iPhone 上运行。到目前为止,它被明确地设置为在一个 Android 和一个 iPhone 之间进行通信,但我认为它可以进行更多的调整。

增加摘要以供参考:

会是什么呢?Android 或 iOS 有一些限制,不允许从 Android 连接到 iOS 或反之亦然?

当通过调用 ConnectGatt (...)连接到被广告为双模式(BLE 和 BR/EDR)设备的 GATT 服务器时,内部添加的 TRANSPORT _ AUTO 标志使 Android 默认为 BR/EDR 模式(链接)。

可以采取以下变通办法:

  1. 外围方面: 停止广告 BR/EDR 功能的调整 适当的标志(链接)
  2. 中心端: 将传输参数显式设置为 TRANSPORT _ LE 调用 ConnectGatt ()的隐藏版本,方法是使用 反思

例如:

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);
...
}

编辑4/2016

正如 Arbel Israel在评论中指出的,Google 引入了一个重载版本的 连接关税(...),它允许在 Android M中指定传输。

也许会有一点延迟,但也许你的痛苦可以稍微减轻;)

我们已经对跨平台的 ABLE 连接(iOS <-> Android)进行了大量的实验,发现仍然存在许多不兼容性和连接问题。除了 Android 的不稳定性之外,你还应该考虑到,到今天为止,并没有多少 Android 设备真正支持 ABLE 外设模式。

因此,如果您的用例是特性驱动的,并且您只需要基本的数据交换,那么我建议您查看可以为您实现跨平台通信的框架和库,而不需要从头开始构建它。

例如: http://p2pkit.io或谷歌附近

免责声明: 我为 Uepaa 工作,为 Android 和 iOS 开发 p2pkit.io。

IOS 设备总是外围设备或中心设备,但 Android 设备不可能很少。在这种情况下,你的 iOS 设备必须是外围设备,而 Android 设备必须是中心设备。我们可以认为外围设备是服务器,中心设备是客户端。这很简单。

现在可以从 API 23开始通过 BluetoothDevice.connectGatt传入 TRANSPORT_LE

请参阅以下 Android 文档参考资料: