我在通过蓝牙连接两个 Android 设备时遇到问题,只有当它们之前已配对时才会出现这种情况。我运行一个作为服务器,另一个作为客户端。
以下是服务器端的操作顺序:
- 检查各种蓝牙状态(适配器可用、已启用等)。
- 使用我选择的预定义UUID 调用listenUsingRfcommWithServiceRecord()。
- 请求使设备可发现
- 由于可发现是异步发生的,因此我调用accept()并等待传入连接。
在客户端:
- 检查各种蓝牙状态(适配器可用、已启用等)。
- 对于 getBondedDevices() 中的每个设备,我将 getName() 与服务器名称进行比较。如果存在匹配项,请跳至步骤 6。
- 开始 BT 发现
- 对于每个发现的设备(请注意,此处未显示 2a 中的配对设备),将设备名称与服务器名称进行比较。如果有匹配,则转至步骤 6。
- 取消发现
- 在步骤 2 中找到的设备上,使用与服务器端使用的相同预定义 UUID 调用 createRfcommSocketToServiceRecord()。
- 调用 connect() 并等待它返回已连接的套接字。
当客户端和服务器之前从未配对过时,上述过程对我来说非常有效。然而,当Android将它们注册到设备列表中后,它们将不可避免地在connect()/accept()阶段超时。
我几天来一直在寻找解决方案,并尝试了很多事情,包括这个:连接到已配对的蓝牙设备 https://stackoverflow.com/questions/6760102/connecting-to-a-already-paired-bluetooth-device
反射方法对我来说也不起作用。似乎 connect() 会立即返回,但是当我尝试 getOutputStream() 时,出现异常。在accept() 方面,它甚至没有注册有人尝试连接。我非常需要一些帮助或指导来让设备在之前配对后建立连接。
以下是有关设备的一些信息:
- 我正在两部 LG G2X 手机上测试服务器和客户端。
- 它们都运行在Android 2.3.3上,对应API级别10。
- 同样,在我在设置中手动取消设备配对后,上述操作有效。
提前谢谢你了。我对 Android 和蓝牙的了解大约两周了,所以如果您发现任何遗漏的步骤或最佳实践,也请指出。
在客户端中,当我尝试连接到绑定设备时,我只是在我找到的蓝牙设备上调用它BluetoothAdapter.getBondedDevices()
。这不起作用。
为了正确建立蓝牙连接,我必须执行类似于以下伪代码的操作:
BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices();
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress());
BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID);
socket.connect();
我通过完全遵循蓝牙聊天示例得出了这个答案:蓝牙聊天服务 http://developer.android.com/resources/samples/BluetoothChat/src/com/example/android/BluetoothChat/BluetoothChatService.html。为什么它在设备上不起作用getBondedDevices()
超出了我的范围。也许对 Android 有更深入了解的人可以回答这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)