формы xamarin: как получить уведомление о файле Bluetooth

#c# #xamarin #xamarin.forms #bluetooth #bluetooth-lowenergy

#c# #xamarin #xamarin.forms #bluetooth #bluetooth-низкое энергопотребление

Вопрос:

Я использую этот плагин https://github.com/xabre/xamarin-bluetooth-le

Теперь я пытаюсь написать характеристику и получить ответ от устройства BLE. После отправки команды на устройство BLE я хотел бы использовать characteristic.ValueUpdated для получения ответа. Но мой код не работает. Итак, я хотел бы знать, как использовать characteristic.ValueUpdated и characteristic.StartUpdatesAsync().

Шаги для воспроизведения

  1. Подключите устройство BLE и получите устройство, сервис и характеристику
  2. Используйте характеристику ожидания.WriteAsync (команда) для отправки команды на устройство BLE
  3. Используйте characteristic.ValueUpdated и ожидайте characteristic.StartUpdatesAsync(), чтобы получить ответ от устройства BLE.

Ожидаемое поведение: должно быть вызвано событие characteristic.ValueUpdated, и я могу получить ответ.

Фактическое поведение: characteristic.ValueUpdated не вызывается.

Конфигурация: ** Версия плагина: 2.0.0-pre1 ** Платформа: iOS 12.1 / Android 7.1 ** Устройство: iPhone XR / Asus Android

 public int SendCommand(byte[] command)
{
    if (device == null || service == null || characteristic == null)
    {
        return 1;
    }

    var result1 = WriteCharacteristic(command);

    receive_data = GetResponse().Resu<

    if (receive_data == null || receive_data[1] != 0x00)
    {
        return 1;
    }

    return 0;
}

private async Task<bool> WriteCharacteristic(byte[] command)
{
    await characteristic.WriteAsync(command);
    return true;
}

private async Task<byte[]> GetResponse()
{
    byte[] bytes = new byte[20];

    characteristic.ValueUpdated  = (o, args) =>
    {
        bytes = args.Characteristic.Value;
    };

    await characteristic.StartUpdatesAsync();

    return bytes;
}
  

Комментарии:

1. Во-первых, это не по теме, а во-вторых, вы даже не добавили к этому никакого кода

2. Здравствуйте, Г. Хаким, мой код был опубликован в ответе.

3. Извините за мою ошибку, я опубликовал свой код.

4. Вызываете ли вы характеристику. WriteAsync(…) из основного потока?

Ответ №1:

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

После получения вашей характеристики из службы вам необходимо подключить метод ValueUpdated:

 characteristic.ValueUpdated  = (o, args) => { bytes = args.Characteristic.Value;};

await characteristic.StartUpdatesAsync();
  

Как только будет возвращен вызов из StartUpdatesAsync, в любое время, когда будет получен ответ от вашей характеристики, он будет вызван.

Теперь вы можете выполнить вызов вашей характеристики:

 await characteristic.WriteAsync(command);
  

Ваш код вызывает метод для получения значений после того, как вы записали свое значение в характеристику, в результате чего ответ уже может быть получен, но ваша характеристика еще не подключена, поэтому вы, вероятно, пропускаете событие обновления значения.