简体   繁体   English

Android:BluetoothSocket连接抛出IOException

[英]Android: BluetoothSocket connect throws IOException

I'm writing an app that will receive serial data from another device (not Android, it will be Bluesmirf Silver module if it matters, but now I'm only trying on my laptop Bluetooth adapter). 我正在编写一个将从其他设备接收串行数据的应用程序(不是Android,如果需要的话,它将是Bluesmirf Silver模块,但现在我只尝试使用笔记本电脑的蓝牙适配器)。 Here is the code i'm using: 这是我正在使用的代码:

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;
            }
        }
    }

I always get an IOException at the socket.connect() line. 我总是在socket.connect()行上得到IOException。 I tried several methods of making the connection, non of them worked, but each threw a different IO Exception: 我尝试了几种建立连接的方法,但没有一种起作用,但是每种方法都引发了不同的IO异常:

method 1: 方法1:

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

method 2: 方法2:

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

method 3: 方法3:

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

I also tried like this: 我也这样尝试过:

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

I always got either Service Discovery Failed or Connection Refused. 我总是遇到服务发现失败或连接被拒绝的情况。 This is how I'm managing the ListenThread: 这就是我管理ListenThread的方式:

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

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

I searched Google but all I found were the different methods of connecting the socket, but as I said, none of them worked. 我搜索了Google,但发现的只是连接套接字的不同方法,但是正如我所说,它们都不起作用。 Any idea? 任何想法? Thanks very much! 非常感谢!

EDIT: 编辑:

This is what Log.v(TAG, "IOException: " + e.toString()); 这就是Log.v(TAG,“ IOException:” + e.toString()); and e.printStackTrace(); 和e.printStackTrace(); prints: 打印:

    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)

So I've finally been able to sole this. 因此,我终于能够独善其身。 The only problem was the UUID. 唯一的问题是UUID。 In the code I posted, I used the well known SPP UUID, but my laptop's bluetooth adapter had a different UUID, that's why the two couldn't connect I think. 在我发布的代码中,我使用了众所周知的SPP UUID,但是我的笔记本电脑的蓝牙适配器具有不同的UUID,这就是我认为两者无法连接的原因。

When I configured the Bluesmirf module (which has the SSP UUID by default) and tried to connect from the app, it worked perfectly. 当我配置Bluesmirf模块(默认情况下具有SSP UUID)并尝试从该应用程序连接时,它可以正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM