簡體   English   中英

Android:BluetoothSocket連接拋出IOException

[英]Android: BluetoothSocket connect throws IOException

我正在編寫一個將從其他設備接收串行數據的應用程序(不是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);

我總是遇到服務發現失敗或連接被拒絕的情況。 這就是我管理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)

因此,我終於能夠獨善其身。 唯一的問題是UUID。 在我發布的代碼中,我使用了眾所周知的SPP UUID,但是我的筆記本電腦的藍牙適配器具有不同的UUID,這就是我認為兩者無法連接的原因。

當我配置Bluesmirf模塊(默認情況下具有SSP UUID)並嘗試從該應用程序連接時,它可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM