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

时间:2013-08-05 07:21:24

标签: android ios bluetooth-lowenergy core-bluetooth 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页面上提出了一个问题。可以检查here

5 个答案:

答案 0 :(得分:7)

添加摘要以供参考:

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

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

可以采用以下解决方法:

  1. 外围方:通过调整停止宣传BR / EDR功能 适当的标志(link
  2. 中心侧:明确设置传输参数 TRANSPORT_LE通过使用隐藏版本的connectGatt()来调用 反射
  3. 示例:

    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

    正如link在评论中指出的那样,Google引入了Arbel Israeli的重载版本,允许在 Android M 中指定传输。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

我们一直在尝试使用跨平台BLE连接(iOS< - > Android),并了解到仍存在许多不兼容性和连接问题。除了Android的不稳定性之外,您还应该考虑到目前为止,并不是很多Android设备实际上支持BLE外设模式。

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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