问题描述
最近在使用最新的Samsung Tab A 8.0(SM-T290)和Lenovo M7(TB-7305F)(均运行Android v9)进行测试时,接收到的蓝牙数据在连接到某些设备时滞后。在较旧的平板电脑和连接到相同设备的手机上运行相同的应用程序没有问题。在某些较新的手机上运行相同的应用程序也没有问题。
这些设备上的InputStream似乎有问题,似乎在缓冲更多数据,而不是立即更新读取的套接字。并且倾向于阻塞几乎整个BUFFER_SIZE。在没有问题的设备上,新数据几乎立即返回。
粗略接收代码如下:
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,BUFFER_SIZE);
String cOut = new String(buffer,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);
}
}
}
减少BUFFER_SIZE确实有很大帮助,但是数据仍然断断续续。
任何人都可以对此提供任何见解或任何解决方法吗?这是Android本身,我的实现还是底层的蓝牙固件中的某些东西?
解决方法
最后,我只是通过确保偶尔将数据发送到那些设备来解决此问题,而不是在启动时进行配置,而只是坐在接收端。每500毫秒一次单个心跳字符(换行)似乎是解决该问题的最基本方法。
我怀疑那些有问题的平板电脑必须进入某种蓝牙扫描/广告模式,或者在一段时间内不发送时可能功耗很低;这会减慢接收速度。