Android:蓝牙 - 无法建立连接,IOException“通过对等方重置连接”

时间:2011-05-07 12:41:57

标签: android exception bluetooth reset

如果有人能帮助我,我将非常感激。我正在尝试连接客户端提供给我的一些自定义蓝牙硬件。我虔诚地遵循API文档并使用以下代码(大多数是从官方文档中复制和缝合)来建立与蓝牙硬件的套接字连接,用户从我的Android应用程序中的列表视图中选择该套件连接。

private class CommunicationThread extends Thread {
    private final BluetoothSocket mmSocket;

    public CommunicationThread(BluetoothDevice device) {
        super();
        // use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            // create rf communication socket using a unique identifier for this app
            tmp = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
        } catch (Exception e) {
            Log.d("An exception occurred during bluetooth rf communication server socket creation","NDB",e);
        }
        mmSocket = tmp;

        // cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();
    }

    public void run() {
        try {
            // connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException e) {
            Log.d("An exception occurred during bluetooth socket connection","NDB",e);
            // unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeExc) {
                Log.d("An exception occurred while attempting to close bluetooth socket","NDB",closeExc);
            }
            return;
        }

        // do work to manage the connection
        manageConnectedSocket();
    }

    private void manageConnectedSocket() {
        InputStream tmpIn = null;

        // get the input steram, use temp object because
        // member stream is final
        try {
            tmpIn = mmSocket.getInputStream();
        } catch (IOException e) {
            Log.d("An exception occurred during bluetooth io stream creation","NDB",e);
        }

        final InputStream mmInStream = tmpIn;

        byte[] buffer = new byte[1024];  // buffer store for the stream
        int bytes; // bytes returned from read()

        // keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // read from the InputStream
                bytes = mmInStream.read(buffer);
                // send the obtained bytes to the message handler
                bluetoothHandler.obtainMessage(/*MESSAGE_READ*/1, bytes, -1, buffer).sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }

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

问题是,尝试使用run() mmSocket.connect()内的硬件连接时,呼叫会阻塞几秒钟,然后抛出描述为java.io.IOException: Connection reset by peer的异常。我已经粘贴了下面的相关LogCat输出,周围的线条供你考虑。

05-07 13:29:08.675: INFO/ActivityThread(1370): Receiving broadcast android.bleutooth.device.action.UUID seq=-1 to android.app.ActivityThread$PackageInfo$ReceiverDispatcher@2fd75738
05-07 13:29:08.675: ERROR/ActivityThread(1370): start dispatch OnReceive message,mRegistered=true mCurOrdered=false intent=Intent { act=android.bleutooth.device.action.UUID (has extras) } receiver = com.android.settings.bluetooth.BluetoothEventRedirector$1@2fd74d98
05-07 13:29:08.675: VERBOSE/BluetoothEventRedirector(1370): Received android.bleutooth.device.action.UUID
05-07 13:29:08.675: ERROR/xubo(1370): mBroadcastReceiver receive msg = android.bleutooth.device.action.UUID
05-07 13:29:08.685: ERROR/ActivityThread(1370): exit dispatch OnReceive message,mRegistered=true mCurOrdered=false
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827): NDB
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827): java.io.IOException: Connection reset by peer
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827):     at android.bluetooth.BluetoothSocket.connectNative(Native Method)
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827):     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:204)
05-07 13:29:15.455: DEBUG/An exception occurred during bluetooth socket connection(9827):     at com.ndb.proj.Communicator$CommunicationThread.run(Communicator.java:157)
05-07 13:29:18.595: DEBUG/bluez/src/device.c(8031): /org/bluez/8031/hci0/dev_00_06_66_05_70_E7: canceling authentication request
05-07 13:29:18.595: ERROR/BluetoothEventLoop.cpp(1204): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/8031/hci0/dev_00_06_66_05_70_E7
05-07 13:29:18.595: DEBUG/BluetoothEventLoop(1204): Device property changed:00:06:66:05:70:E7property:Connected
05-07 13:29:18.605: INFO/ActivityThread(1204): Receiving broadcast android.bluetooth.device.action.ACL_DISCONNECTED seq=-1 to android.app.ActivityThread$PackageInfo$ReceiverDispatcher@2fe7b918
05-07 13:29:18.605: ERROR/ActivityThread(1204): start dispatch OnReceive message,mRegistered=true mCurOrdered=false intent=Intent { act=android.bluetooth.device.action.ACL_DISCONNECTED (has extras) } receiver = android.server.BluetoothA2dpService$1@2fdafb58
05-07 13:29:18.615: ERROR/ActivityThread(1204): exit dispatch OnReceive message,mRegistered=true mCurOrdered=false
05-07 13:29:18.615: INFO/ActivityThread(1370): Receiving broadcast android.bluetooth.device.action.PAIRING_CANCEL seq=-1 to android.app.ActivityThread$PackageInfo$ReceiverDispatcher@2fd75738
05-07 13:29:18.625: ERROR/ActivityThread(1370): start dispatch OnReceive message,mRegistered=true mCurOrdered=false intent=Intent { act=android.bluetooth.device.action.PAIRING_CANCEL } receiver = com.android.settings.bluetooth.BluetoothEventRedirector$1@2fd74d98
05-07 13:29:18.625: VERBOSE/BluetoothEventRedirector(1370): Received android.bluetooth.device.action.PAIRING_CANCEL
05-07 13:29:18.625: ERROR/xubo(1370): mBroadcastReceiver receive msg = android.bluetooth.device.action.PAIRING_CANCEL
05-07 13:29:18.625: ERROR/ActivityThread(1370): exit dispatch OnReceive message,mRegistered=true mCurOrdered=false

客户已通知“配对代码”为1234.但是,我的Android手机与设备配对没有指定。我已经通过输入蓝牙设置进行了验证,实际上该设备被报告为已配对。

有人可以说明出了什么问题吗?

2 个答案:

答案 0 :(得分:2)

Darn,我正准备发一个答案,我发现你已经修好了:)

关键在于这一行:

05-07 13:29:18.595: DEBUG/bluez/src/device.c(8031): /org/bluez/8031/hci0/dev_00_06_66_05_70_E7: canceling authentication request

这表明蓝牙配对需要发生,但没有发生。

答案 1 :(得分:2)

事实证明问题在于没有输入配对代码(呃!)。我以编程方式与设备配对,没有请求任何配对代码输入,因此配对不合适。

修复方法是输入Settings -> Wireless & networks -> Bluetooth settings,长按“配对”设备并选择Unpair,然后单击设备,该设备生成带有文本字段的Bluetooth pairing request窗口,其中我输入了PIN码(配对码)。

完成此操作后,配对成功,上述代码完美无缺。