xamarin - Xamarin Plugin.BluetoothLE 等待特征通知
问题描述
我想编写一个漂亮、整洁的“登录”功能,用于通过向蓝牙外围设备发送密码来登录它。
public async Task<bool> LogIn()
{
bool result = false;
//First log in
var connectHook = Device.ConnectHook(BleService.Control, new Guid[] { BleCharacteristic.PasswordResult });
connectHook.Subscribe(ScanResult =>
{
ScanResult.Characteristic.DisableNotifications();
//Succesful Login
if (ScanResult.Data[0] == 1)
{
result = true;
}
//Failed Login
else
{
result = false;
}
});
await Device.WriteCharacteristic(BleService.Control, BleCharacteristic.Password, PasswordBytes);
await connectHook.FirstAsync();
return result;
}
我基本上是想订阅密码结果特征,然后写入密码,然后等待密码结果再从函数返回。
这是使用承诺的地方吗?我已经阅读过它们,但不了解它们的用途。
谢谢
编辑:
做了一些挖掘,并认为我找到了一个很好的答案。我已经更新了上面的代码以反映它,让我知道你的想法。
编辑2:
因此,上面的代码不起作用,因为没有返回任何内容
await connectHook.FirstAsync();
如果我评论那条线,它就可以工作了....但它似乎在工作,因为我有一个竞争条件,并且通知在其他代码完成之前返回。
该功能是否会神奇地等待该通知?我认为 observable 实现了 IEnumerable 并且只要它回来就会返回第一个项目?我对这种反应性的东西很陌生,所以请善待。
解决方案
在你的代码中:
该方法connectHook.Subscribe
是异步方法。在你添加这两个await
方法之前,函数login
会直接返回false,无需等待回调in connectHook.Subscribe
,所以login
无论你登录成功还是登录失败都不会改变in的返回值。
添加这两个方法后,我猜这两个方法运行完成后已经触发await
了回调。connectHook.Subscribe
所以返回值会随着回调中的返回值而改变。
推荐阅读
- r - 如何将时间序列列表输入到r中的相关函数
- regex - 如何使用正则表达式捕获结果进行后视
- sql-server - 使用 SQL Server 更改跟踪时如何存储 CHANGE_TRACKING_CURRENT_VERSION?
- swift - Swift 动画视图高度
- java - 如何在 JsonReader 的帮助下解析 Android 上的嵌套 JSON?
- java - 逆魔方算法
- security - 内核代码能否以其他内核代码无法撤消的方式使内容变为只读?
- excel - Laravel 导出到 excel - 下载问题
- html - 将多个 HTML 文件导入 Excel 中的一张工作表
- google-cloud-platform - 限制 GCP 数据流?