Xamarin Plugin.BluetoothLE ждут характерного уведомления - PullRequest
0 голосов
/ 31 октября 2018

Я хотел бы написать одну удобную функцию входа в систему, которую я использую для входа на периферийное устройство Bluetooth, отправив ему пароль.

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 голосов
/ 01 ноября 2018

В вашем коде:

Метод connectHook.Subscribe является асинхронным методом. Перед добавлением двух методов await функция login будет напрямую возвращать false, не дожидаясь обратного вызова в connectHook.Subscribe, поэтому возвращаемое значение в login не изменится, если вы успешно вошли или не смогли войти.

После добавления двух await методов, я думаю, обратный вызов в connectHook.Subscribe был запущен после того, как эти два метода закончили работать. Таким образом, возвращаемое значение будет изменено на возвращаемое значение в обратном вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...