如何通过BLE(蓝牙低功耗)将Android设备连接到iOS设备
我试图制作一个使用Android的新型蓝牙低功耗API的应用程序。 为此,我开始使用API级别18的BLE示例。
当我读到Android不能作为外围设备时,我把Android手机置于中央模式,扫描周围的BLE设备 。 为此,我使用模拟心脏传感器的北欧平台进行了一些testing。 一切都以完美的方式运作!
在此之后,我尝试挑选一个iPhone(iOS 7 beta 4) ,并将其设置为外设方式,并像之前的testing一样模拟心率传感器 。 Android应用程序能够看到设备并连接到它。 但连接激活后,两台设备将在3-4秒内断开连接。 除此之外,当我在Android端调用discoverServices()时,不会触发callback! 在某些情况下,即使iOS蓝牙芯片处于closures状态,Android设备也会收到“已连接”事件。 这很奇怪。 为了certificate这一点,我把北欧板放在中央模式下 ,我正确地连接到iOS设备,没有任何问题。
会是什么呢? Android或iOS有一些限制,不允许从Android连接到iOS或反之亦然?
谢谢。
编辑:经过一番艰苦的testing,我在AOSP页面上提出了一个问题。 可以在这里检查
添加摘要以供参考:
会是什么呢? Android或iOS有一些限制,不允许从Android连接到iOS或反之亦然?
通过调用connectGatt(…)连接到作为双模式(BLE和BR / EDR)设备公布的GATT服务器时,内部添加的TRANSPORT_AUTO标志使Android默认为BR / EDR模式( 链接 )。
以下解决方法是可能的:
- 外设端:通过调整适当的标志( 链接 )停止广告BR / EDRfunction。
- 中央侧:通过使用reflection调用隐藏的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中指定传输。
我已经写了一个简单的工作示例,相当简单,并将其包含在Github上的开源代码: https : //github.com/GitGarage 。 到目前为止,它只被testing了一个Android Nexus 9和一个iPhone 5s,但我认为它也可以与Nexus 6和各种iPhonetypes一起使用。 到目前为止,它明确地build立了一个Android和一个iPhone之间的通信,但我认为做更多的是可调的。
也许有点延迟,但也许你的痛苦可以稍微缓解;)
我们一直在用跨平台BLE连接(iOS < – > Android)进行大量的实验,并且发现还有很多不兼容和连接问题。 除了Android的不稳定之外,你还应该考虑到现在还没有那么多Android设备支持BLE外设模式。
因此,如果你的用例是function驱动的,而你只需要基本的数据交换,那么我build议你去看看能够实现跨平台通信的框架和库,而不需要从头开始构build它。
例如: http : //p2pkit.io或谷歌附近
免责声明:我为Uepaa工作,为Android和iOS开发p2pkit.io。