Android BluetoothSocket无法连接

时间:2019-09-12 14:59:21

标签: java android sockets bluetooth

我正在使用android上的蓝牙做一些事情,我想连接到其中一个发现的设备并为其打开套接字连接。

我已授予所有必需的权限:Bluetooth,Bluetooth_Admin,Access_Fine_Location和Access_Coarse_Location,并在我对蓝牙进行任何操作之前先询问他们。

现在,我发现了一些带有adapter.startDiscovery();activity.registerReceiver(receiver, filter);的设备

在接收器中找到某个名称的设备,我尝试像这样连接到它:

            adapter.cancelDiscovery();
            Log.d(TAG, "Create Bond");
            device.createBond();
            try {
                socket = device.createRfcommSocketToServiceRecord(uuid);
                Log.d(TAG, "Sleep 10");
                sleep(10000);
                Log.d(TAG, "Create Socket");
                //socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
                Log.d(TAG, "Connect socket");
                socket.connect();
                Log.d(TAG, "Connecting Done");
            } catch (Exception e) {
                Log.d(TAG, "Failed to connect to device", e);
                try {
                    socket.close();
                } catch (Exception e2) {
                    Log.d(TAG, "Failed to close socket", e2);
                }
            }

这是一个测试代码,我正在尝试使用该代码创建一个套接字并打开连接。

我在.connect()上收到以下异常:

  

java.io.IOException:读取失败,套接字可能关闭或超时,读取   ret:-1           在android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:684)           在android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:696)           在android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:373)

我在做什么错了。

我连接的蓝牙设备是Android移动设备,但是我计划在设法建立连接时使用其他设备。

Update1: Android版本是7.0

3 个答案:

答案 0 :(得分:1)

使用fetchUuidsWithSdp()getUuids()查找所有已发布的服务及其关联的UUID值。

答案 1 :(得分:0)

您无需致电device.createBond();即可连接到蓝牙设备。

尝试删除此行。另外,请检查您的手机是否尚未与您要连接的设备配对。 您可以在“蓝牙设置”屏幕上进行检查(长按智能手机上的“蓝牙”图标将其打开。

以下是启动蓝牙连接的示例代码:

private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket
        // because mmSocket is final.
        BluetoothSocket tmp = null;
        mmDevice = device;

        try {
            // Get a BluetoothSocket to connect with the given BluetoothDevice.
            // MY_UUID is the app's UUID string, also used in the server code.
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) {
            Log.e(TAG, "Socket's create() method failed", e);
        }
        mmSocket = tmp;
    }

    public void run() {
        // Cancel discovery because it otherwise slows down the connection.
        bluetoothAdapter.cancelDiscovery();

        try {
            // Connect to the remote device through the socket. This call blocks
            // until it succeeds or throws an exception.
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and return.
            try {
                mmSocket.close();
            } catch (IOException closeException) {
                Log.e(TAG, "Could not close the client socket", closeException);
            }
            return;
        }

        // The connection attempt succeeded. Perform work associated with
        // the connection in a separate thread.
        manageMyConnectedSocket(mmSocket);
    }

    // Closes the client socket and causes the thread to finish.
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) {
            Log.e(TAG, "Could not close the client socket", e);
        }
    }
}

此代码来自Android官方文档: https://developer.android.com/guide/topics/connectivity/bluetooth#ConnectAsAClient

答案 2 :(得分:0)

我写了另一个代码,而不是我在服务器端使用的代码。

ruby-2.4+

我在启动线程中使用了此代码,而不是从问题中调用代码。

在一个应用程序上安装带有服务器代码的应用程序,然后在套接字上调用“ connect”就可以了。 我使用了相同的UUID(上一个是随机生成的,新的是字符串中的静态字符串)。