如何使用BLE(低功耗蓝牙)将Android设备连接到iOS设备

84

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

由于我读到Android不能作为外围设备,因此我将Android手机设置为中央模式,扫描周围的BLE设备。为此,我使用了一些模拟心率传感器的北欧平台进行测试。一切都完美运行!

之后,我尝试选择一个iPhone(iOS 7 beta 4)并将其放置在外围设备上,模拟先前的测试中的心率传感器。Android应用程序能够看到该设备并连接到它。但是在连接处于活动状态之后,两个设备会在3-4秒内断开连接。除此之外,在Android端调用discoverServices()时,没有触发任何回调!在某些情况下,即使iOS蓝牙芯片关闭,Android设备也会收到“已连接”事件。这非常奇怪。为了证明这一点,我将北欧板设置为中央模式,并且能够正确地连接到iOS设备而没有任何问题。

这可能是什么原因呢?Android或iOS存在一些限制,不允许从Android连接到iOS,或者反过来吗?

谢谢。

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


2
根据文档,Android确实支持作为服务器运行(例如心率监测器),但生成的值将是虚假的。另一方面,没有示例,文档告诉你做错事情,也没有办法启动广告(尽管文档说可以)。 - Brian Reinhold
我开了一个与你的几乎完全相同的线程:https://dev59.com/bGMl5IYBdhLWcg3wbGh1 我会关注这个线程,看看你找到的任何解决方案。 - afrederick
请阅读我在问题的“编辑”部分发布的Android问题。它清楚地解释了为什么这个过程失败了。我们认为这是Android的问题。主要是通过固定的BLE通道发送了一个不允许的消息。我认为我们唯一能做的就是等待新的Android版本发布 :( - edoardotognoni
@edoardotognoni 是的,我看到了,非常遗憾,希望它是下一个版本的优先事项。 - afrederick
如果我能读取iOS设备的至少一个特征,我会非常高兴!但我在服务发现过程中就卡住了。请阅读所有评论和我的编辑部分。 - edoardotognoni
显示剩余10条评论
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);    
   ... 
}

编辑于2016年4月

正如Arbel Israeli在评论中指出的那样,Google在Android M中引入了一个重载版本的connectGatt(...),允许指定传输方式。


谢谢,这对我有用。请注意,在Android M中,Google添加了一个重载的connectGatt方法,它接受一个transport变量:connectGatt(Context context,boolean autoConnect,BluetoothGattCallback callback,int transport)。 - arbel03
1
哦,谢谢你的提示,所以他们终于把它发布了。 - Dominik Gebhart

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

2
也许略有延迟,但或许可以稍微缓解你的疼痛;)
我们一直在尝试跨平台BLE连接(iOS <-> Android),并且发现仍然存在许多不兼容和连接问题。除了Android不稳定之外,您还应该考虑到,截至今天,其实并不是很多Android设备支持BLE Peripheral模式。
因此,如果您的用例是基于特性驱动的,并且只需要基本的数据交换,我建议您查找可实现跨平台通信的框架和库,而无需从头开始构建。
例如:http://p2pkit.io 或 Google 的 Nearby。
免责声明:我为 Uepaa 工作,正在开发适用于 Android 和 iOS 的 p2pkit.io。

1

0
iOS设备通常可以作为外围设备或中心设备,但Android设备很少能够作为外围设备。在这种情况下,您的iOS设备必须作为外围设备,而Android设备必须作为中心设备。我们可以将外围设备视为服务器,将中心设备视为客户端。这很简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接