首页 文章

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

提问于
浏览
81

我正在尝试创建一个使用Android的 new Bluetooth Low Energy API 的应用程序 . 为此,我开始使用 API level 18 的BLE样本 .

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

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

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

谢谢 .

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

5 回答

  • 7

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

  • 0

    添加摘要以供参考:

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

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

    以下解决方法是可行的:

    • 外设方:通过调整适当的标志停止广告BR / EDR功能(link

    • 中央端:通过使用反射调用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 Israeli在评论中指出的那样,Google引入了connectGatt(...)的重载版本,允许在Android M中指定传输 .

  • 2

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

  • 2

    您现在可以通过 TRANSPORT_LE 从API 23传入 TRANSPORT_LE .

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

  • 0

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

    我们已经通过跨平台BLE连接(iOS < - > Android)进行了大量实验,并了解到仍存在许多不兼容性和连接问题 . 除了Android的不稳定性之外,您还应该考虑到目前为止,并不是很多Android设备实际上支持BLE外设模式 .

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

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

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

相关问题