首页 > 解决方案 > 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 并且只要它回来就会返回第一个项目?我对这种反应性的东西很陌生,所以请善待。

标签: xamarinpromisebluetooth-lowenergy

解决方案


在你的代码中:

该方法connectHook.Subscribe是异步方法。在你添加这两个await方法之前,函数login会直接返回false,无需等待回调in connectHook.Subscribe,所以login无论你登录成功还是登录失败都不会改变in的返回值。

添加这两个方法后,我猜这两个方法运行完成后已经触发await了回调。connectHook.Subscribe所以返回值会随着回调中的返回值而改变。


推荐阅读