最近,当使用最新的三星tab a 8.0(sm-t290)和联想m7(tb-7305f)(都运行android v9)进行测试时,当连接到某些设备时,接收到的蓝牙数据是滞后的。在旧版平板电脑和连接到相同设备的手机上运行相同的应用程序没有问题。在一些较新的手机上运行相同的应用程序也没有问题。
这些有问题的设备上的inputstream似乎缓冲了更多的数据,而不是直接更新socket读取。并且趋向于阻塞几乎全部的缓冲区大小。在没有问题的设备上,新数据几乎是直接返回的。
粗略接收代码如下:
private static final int BUFFER_SIZE = 1024;
private OutputStream tx;
private InputStream rx;
private BluetoothSocket bt_socket;
public void run() {
BluetoothDevice device = getDevice();
if (device != null) {
// create socket
try {
bt_socket = device.createInsecureRfcommSocketToServiceRecord(UUID_BLUETOOTH_SERIAL);
bt_socket.connect();
tx = bt_socket.getOutputStream();
rx = bt_socket.getInputStream();
nativeBluetoothStatusNotify(deviceName, FLAG_CONNECTED);
} catch (IOException e) {
try {
bt_socket.close();
} catch (IOException closeException) {
}
nativeBluetoothStatusNotify(deviceName, FLAG_CONNECTION_FAILED);
}
try {
while (true) {
int bytesRead = rx.read(buffer, 0, BUFFER_SIZE);
String cOut = new String(buffer, 0, bytesRead, "ISO-8859-1");
nativeBluetoothRxNotify(deviceName, buffer, cOut.length());
}
} catch (IOException e) {
nativeBluetoothStatusNotify(deviceName, FLAG_RECEIVE_FAILED);
} catch (NullPointerException e) {
nativeBluetoothStatusNotify(deviceName, FLAG_BLUETOOTH_FAILURE);
}
}
}
减小缓冲区大小确实有很大帮助,但是数据仍然是不稳定和延迟的。
有人能提供一些关于这方面的见解吗?这是安卓本身的东西,我的实现还是底层的蓝牙固件?
1条答案
按热度按时间dphi5xsq1#
我最终解决了这个问题,只需确保偶尔向这些设备发送数据,而不是在启动时进行配置,然后坐着接收。每500毫秒一个心跳字符(linefeed)似乎是解决这个问题的最基本的解决方法。
我怀疑那些有问题的平板电脑必须进入一些蓝牙扫描/广告模式,或者可能在一段时间内不发送时功率低;这会减慢接收速度。