#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().
Шаги для воспроизведения
- Подключите устройство BLE и получите устройство, сервис и характеристику
- Используйте характеристику ожидания.WriteAsync (команда) для отправки команды на устройство BLE
- Используйте 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);
Ваш код вызывает метод для получения значений после того, как вы записали свое значение в характеристику, в результате чего ответ уже может быть получен, но ваша характеристика еще не подключена, поэтому вы, вероятно, пропускаете событие обновления значения.