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

edo*_*oni 82 android ios core-bluetooth bluetooth-lowenergy android-4.3-jelly-bean

我正在尝试制作一个使用Android 新蓝牙低功耗API的应用程序.为此,我开始使用API等级为18的BLE样本.

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

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

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

谢谢.

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

Dom*_*art 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);    
   ... 
}
Run Code Online (Sandbox Code Playgroud)

编辑4/2016

正如Arbel Israel在评论中指出的那样,谷歌推出了一个重载版本的connectGatt(...),允许在Android M中指定传输.


omi*_*kes 2

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