我正在尝试创建一个使用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 回答
iOS设备总是外围或中心,但Android设备很少 . 在这种情况下,您的iOS设备必须是外围设备,Android必须是一个中心 . 我们可以认为外围设备是服务器,中心是客户端 . 这很简单 .
添加摘要以供参考:
会是什么呢? Android或iOS有一些限制,不允许从Android连接到iOS或反之亦然?
当通过调用connectGatt(...)连接到通告为双模(BLE和BR / EDR)设备的GATT服务器时,内部添加的TRANSPORT_AUTO标志使Android默认为BR / EDR模式(link) .
以下解决方法是可行的:
外设方:通过调整适当的标志停止广告BR / EDR功能(link)
中央端:通过使用反射调用connectGatt()的隐藏版本,将传输参数显式设置为TRANSPORT_LE
例:
编辑4/2016
正如Arbel Israeli在评论中指出的那样,Google引入了connectGatt(...)的重载版本,允许在Android M中指定传输 .
我写了一个简单的工作示例,相对简单,并在Github上包含它开源:https://github.com/GitGarage . 到目前为止,它仅使用Android Nexus 9和iPhone 5s进行了测试,但我认为它也适用于Nexus 6和各种iPhone类型 . 到目前为止,它被明确设置为在一个Android和一个iPhone之间进行通信,但我认为它可以进行更多的调整 .
您现在可以通过
TRANSPORT_LE
从API 23传入TRANSPORT_LE
.请参阅下面的Android文档参考:
TRANSPORT_LE
Bluetooth.connectGatt
也许有点延迟,但也许你的痛苦可以稍微缓解;)
我们已经通过跨平台BLE连接(iOS < - > Android)进行了大量实验,并了解到仍存在许多不兼容性和连接问题 . 除了Android的不稳定性之外,您还应该考虑到目前为止,并不是很多Android设备实际上支持BLE外设模式 .
因此,如果您的用例是功能驱动的,并且您只需要基本的数据交换,我建议您查看可以为您实现跨平台通信的框架和库,而无需您从头开始构建它 .
例如:http://p2pkit.io或谷歌附近
免责声明:我为Uepaa工作,为Android和iOS开发p2pkit.io .