Когда я пытаюсь подключиться к Bluetooth LE с помощью своего приложения для iphone. Это дает CoreBluetooth [ERROR] соединение XPC прервано, сброс. Почему это.?
CoreBluetooth [ОШИБКА] Соединение XPC прервано, сброс
Ответы (4)
«Соединение CoreBluetooth[ERROR] XPC прервано, сброс» означает, что произошел сбой демона blued
Bluetooth. Вы можете увидеть более подробную информацию, открыв консоль и просмотрев системный журнал и отчеты диагностики.
В моем случае кажется, что исключение в 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 «Строка серийного номера» в службе 180A «Информация об устройстве», и демон blued создает из нее NSString* и помещая его в NSmutableDictionary. Временный обходной путь состоит в том, чтобы сделать setObject:forKey: никогда не ошибаться в blued, перейдя к ближайшей команде 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
У меня тоже бывает - особенно при запуске сканирования CBCentralManager (CM), когда я останавливаю сканирование CM и перезапускаю его - обычно это разрешается. Боюсь, это ошибка в реализации CoreBluetooth.
Я получил этот сбой при добавлении службы в CBPeripheralManager. Оказывается, у меня была неприятная опечатка (без ошибок или предупреждений компилятора) в моих методах получения некоторых характерных идентификаторов. Таким образом, пара характеристик была создана с нулевыми идентификаторами. Все, что я получил, это эта ошибка в журналах под iOS 7.1.1, и при просмотре журналов моего устройства я обнаружил отчеты о сбоях BTServer. Мое устройство с iOS 8.1.2 не записывало это в консоль, поэтому найти проблему было бы еще хуже.
Случайно обнаружил другую причину этой ошибки: концентратор USB и плохое соединение или питание привели к повреждению моей среды отладки. Это означает, что он сообщал об ошибке нерегулярно.
Подробнее о моем Odyssee: обычно я подключаюсь напрямую к сборочной машине, но когда у меня возникла эта проблема, она была подключена через USB-концентратор моего монитора. Я перезапустил Xcode, безуспешно перезапустил сборочную машину. Забавный факт: та же установка работала нормально уже 3 дня, но в пятницу (сегодня) подключение к отладчику было неохотным.
Надеюсь, эта подсказка не разовая ;-)