InputStream 在监听 BluetoothSocket 时没有得到任何东西

InputStream not getting anything while listening on a BluetoothSocket

我制作了一个简单的应用程序来监听 Bluetooth 与我的蓝牙模块的串行通信。在这种情况下,蓝牙模块充当服务器,而我的 Android phone 作为客户端。

我能够配对设备并连接到它。但是,我没有得到 InputStream 的任何信息。知道为什么吗?可能与模块具有 PIN 1234 并且我从未对 PIN 进行硬编码(但我能够连接)这一事实有关

监听线程的代码:

public class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
//private final OutputStream mmOutStream;

public ConnectedThread(BluetoothSocket socket) {
    mmSocket = socket;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;

    // Get the input and output streams, using temp objects because
    // member streams are final
    try {
        tmpIn = socket.getInputStream();
      //  tmpOut = socket.getOutputStream();
    } catch (IOException e) {
        System.out.println("IO EXCEPTION: "+ e.toString());
    }

    mmInStream = tmpIn;
   // mmOutStream = tmpOut;
}

public void run() {
    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 UI activity
           processBytes(bytes);
        } catch (IOException e) {
            System.out.println("IO EXCEPTION: "+ e.toString());
            break;
        }
    }
}

编辑:

我刚刚注意到这个错误:android bluetooth connection fail (isSocketAllowedBySecurityPolicy start : device null) 但我已经尝试获取 UUID,而且我有正确的 UUID:

00001101-0000-1000-8000-00805f9b34fb

编辑 2:

这也可能是我的问题,因为我在 SG3 上并且使用 SPP BT 模块。 Android Bluetooth SPP with Galaxy S3

编辑3: 我也试过改变:

 tmp = device.createRfcommSocketToServiceRecord(MY_UUID);

与:

tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);

他们在这里建议:Bluetooth pairing without user confirmation

编辑4: 我尝试使用 Android 官方示例进行 BT 聊天。它有同样的问题。我确定我的 BT 模块可以正常工作,因为我已经在 PC 上尝试过它,并且还在带有另一个 BT 终端应用程序的同一个 SG3 上尝试过。但是,有几个 BT 终端无法使用,我必须找到合适的终端。能有什么区别吗?

你也应该知道,我正在向红外接收器发送红外信号,红外接收器将其传递给 BT 模块,然后再将其传递给移动应用程序。红外接收器的波特率为9600,与红外灯相同。

您在连接线程中的代码看起来没问题,直到您到达这里:

// Send the obtained bytes to the UI activity
processBytes(bytes);

因此,在没有看到您的其余代码的情况下,我假设问题出在这里。 它没有抓住,因为没有抛出异常。但是您没有处理字节如何正确传递回 UI。

我注意到您在此处使用 api 中的代码:
developer.android.com/guide/topics/connectivity/bluetooth

而你缺少的是:

bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                    .sendToTarget();

我在编写第一个蓝牙应用程序时也遇到了这个问题。我试图简化代码示例并试图排除处理程序。

/**
 * The Handler that gets information back from the BTManager
 */
private final Handler mHandler = new Handler() {
    @Override public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
            case Constants.MESSAGE_STATE_CHANGE:
                switch (msg.arg1) {
                    case BluetoothManager.STATE_CONNECTED:
                        //  TODO
                        break;
                    // todo .../
                }
                break;
            case Constants.MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in
                // the buffer
                String readMessage =
                        new String(readBuf, 0, msg.arg1);
                // TODO display your string message
                break;
                // todo .../               
        }
    }
};

如果需要,您可以下载示例 developer.android.com/samples, it is important to manage the threads, I use sychroninized methods。 除了看到更多您的代码之外,这是最有可能的猜测。

如果这不能回答您的问题,请告诉我。