Android:BluetoothSocket连接抛出IOException

时间:2014-03-31 17:15:32

标签: java android sockets bluetooth android-bluetooth

我正在编写一个应用程序,它将接收来自其他设备的串行数据(不是Android,如果重要的话,它将是Bluesmirf Silver模块,但现在我只是尝试使用我的笔记本电脑蓝牙适配器)。这是我正在使用的代码:

public class ListenThread extends Thread {
    private BluetoothSocket socket;
    private InputStream istream;
    private Handler handler;
    private BluetoothAdapter adapter;

    public ListenThread(BluetoothAdapter adapter, Handler handler) {
        Log.v(TAG, "creating ListenThread");
        this.adapter = adapter;
        this.handler = handler;

        if (adapter.isDiscovering()) {
            adapter.cancelDiscovery();
        }
    }

    public void run() {
        if (running == false) {
            // Thread is cancelled
            Log.v(TAG, "run(): running == false");
            return;
        }

        if (adapter == null) {
            // No BT adapter supplied
            Log.v(TAG, "run(): adapter == null");
            return;
        }

        if (btDevice == null) {
            // No btDevice is paired
            Log.v(TAG, "run(): btDevice == null");
            return;
        }

        try {

            socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));     
            adapter.cancelDiscovery();
            socket.connect();
            Log.v(TAG, "run(): socket connected");
        } catch (IOException e) {
            Log.v(TAG, "run(): socket not connected");
            Log.v(TAG, "IOException: " + e.toString());
            e.printStackTrace();
            socket = null;
        } 

        if (socket == null) {
            // Connection to device failed
            Log.v(TAG, "run(): socket is null");
            return;
        }

        InputStream tmpIn = null;
        try {
            tmpIn = socket.getInputStream();
        } catch (IOException e) {
            // getInputStream always returns InputStream
            // but operations will throw IOException until
            // the stream is ready
        }
        istream = tmpIn;

        StringBuffer sb = new StringBuffer();
        byte[] buffer = new byte[1024]; // buffer store for the stream
        int bytes;  // bytes returned from the read();
        String message;
        int idx;
        HashMap<String, String> hm;
        String[] chunks;

        Log.v(TAG, "run(): listening loop starting");
        while (true) {
            try {
                // Read from the InputStream
                bytes = istream.read();
                sb.append(new String(buffer, 0, bytes));
                while ((idx = sb.indexOf("\r\n\r\n")) > -1) {
                    message = sb.substring(0, idx);
                    sb.replace(0, idx + 4, "");
                    hm = new HashMap<String, String>();
                    for (String line : message.split("\n")) {
                        chunks = line.trim().split("=", 2);
                        if (chunks.length != 2) continue;
                        hm.put(chunks[0], chunks[1]);
                    }
                    handler.obtainMessage(0x2a, hm).sendToTarget();
                }
            } catch (IOException e) {
                break;
            }
        }
    }

我总是在socket.connect()行中得到一个IOException。我尝试了几种建立连接的方法,但没有使用它们,但是每种方法都抛出了不同的IO异常:

方法1:

socket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(device.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

方法2:

socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

方法3:

socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

我也尝试过这样:

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
socket = (BluetoothSocket) m.invoke(device, 1);

我总是遇到Service Discovery Failed或Connection Refused。这就是我管理ListenThread的方式:

public void startListening() {
    Log.v(TAG, "starting to listen");
    running = true;     
}

public void stopListening() {
    Log.v(TAG, "stoping listening");
    running = false;
}

我搜索了Google,但我找到的只是连接套接字的不同方法,但正如我所说,它们都没有用。任何的想法?非常感谢!

编辑:

这就是Log.v(TAG,“IOException:”+ e.toString());和e.printStackTrace();打印:

    IOException: java.io.IOException: Service discovery failed
    java.io.IOException: Service discovery failed
    W/System.err(8604):     at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:397)
    W/System.err(8604):     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:207)
    W/System.err(8604):     at com.ginger.kanarci_android.communication.BluetoothService$ListenThread.run(BluetoothService.java:133)

1 个答案:

答案 0 :(得分:1)

所以我终于能够做到这一点。唯一的问题是UUID。在我发布的代码中,我使用了众所周知的SPP UUID,但我的笔记本电脑的蓝牙适配器有一个不同的UUID,这就是为什么两者无法连接的原因。

当我配置Bluesmirf模块(默认情况下具有SSP UUID)并尝试从应用程序连接时,它运行良好。