Xamarin Plugin.BluetoothLE等待特征通知

时间:2018-10-31 17:51:36

标签: xamarin promise bluetooth-lowenergy

我想编写一个很好的,整洁的“登录”功能,该功能用于通过向其发送密码来登录蓝牙外围设备。

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();

如果我对该行进行注释,则所有工作正常。...但似乎正常,因为我遇到了争用情况,并且在其他代码完成之前通知已返回。

该函数是否神奇地等待该通知?我认为可观察的实现IEnumerable会返回第一项,只要它回来了?我是这种反应性材料的新手,请保持友好。

1 个答案:

答案 0 :(得分:0)

在您的代码中:

方法connectHook.Subscribe是异步方法。在添加两个await方法之前,函数login将直接返回false,而无需等待connectHook.Subscribe中的回调,因此无论您是否login中的返回值都不会更改登录成功或登录失败。

在添加了两个await方法之后,我猜想connectHook.Subscribe中的回调是在这两个方法运行完毕之后触发的。因此,返回值将与回调中的返回值一起更改。