gpt4 book ai didi

Android 蓝牙 accept()/connect() 与已经配对的设备

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:44:40 24 4
gpt4 key购买 nike

我在通过蓝牙连接两台 Android 设备时遇到问题,只有当它们之前已经配对时才会出现这种情况。我将一个作为服务器运行,另一个作为客户端运行。

这是服务器端的顺序:

  1. 检查各种蓝牙状态(适配器可用、已启用等)。
  2. 使用我选择的预定义 UUID 调用 listenUsingRfcommWithServiceRecord()。
  3. 请求使设备可被发现
  4. 由于被发现是异步发生的,所以我调用 accept() 并等待传入​​连接。

在客户端:

  1. 检查各种蓝牙状态(适配器可用、已启用等)。
  2. 对于 getBondedDevices() 中的每个设备,我将 getName() 与服务器名称进行比较。如果匹配,则跳至第 6 步。
  3. 开始 BT 发现
  4. 对于每个发现的设备(请注意,此处未显示 2a 中的配对设备),将设备名称与服务器名称进行比较。如果匹配,转到第 6 步。
  5. 取消发现
  6. 在从第 2 步找到的设备上,使用在服务器端使用的相同预定义 UUID 调用 createRfcommSocketToServiceRecord()。
  7. 调用 connect() 并等待它返回已连接的套接字。

当客户端和服务器以前从未配对过时,上面的过程对我来说工作得很好。但是,Android将它们注册到设备列表中后,不可避免地会在connect()/accept()阶段超时。

几天来我一直在寻找解决方案,并尝试了很多方法,包括这个: Connecting to a already paired Bluetooth device

反射法对我也不起作用。 connect() 似乎会立即返回,但是当我尝试 getOutputStream() 时出现异常。在 accept() 方面,它甚至没有记录有人试图连接。我非常需要一些帮助或指导,让设备在之前配对后建立连接。

以下是有关设备的一些信息:

  • 我正在两部 LG G2X 手机上测试服务器和客户端。
  • 它们都在 Android 2.3.3 上运行,对应于 API 级别 10。
  • 同样,在我在设置中手动取消配对设备后,以上内容有效。

提前谢谢你。我大约 2 周大的 Android 和蓝牙,所以如果你发现任何遗漏的步骤或最佳实践,也请指出。

最佳答案

在客户端中,当我尝试连接绑定(bind)设备时,我只是在 BluetoothAdapter.getBondedDevices() 中找到的 BluetoothDevice 上调用它。这不起作用。

为了正确建立蓝牙连接,我必须执行类似于以下伪代码的操作:

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices();
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress());

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID);
socket.connect();

我完全按照蓝牙聊天示例得到了这个答案:Bluetooth Chat Service .为什么它不能在 getBondedDevices() 的设备上运行,这超出了我的理解范围。也许对 Android 有更深入了解的人可以回答这个问题。

关于Android 蓝牙 accept()/connect() 与已经配对的设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com