繁体   English   中英

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

[英]How to connect Android device to an iOS device over BLE (Bluetooth Low Energy)

我正在尝试制作一个使用 Android新蓝牙低功耗 API的应用程序。 为此,我从API 级别 18的 BLE 示例开始。

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

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

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

谢谢。

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

添加摘要以供参考:

可能是什么? 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);    
   ... 
}

编辑 4/2016

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

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

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

我们已经对跨平台 BLE 连接(iOS<-> Android)进行了大量试验,并了解到仍然存在许多不兼容和连接问题。 除了 Android 的不稳定性之外,您还应该考虑到,截至今天,实际上支持 BLE 外设模式的 Android 设备并不多。

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

例如: http : //p2pkit.io或 google 附近

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM