Когда я пытаюсь подключиться к Bluetooth LE с помощью своего приложения iphone. Это приводит к прерыванию соединения CoreBluetooth [ERROR] XPC, сбросу. Почему?
CoreBluetooth [ERROR] Соединение XPC прервано, сброс
Ответ 1
"CoreBluetooth [ERROR] Соединение XPC прервано, сброс" означает, что демон blued
разбился. Вы можете увидеть более подробную информацию, открыв консоль и посмотрев системный журнал и DiagnosticReports.
В моем случае кажется, что исключение внутри blued происходит потому, что SerialNumber где-то ничто. У меня нет обходного пути и сообщил об этом bugreport.apple.com(ошибка 16075785).
Метод, который фактически вызывает исключение, является детерминированным, но зависит от компьютера. На одном компьютере с внутренним чипом Bluetooth 4.0 это вызов -[CBPeripheral discoverCharacteristics:forService:]
. На другом компьютере с USB-адаптером Bluetooth 4.0 это вызов -[CBPeripheral writeValue:forCharacteristic:type:]
или -[CBPeripheral setNotifyValue:forCharacteristic:]
'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: SerialNumber)'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff91b1141c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff9231de75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff91a0c62e -[__NSDictionaryM setObject:forKey:] + 1102
3 blued 0x0000000103d5d422 blued + 336930
4 blued 0x0000000103d4b115 blued + 262421
5 IOBluetooth 0x00007fff97354093 -[IOBluetoothL2CAPChannel processIncomingData:] + 576
6 IOBluetooth 0x00007fff97353e3c -[IOBluetoothL2CAPChannel handleMachMessage:] + 45
7 Foundation 0x00007fff94d98e35 __NSFireMachPort + 94
8 CoreFoundation 0x00007fff91a42d04 __CFMachPortPerform + 388
9 CoreFoundation 0x00007fff91a42b69 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
Редактирование 2014-02-27: мой особый сбой происходит из-за того, что таблица GATT устройства содержит недопустимое значение не UTF8 для характеристики 2A25 "Serial Number String" в Service 180A "Информация об устройстве", а blued-daemon создает NSString * от него и помещая его в NSMutableDictionary. Временным обходным путем является создание setObject: forKey: никогда не терпит неудачу, если вы прыгаете до ближайшей команды ret:
sudo /Applications/Xcode.app/Contents/Developer/usr/bin/lldb <<PID of blued>>
breakpoint set --fullname "-[__NSDictionaryM setObject:forKey:]" --condition "$rdx == 0"
breakpoint command add 1
register write pc `$pc+967`
continue
DONE
Ответ 2
Случается со мной тоже - особенно при запуске сканирования CBCentralManager (CM) когда я останавливаю CM-сканирование и перезапускаю его - он обычно разрешается. Я боюсь, что это ошибка в реализации CoreBluetooth.
Ответ 3
Я получил этот сбой при добавлении сервиса в CBPeripheralManager. Оказывается, у меня была неприятная опечатка (без ошибок компилятора или предупреждений) в моих методах, чтобы получить некоторые характерные идентификаторы. Таким образом, пара характеристик была создана с идентификаторами nil. Все, что я получил, это ошибка в журналах под iOS 7.1.1, и при просмотре журналов устройств обнаружены отчеты о сбоях BTServer. Мое устройство с iOS 8.1.2 не записывало это на консоль, поэтому, возможно, было еще хуже, чтобы найти проблему.
Ответ 4
Случайно нашел еще одну причину этой ошибки: USB-концентратор и плохое подключение или питание сделали мою среду отладки поврежденной. Это означает, что сообщение об ошибке было зарегистрировано нерегулярно.
Больше на моем Odyssee: Обычно я подключаюсь непосредственно к машине сборки, но когда я получил эту проблему, она была подключена через USB-концентратор моего монитора. Я перезапустил Xcode, перезапустил buildmachine без успеха. Забавный факт: та же настройка работала правильно уже 3 дня, но в пятницу (сегодня) подключение к отладчику было неохотным.
Надеюсь, что этот намек не вызывает удивление, -)