[英]Handling Notifications on Android with Multiple BLE Peripheral Connections
因此,我是 Android 开发的新手,我正在尝试将我的设备连接到多个 BLE 设备( T-Wristband )以接收频繁的通知(IMU 传感器数据在50Hz时少于 20 个字节)。
连接到多个设备时,我丢失了一个或多个设备的数据。 我怀疑原因是我的BluetoothGattCallback
方法onCharacteristicChanged
正在为所有设备在同一个线程上工作(注意:我已经通过记录Thread.currentThread.getName()
进行了检查)。
我试过的:
我怀疑每个人添加延迟只是为了让 BLE 系统在您提交另一个之前完成您要求的操作。
问题:我无法在接收通知时添加延迟,因为这会干扰我的采样率,而且我不确定何时可以从另一台设备甚至是同一台设备接收到新通知。
要实现多个 BLE 连接,您必须存储多个
BluetoothGatt
对象并将这些对象用于不同的device
。
在这方面:我尝试为我的设备 TTGODevice 编写自定义TTGODevice
,它在连接时保存相应BluetoothGatt
的实例:
public class TTGODevice {
/* Bunch of psf constants */
private BluetoothDevice device;
private Context context;
private Accelerometer acc;
private BluetoothGatt server;
private int deviceStatus;
private final BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() { ...
};
public TTGODevice(Context context, BluetoothDevice device) {
this.device = device;
this.context = context;
this.acc = new Accelerometer(); // My custom class for accelerometer on the T-Wristband device(s)
}
public void connect(boolean autoConnect) {
server = device.connectGatt(context, false, bluetoothGattCallback);
}
/*Getters for device, server, and deviceStatus*/
}
在BluetoothGattCallback
中,我重写我的onCharacteristicChanged
如下:
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
byte[] bytes = characteristic.getValue();
// updating the Accelerometer
acc.update(bytes);
Log.d(TAG, "onCharacteristicChanged: " + Thread.currentThread().getName());
}
我也尝试在上面的回调中使用我的server
的确切实例,但我运气不好。
byte[] bytes = server.getService(SERVICE_UUID).getCharacteristic(CHARACTERISTIC_UUID).getValue();
长话短说,我一直没有成功。 我将不胜感激任何其他相关线程。
[注意:有人建议我使用Fragments
和/或ViewModels
。 我不确定它们是如何相关的。]
Android 上的 BLE 似乎无法处理50Hz及更高的采样率。 我不确定这是 BLE 相关的问题,还是与onCharacteristicCHanged
方法调用过于频繁有关。 我通过每50 毫秒发送更大的数据包来解决这个问题,这与我原来每 20毫秒发送一次的情况相反。 从蓝牙 4.2开始,可以使用更大的 BLE 数据包,它使用MTU (最大吞吐量单位)进行控制。 这个博客帮助我理解了底层机制。
当通过 BLE 以高采样率接收大数据包时,最好在 Android 上相应的BluetoothGattCallback
中使用MY_DESIRED_MTU > 20Bytes
的gatt.requestMtu(MY_DESIRED_MTU)
。应该注意的是,较大的 MTU 意味着数据需要更长的时间写在服务器设备的 BLE 特征上。
总之,我是用更大的数据包和更大的延迟来弥补采样率的限制。 对于 T 腕带中 IMU 上100Hz的采样率,我使用95 字节的 MTU,由 Android 设备请求,并且 T 腕带上的计时器有50 毫秒的延迟。 这允许我每50 毫秒接收五个连续的数据样本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.