1

我正在编写一个连接到蓝牙设备的应用程序,然后发送一条消息并获得答案。这是我用来获得答案的代码:

    StringBuilder res = new StringBuilder();
    while ((char) (b = (byte) in.read()) != '>') {
        if ((char) b != ' ') {
            res.append((char) b);
        }
    }
    rawData = res.toString().trim();

基本上,它将每个字符一个一个地添加到 StringBuilder

当有答案时,没问题,它就起作用了。但问题是当设备没有应答时(因为无论如何连接都丢失了)。

如何限制等待角色的时间?

编辑 :

这是我的蓝牙连接

final BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
    _dev = btAdapter.getRemoteDevice(remoteDevice);
    try {

        Method m;
        m = _dev.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
        _sock = (BluetoothSocket) m.invoke(_dev, 1);
        _sock.connect();
        setState(STATE_CONNECTED);
        sockIn = _sock.getInputStream();
        sockOut = _sock.getOutputStream();

    } catch (Exception e) {
        closeConnection();
    }
4

1 回答 1

1

使用 InputStream“可用”方法

InputStream 的参考页

在读取之前检查流中是否有数据而不阻塞,并检查读取之间经过的时间以确定是否发生超时(System.getCurrentTimeMillis() 应该完成这项工作)。

检查此答案以供参考和完整列表:

在 Android 中的 BluetoothSocket inputstream.read() 中实现超时

编辑:

如果我在您的评论中正确地阅读了两行之间的内容,那么您真的可以使用蓝牙 UDP 套接字...

可悲的是,您似乎无法在 Android 上通过蓝牙使用数据报,因此您必须坚持使用 TCP。

如果您要在设备之间发送的数据是事件驱动的(例如,您希望设备 A 上的用户在设备 B 上的用户触摸屏幕/发射武器等时立即收到通知),您仍然可以调整您的阅读循环做你想做的事。

您所需要的只是一个工作线程,用于放置循环执行 I/O 繁重的工作,以及一个处理程序(在 UI 线程中创建它),一旦您收到任何内容,它将通知您选择的某个侦听器。

请记住,我只是在猜测您的使用场景,所以如果异步事件驱动通信不是问题,请不要误导。

希望这可以帮助

于 2013-05-27T15:52:33.863 回答