Проблемы с подпиской на периферийные характеристики в Xamarin на IOS13 - PullRequest
0 голосов
/ 30 сентября 2019

Я использую BLE для подключения к устройству. Устройство имеет характеристику, которая возвращает значение каждые 20 мс. Я подписываюсь на характеристику с помощью SetNotifyValue (true, характеристика). В iOS 13 количество значений характеристик настолько велико, что блокирует все приложение. Предыдущие версии не имеют этой проблемы. Исходя из результатов моего приложения, объем данных, полученных в iOS 13, намного больше.

Значения признаков добавляются в очередь. Затем я читаю / удаляю их из очереди в другой ветке. В предыдущих версиях iOS очередь никогда не становится длиннее, чем размер одной цифры. На iOS 13 очередь быстро увеличивается в размерах. Он достиг 10 000+, прежде чем я остановил приложение. Значения добавляются так быстро, что поток никогда не получает доступ к очереди и не удаляет их из очереди.

Кто-нибудь сталкивался с такой или подобной проблемой? Я ищу совет / предложения о том, как я могу в дальнейшем исследовать причину такого поведения.

Я хотел бы узнать, делает ли это каждая подписка на характеристику. Я проверил характеристику% заряда батареи, и подписка на нее работает нормально.

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

Я удалил SetNotifyValue (true, характеристика) из проблемной характеристики и добавил таймер, который будет считывать значение характеристики через определенные промежутки времени. Я пробовал разные интервалы (20 мс / 50 мс / 500 мс / 10000 мс). Казалось бы, он все еще каким-то образом подписывается на эту характеристику, поскольку выходные данные приложения такие же, как и раньше.

В настоящее время я не уверен, что мне разрешено показывать какой-либо / какой объем кода.

Вот вывод приложения. Каждая строка печатает последние 22 полученных значения. Я сократил его для облегчения обзора. Я добавил это, чтобы показать скорость полученных данных. Это напечатано из UpdatesCharacterteristicValue.

iOS 13:

[13: 27: 38.0410] 22 значения

[13: 27: 38.0416] 22 значения

[13: 27: 38.0423] 22 значения

[13: 27: 38.0430] 22 значения

[13: 27: 38.0435] 22 значения

[13:27: 38.0440] 22 значения

[13: 27: 38.0445] 22 значения

[13: 27: 38.0450] 22 значения

[13: 27: 38.0455] 22 значения

[13: 27: 38.0461] 22 значения

[13: 27: 38.0465] 22 значения

iOS 10.3.4:

[13:20: 19.0000] 22 значения

[13: 20: 19.0840] 22 значения

[13: 20: 20.0680] 22 значения

[13: 20: 21.0491] 22значения

[13: 20: 22.0361] 22 значения

[13: 20: 23.0171] 22 значения

[13: 20: 24.0009] 22 значения

[13: 20: 24.0852] 22 значения

[13: 20: 25.0690] 22 значения

[13: 20: 26.0500] 22 значения

[13:20: 27.0310] 22 значения

1 Ответ

0 голосов
/ 21 октября 2019

Проблема заключалась в том, что у меня был вызов readValue в updatedCharacteristicValue.

При просмотре в nrfConnect устройство не имеет опции чтения для этой характеристики, только уведомление. Я предполагаю, что предыдущие версии обрабатывали это по-другому. На iOS 13 подписка была сделана снова.

После удаления вызова readValue () приложение теперь работает должным образом.

Я также хотел бы поблагодарить службу поддержки Apple за полезную рекомендацию связаться с нами. аппаратный персонал. Было крайне важно найти ошибку в моем коде.

...