我正在编写一个连接到蓝牙设备的应用程序,然后发送消息并得到答案。这是我用来得到答案的代码:
StringBuilder res = new StringBuilder();
while ((char) (b = (byte) in.read()) != '>') {
if ((char) b != ' ') {
res.append((char) b);
}
}
rawData = res.toString().trim();
基本上,它逐个接受每个字符并将它们添加到StringBuilder
当有答案时,没问题,它有效。但问题是当设备没有应答时(因为无论如何连接都丢失了)。
如何限制我等待角色的时间?
编辑:
这是我的BlueTooth连接
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();
}
答案 0 :(得分:1)
使用InputStream“可用”方法
reference page for InputStream
在没有阻塞的情况下检查流中是否有数据,并检查读取之间的经过时间以确定是否发生超时(System.getCurrentTimeMillis()应该执行该作业)。
请查看此答案以获取参考和完整列表:
Implement a timeout in BluetoothSocket inputstream.read() in Android
修改强>
如果我正在您的评论之间正确阅读,您可以使用蓝牙UDP套接字......
可悲的是似乎你不能在Android上使用带蓝牙的数据报,因此你必须坚持使用TCP。
如果要在设备之间发送的数据是事件驱动的(例如,您希望设备A上的用户在设备B上的用户触摸屏幕/触发他的武器等时立即收到通知),您仍然可以调整你的阅读循环去做你想做的事。
您需要的只是一个工作线程,在这里放置执行I / O繁重的循环,以及一个Handler(在UI线程中创建它),一旦收到任何内容,它将立即通知您选择的一个Listener。 / p>
请记住,我只是猜测你的使用场景,所以如果异步事件驱动的通信不是问题,不要误导。
希望这有帮助