Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android BLE:通过BluetoothAdaptergetRemoteDevice()获取BluetoothDevice与扫描 脚本:_Android_Bluetooth_Bluetooth Lowenergy_Unreliable Connection - Fatal编程技术网

Android BLE:通过BluetoothAdaptergetRemoteDevice()获取BluetoothDevice与扫描 脚本:

Android BLE:通过BluetoothAdaptergetRemoteDevice()获取BluetoothDevice与扫描 脚本:,android,bluetooth,bluetooth-lowenergy,unreliable-connection,Android,Bluetooth,Bluetooth Lowenergy,Unreliable Connection,给定一个设备,该设备始终处于打开状态,并每秒进行一次蓝牙低能耗广告。 我必须为Android平板电脑实现一个应用程序,它通过蓝牙低能量连接到这个设备,发送一些命令,然后断开与它的连接。 最低安卓版本:最好的版本,我可以自由决定。 我从API 21 Android 5.0开始,棒棒糖 问题: BLE堆栈的问题也给我带来了麻烦:我想使用BluetoothAdaptergetRemoteDeviceMACAddress:String方法检索到的对象成功地发出直接连接,但它总是失败 我的研究结果: 以下

给定一个设备,该设备始终处于打开状态,并每秒进行一次蓝牙低能耗广告。 我必须为Android平板电脑实现一个应用程序,它通过蓝牙低能量连接到这个设备,发送一些命令,然后断开与它的连接。 最低安卓版本:最好的版本,我可以自由决定。 我从API 21 Android 5.0开始,棒棒糖

问题: BLE堆栈的问题也给我带来了麻烦:我想使用BluetoothAdaptergetRemoteDeviceMACAddress:String方法检索到的对象成功地发出直接连接,但它总是失败

我的研究结果: 以下是我发现的问题/答案/帖子,似乎很有用,也许这些会对某人有所帮助:

问题: 除此之外,我还研究了BluetoothDevice的源代码,发现根本没有使用connectGatt方法的上下文参数: 想知道这是否是BLE堆栈存在缺陷的原因之一

另外,我不明白扫描仪检索到的BluetoothDevice对象与BluetoothAdapterGetRemotedDeviceMacAddress:String方法检索到的对象之间有什么区别。 如果在通过扫描获取的设备上调用connectGatt时发出直接连接autoconnect参数设置为false,则连接通常会成功。但是,当使用getRemoteDevice检索的对象时,直接连接总是失败状态=133,超时

由于我想连接的设备每秒钟都在做广告,我希望直接连接总是/大部分时间都能正常工作,就像扫描一样。 因为后台连接自动连接参数设置为true非常慢,所以我不能依赖它。 此外,由于扫描不可靠且速度慢,我无法强制用户在每次应用程序启动时等待

总结我的问题: connectGatt方法的上下文参数根本没有使用——这可能是BLE堆栈存在缺陷的原因之一吗?我想有人把它放在那里是有充分理由的。 扫描仪检索的BluetoothDevice对象与BluetoothAdapterGetRemotedDeviceMacAddress:String方法检索的对象之间有什么区别? 在早期的Android版本中使用了上下文参数,但显然不再需要了。您仍然应该传递一个有效的上下文以与早期版本兼容,如果他们决定再次使用它,则应传递一个新版本

应该没有什么区别。但是如果您只是通过蓝牙设备地址连接,您会注意到API中的缺陷,即无法将地址类型传递给public或random。因此,如果您尝试连接到一个静态随机地址,则可能会失败,除非您首先扫描了设备。这是因为Android保留了一个地址缓存,以及它在最新广告中的地址类型。因此,请尝试首先扫描并确保看到要连接的设备。然后尝试使用BluetoothAdaptergetRemoteDeviceMACAddress:String进行连接


谢谢你的回答。出于好奇,我想问你,为什么设置地址类型有助于建立联系?你是什么意思?蓝牙控制器需要完整地址49位才能连接。如果只是猜测地址类型,可能最终会尝试连接到错误的设备,这显然是行不通的。