Android蓝牙广播接收器无法接收

时间:2014-03-13 19:27:13

标签: java android sockets bluetooth

我们有一个硬件会尝试连接到Android手机,因此在Android手机上打开一个服务器套接字并且监听将起作用。

我现在遇到的问题是我们有一个广播接收器正在侦听ACL_CONNECTED和ACL_DISCONNECTED。

广播接收器没有接收到这些事件,服务器套接字也不接受来自硬件的连接,只是保留在accept()方法。

要使其正常工作,我必须先从Android手机连接到硬件,然后从那一点开始,我将获得所有ACL_CONNECTED / ACL_DISCONNECTED事件,而我的服务器套接字正在接受来自硬件。

这是正常行为吗?在收到ACL_CONNECTED / ACL_DISCONNECTED事件之前,Android必须先与硬件建立一次连接吗?一旦我这样做,我将始终收到这些事件,直到我确实想要在设备上重置工厂,然后再次出现同样的问题。

由于

1 个答案:

答案 0 :(得分:1)

如果没有提供任何代码,很难弄清楚到底出了什么问题。但是我想要猜测一下。连接失败的最常见原因是因为未提供适当的UUID

在大多数情况下,普通设备(如打印机,键盘,耳机等)的最通用UUID为00001101-0000-1000-8000-00805F9B34FB。当您要求您的手机连接到此类设备并且您在大多数时间使用此UUID时它将连接。但是,当您告诉硬件设备连接到手机(初始化连接)时,如果手机没有相应的UUID,则无法建立连接。

总结如下: 检查您的UUID定义。

更新

你的android端代码看起来这个吗?

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;

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

    public void run() {
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();

        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }

        // Do work to manage the connection (in a separate thread)
        manageConnectedSocket(mmSocket);
    }

    /** Will cancel an in-progress connection, and close the socket */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}

如果是这种情况,则它是客户端而不是服务器。并且您的硬件正在侦听客户端连接到它而不是相反。