我是 Android 和 Java 的新手,我还不想放弃。我正在为这个项目使用适用于 BLE 的 Android Studio 示例。 https://github.com/googlesamples/android-BluetoothLeGatt
如果有任何与我的目的相关的示例代码,以及任何建议,请务必指出正确的方向。:)
当 RSSI 值达到某个阈值时,我想让手机响铃、振动并写入自定义特征。它应该保持振铃、振动,除非我们按下 StopRing 或 StopVibrate 按钮。它应该写入特征(如果超出阈值),以便另一个 BLE 设备可以读取特征并通过发出蜂鸣器的声音来响应。
1)我阅读了一些示例代码,并了解了如何在单击按钮时使手机响铃、振动和书写(或停止这样做)。但是,现在我有一个计时器,可以帮助每隔 10 毫秒读取一次 RSSI 值,并且下面的 updateRssi 函数调用基本上会更新手机应用程序上显示的 RSSI 值。我可以在更新 RSSI 中添加振动或响铃函数调用(如果 RSSI < -threshold 条件),但它只会响铃/振动,然后在完成铃声/振动模式之前停止。
我们从 GATT 获取 RSSI 值是否满足条件后,如何继续检查,然后换成另一种无限响铃和振动的方法?我可以在 if (RSSI < -threshold) 条件中创建一个意图吗?然后让应该执行上述操作的方法接收意图?(下面是 DeviceControlActivity 中的消息处理程序片段)
2) 下面,我决定每次从 Gatt 服务器获取 RSSI 值时是否写入自定义特征。每 10 毫秒读取一次 RSSI 值,因此只要 RSSI 值保持在阈值以上,就可能会调用 writecharacteristic 函数。在论坛上搜索,听说Android BLE栈不是很稳定,特别是连续特征写入。在我的情况下可以吗?
非常感谢!
// Service message handler
//This message handler will be called when BluetoothLeService gets results back from the Gatt server.
private Handler mMessageHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Bundle bundle;
switch (msg.what) {
case BluetoothLeService.GATT_SERVICES_DISCOVERED:
// start off the rssi reading timer
DeviceControlActivity.this.startReadRssiTimer();
break;
case BluetoothLeService.GATT_DISCONNECT:
break;
case BluetoothLeService.GATT_REMOTE_RSSI:
bundle = msg.getData();
int rssi = bundle.getInt(BluetoothLeService.PARCEL_RSSI);
DeviceControlActivity.this.updateRssi(rssi);
if (rssi < - 80){
if(mBluetoothLeService!=null){
mBluetoothLeService.writeCustomCharacteristic(0xAA);
}
}
break;
}
}
};
编辑:我决定我可以停止计时器(停止读取新的 RSSI 并调用处理程序),然后继续让手机振动和响铃(直到按下布局上的按钮)。
EDIT2:实际上我需要一个在后台运行的服务......