如何通过将Android设备连接到iOS设备?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我尝试选择一个iPhone(iOS 7 beta 4)并将其放入外设模式,并像之前的测试一样模拟心率传感器。Android应用程序能够看到设备并连接到它。但连接激活后,2台设备在3-4秒内断开连接。除此之外,当我在Android端调用discoverServices()时,不会触发回调!在某些情况下,即使iOS蓝牙芯片处于关闭状态,Android设备也会收到“已连接”事件。这很奇怪。为了证明这一点,我将北欧板置于中央模式,并且正确无误地连接到iOS设备。

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

提问于
用户回答回答于

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

用户回答回答于

添加摘要以供参考:

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

扫码关注云+社区