6

我无法通过蓝牙连接两台 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() 阶段超时。

几天来我一直在寻找解决方案,并尝试了很多东西,包括这个: 连接到已经配对的蓝牙设备

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

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

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

提前谢谢你。我在 Android 和蓝牙方面大约 2 周大,所以如果您发现任何缺失的步骤或最佳实践,请同时指出它们。

4

3 回答 3

7

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

为了正确建立蓝牙连接,我不得不做一些类似于下面的伪代码:

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

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

我完全按照蓝牙聊天示例得出了这个答案:蓝牙聊天服务。为什么它在设备上不起作用getBondedDevices()超出了我的范围。也许对Android有更深入了解的人可以回答这个问题。

于 2012-02-15T06:24:14.010 回答
2

看看这个例子:http: //developer.android.com/resources/samples/BluetoothChat/index.html

这可以解释蓝牙设备如何连接和传输信息。

于 2012-03-07T22:46:16.767 回答
-1
private static BluetoothSocket mSocket;
BluetoothDevice selectDevice = null;

void connectDevice(){
    if(mSocket == null) {
        //Log.d(TAG, "Socket is null");
        UUID SPP_UUID = UUID
                .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");
        Set<BluetoothDevice> bondedDevices = BluetoothAdapter
                .getDefaultAdapter().getBondedDevices();
        //Log.d(TAG, "Size: " + bondedDevices.size());
        /**
         * Select your divice form paired devices
         */
        for (BluetoothDevice bluetoothDevice : bondedDevices) {
            selectDevice = bluetoothDevice;
            //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress());
        }

        if(selectDevice.getBondState() == selectDevice.BOND_BONDED) {
            //Log.d(TAG, selectDevice.getName());
            try {
                mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                //Log.d(TAG, "socket not created");
                e1.printStackTrace();
            }
            try {
                mSocket.connect();
            } catch (IOException e) {
                try {
                    mSocket.close();
                    //Log.d(TAG, "Cannot connect");
                } catch (IOException e1) {
                    //Log.d(TAG, "Socket not closed");
                    e1.printStackTrace();
                }
            }
   }
于 2017-09-16T09:24:29.067 回答