82

我正在尝试制作一个使用Android的新蓝牙低功耗 API的应用程序。为此,我从API 级别 18附带的 BLE 示例开始。

当我读到 Android 不能充当外围设备时,我将 Android 手机置于中央模式,扫描它周围的BLE 设备。为此,我使用模拟心脏传感器的 Nordic 平台进行了一些测试。一切都以完美的方式运作!

在此之后,我尝试选择一部iPhone(iOS 7 beta 4)并将其置于 Peripheral 方式中,并模拟心率传感器作为之前的测试。Android 应用程序能够看到设备并连接到它。但是在连接激活后,2 台设备会在 3-4 秒内相互断开连接。除此之外,当我在 Android 端调用 discoverServices() 时,不会触发回调!在某些情况下,即使 iOS 蓝牙芯片关闭,Android 设备也会收到“已连接”事件。这很奇怪。为了证明这一点,我将Nordic Board 置于 Central 模式,并且我能够正确连接到 iOS 设备,没有任何问题。

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

谢谢。

编辑:经过一番艰苦的测试,我在 AOSP 页面上提出了一个问题。可以在这里检查

4

5 回答 5

7

添加摘要以供参考:

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

当通过调用 connectGatt(...) 连接到宣传为双模(BLE 和 BR/EDR)设备的 GATT 服务器时,内部添加的 TRANSPORT_AUTO 标志使 Android 默认为 BR/EDR 模式(链接)。

以下解决方法是可能的:

  1. 外设端:通过调整适当的标志停止广播 BR/EDR 功能(链接
  2. 中央方面:通过使用反射调用 connectGatt() 的隐藏版本,将传输参数显式设置为 TRANSPORT_LE

例子:

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在评论中指出的那样,谷歌引入了一个重载版本的connectGatt(...),它允许在Android M中指定传输。

于 2015-07-12T14:27:28.377 回答
2

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

于 2015-07-01T20:47:20.113 回答
2

也许有点延迟,但也许你的痛苦可以稍微缓解;)

我们一直在尝试使用跨平台 BLE 连接(iOS<-> Android)并了解到仍然存在许多不兼容和连接问题。除了 Android 的不稳定性之外,您还应该考虑到,直到今天,仍然没有多少 Android 设备真正支持 BLE 外设模式。

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

例如: http: //p2pkit.io或 google 附近

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

于 2016-05-03T16:22:56.227 回答
1

您现在可以TRANSPORT_LE通过BluetoothDevice.connectGattAPI 23 传入。

请参阅下面的 Android 文档参考:

于 2018-06-29T18:16:17.513 回答
0

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

于 2018-05-21T14:44:02.863 回答