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


82

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

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

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

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

谢谢。

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


2
根据文档,Android DOES支持作为服务器(例如,心率监视器)运行,尽管一个生成的值是伪造的。另一方面,没有示例,文档告诉您做错了事,也没有办法启动广告(尽管文档说可以)。
Brian Reinhold

你是对的。我已经找到了有关BluetoothGattServer的文档错误。您不能使用具有getProfileProxy方法的GattServer实例(如doc所述),但是可以从BluetoothManager.openGattServer()获得该实例。已经有问题报告给Google。无论如何,是的,Android可以充当GattServer,但不能做广告。如果您有兴趣,我已经测试过,并且在连接这两种设备后,遥控器可以看到从Android公开的Gatt服务器。查看第一个答案的评论,以查看有关此问题的我的问题报告。
edoardotognoni

是的,我也偶然发现了这个问题,并为此加了两美分。现在,我有一个无法发布的温度计服务器,因此无法使用它。
布赖恩·莱因霍尔德

我打开了一个几乎与您的线程相同的线程:stackoverflow.com/questions/18410081/…我将在此线程中查找您找到的所有解决方案。
afrederick

阅读我在问题的“编辑”部分发布的Android问题。清楚地说明了此过程失败的原因。我们认为这是Android的错误。主要是通过固定的BLE通道发送不允许的消息。我认为我们唯一能做的就是等待一个新的Android版本:(
edoardotognoni

Answers:


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


谢谢,对我有用,请注意,在android M系统中,谷歌为带有传输变量的connectGatt方法添加了重载:connectGatt(Context context,boolean autoConnect,BluetoothGattCallback callback,int transport)
arbel03 '16

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外围设备模式。

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

例如:http : //p2pkit.io或附近的Google

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



0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.