我正在尝试创建一个使用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
答案 0 :(得分:7)
添加摘要以供参考:
它可能是什么? Android或iOS有一些限制,不允许从Android连接到iOS或反之亦然?
当通过调用connectGatt(...)连接到通告为双模(BLE和BR / EDR)设备的GATT服务器时,内部添加的TRANSPORT_AUTO标志使Android默认为BR / EDR模式({ {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);
...
}
正如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文档参考: