GetGattServicesAsync замораживает после перехода на другое устройство с той же службойC#

Место общения программистов C#
Ответить
Anonymous
 GetGattServicesAsync замораживает после перехода на другое устройство с той же службой

Сообщение Anonymous »

У меня есть странная проблема при изменении устройств BLE, которые обеспечивают одинаковую функциональность. Если я не займу это, я могу обнаружить его, соединить, подключить и получить данные еще раз. Услуги и характеристики и т. Д. Тогда, прежде всего, призыв к DeviceInformation.findallasync () (для возврата устройств с моей службой) возвращает результаты, и призыв к Bluetoothledevice.getGattServicesAsync () Vans и Vans and Hang и And Wang и Wangs and Vans and Hang и Vange и Vange и Vans и Vans и Vans и Vans и Vans и Vans и Vans и Vans и Vans и Vans и Vans и Vans и Wangs Никогда не возвращается.). Затем это автоматически перезагружается, и я могу продолжить соединение и подключиться и еще раз начать загружать данные. < /P>
Вот мой код: < /p>

Код: Выделить всё

int retryCount = 5;
DeviceInformation deviceInfo = null;

// Sometimes Windows loses track of the services! We may need to refresh them - can sometimes take a few retries.
while (deviceInfo == null && retryCount-- > 0)
{
// after switching devices this call usually returns an empty set even though I have successfully paired the second device with the same service.
var allDeviceInfos = await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(MyServiceId));

deviceInfo = allDeviceInfos.FirstOrDefault(d => d.Name == device.DeviceInformation.Name);

if (deviceInfo == null)
{
_logger.LogDebug("Device not found! Retrying...");
await RefreshServices();
Thread.Sleep(1000);
}
}
< /code>
....
private async Task RefreshServices()
{
_logger.LogDebug("Refreshing the device's service list.");

var devices = await DeviceInformation.FindAllAsync(BluetoothLEDevice.GetDeviceSelector());

var myDevices = new List();

foreach (var device in devices.Where(d => d.Name.StartsWith("MyDeviceName_")))
{
var bleDevice = await BluetoothLEDevice.FromIdAsync(device.Id);

// after switching devices, the application hangs on the following line and never returns a value.
var services = await bleDevice.GetGattServicesAsync();

_logger.LogDebug($"Service list from {wristOx.Name}: Status: {services.Status}, count: {services.Services?.Count}");
}
}
Вы можете спросить, почему я вызываю метод RefreshServices () . Это потому, что в прошлом я видел, что, когда я не получаю результатов от интенсивного findallasync () , это, похоже, исправляет ситуацию, хотя иногда требуется несколько повторений. (Я думаю, что это освежает какой -то кеш), если есть лучший способ сделать это, то это было бы здорово услышать тоже! > < /p>

Я также попробовал с GetGattServicesAsync (bluetoothmode.uncached) < /code>, но получить тот же результат. < /li>
Я попытался перезагрузить свой компьютер, но, похоже, это не выходит из GetGattServicesAsync () из своего торпора! Это действительно странно - убийство процесса «исправляет» это, но перезапуск компьютера не делает! p>
Как было запрошено, я попытался получить журналы Bluetooth с помощью WPR и ссылки, предоставленной Junjie Zhu - MSFT, и я сейчас трачу свое время, чтобы пройти график «общие события», который единственный с любой информацией в нем. Однако я не совсем уверен в том, как сопоставить подвес с событиями на этом графике, и здесь слишком много информации, чтобы вставить его здесь. < /P>
e.g. Я нашел этот раздел «Bluetooth», но сужение правильных событий для просмотра и интерпретации результатов - это сложная часть. < /P>


Подробнее здесь: https://stackoverflow.com/questions/793 ... -same-serv
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»