CBPeripheral / Disconnection / didWrite не вызывается - PullRequest
0 голосов
/ 16 мая 2019

iOS: 12 Устройство: iPhone 6 (но, кажется, не имеет значения)

У меня возникла следующая проблема при взаимодействии с CBPeripheral. Устройство (периферийное устройство) случайно отключается через длительные периоды времени. До отключения приложение успешно выполняет последовательности записи / didWrite / didRead в течение длительных периодов времени (10 минут - 1 час - даже 2 часа) -> затем оно внезапно перестает работать.

Последнее действие на стороне приложения:

[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; 
(LOG: "write (17 bytes. device: connected. QueuedItems: 0)")

дальнейших действий не последовало, вскоре последовал обратный вызов didDisconnect из CBCentralManager. Методы делегирования CBPeripheral не вызываются (didWrite и т. Д.)

Я прочитал много связанных тем, но ничего очевидного не приходит.

CBCentral init:

self.bleQueue = dispatch_queue_create("bleQueue", DISPATCH_QUEUE_SERIAL);
NSMutableDictionary *options = [NSMutableDictionary new];
options[CBCentralManagerOptionShowPowerAlertKey] = @NO;
options[CBCentralManagerOptionRestoreIdentifierKey] = self.restoreIdentifier;
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:self.bleQueue options:options];

CBPeripheral:

сильная ссылка, делегат установлен при подключении, все записи выполняются из другой выделенной очереди (dispatch_queue_create ("faceralQueue ", DISPATCH_QUEUE_SERIAL);). Запись данных только после того, как предыдущая передача была подтверждена с помощью didWrite, в противном случае данные помещаются в очередь и т. Д.

Другие соображения: - изрядное количество обработки, выполняемой приложением (интенсивное использование GCD) - постоянный обмен данными через BLE (1 Гц) - приложение в фоновом режиме


Вопросы:

  • CBCentral имеет свою очередь. Другая очередь используется для отправки данных в CBPeripheral - должно быть в порядке (как последовательный / фоновый)?
  • В чем может быть причина того, что обратный вызов didWrite не сработал (успех или ошибка)?
  • Может ли система временно приостановить BLE по какой-либо причине?
  • Полагаю, это может быть и чрезмерное использование BLE (длительное непрерывное соединение), но тогда это не проблема для устройств Android и т. Д.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...