2013-11-09 5 views
8

У меня есть два приложения: одно периферийное (на iPad 4-го поколения, работающего под управлением iOS 7), и одно центральное (iPhone 5c с iOS7).Ядро Bluetooth - Периферийное устройство не может быть записано центральным

Я хочу иметь записываемую характеристику внутри периферийного устройства, что центральная часть записывает несколько байтов (приблизительно 4 байта, но может варьироваться от исполнения к исполнению).

Я настройка периферийного устройства следующим образом:

-(void)startPeripheral 
{ 
    CBMutableService *service = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:kMyServiceUUID] primary:YES]; 
    CBMutableCharacteristic *ch = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:kMyWriteUUID] properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable]; 
    service.characteristics = @[ch]; 

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@[[CBUUID UUIDWithString:kMyServiceUUID]], CBAdvertisementDataServiceUUIDsKey, @"My Peripheral", CBAdvertisementDataLocalNameKey, nil]; 

    [self.peripheralManager addService:service]; 
    [self.peripheralManager startAdvertising:dict]; 

    NSLog(@"Service = %@",service); 
} 

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

На центральной У меня есть следующий метод:

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error 
{ 
    NSLog(@"Service/Characteristics = %@",service.characteristics); 
    for(CBCharacteristic *ch in service.characteristics) 
    { 
     NSLog(@"Characteristic properties = %x",ch.properties); 
     NSLog(@"Characterisctic = %@",ch.UUID); 
     if([ch.UUID isEqual:[CBUUID UUIDWithString:kMyWriteUUID]]) 
     { 
      // We've found our write characteristic 
      NSLog(@"Writing data to characteristic %@",ch.UUID); 
      NSData *data = [NSData dataWithBytes:(Byte[]){1,2,3,4} length:4]; 
      [peripheral writeValue:data forCharacteristic:ch type:CBCharacteristicWriteWithResponse]; 
     } 
    } 
} 

я получаю обратный вызов didWriteValueForCharacteristic, который указывает на ошибку:

Ошибка домена = CBATTErrorDomain Code = 14 "Вряд ли ошибка."

Это не очень полезно.

Может ли кто-нибудь выявить и решить любые проблемы?

Спасибо, Рич

+0

погуглить эту проблему он появляется, я не единственный человек, который испытал Это. Я также обнаружил, что стек Bluetooth LE очень неустойчив, требуя регулярных перезагрузок устройств для исправления проблем. Кроме того, если я запускаю периферию на iPhone 5c, я не могу подключиться к нему, я могу подключиться только к периферийному устройству, когда он запускается на iPad. Я быстро прихожу к выводу, что периферийная поддержка в основных Bluetooth-библиотеках не работает должным образом. –

+0

Вы когда-нибудь находили дополнительную информацию и/или разрешение?Я также вижу страшную «маловероятную ошибку». (Не похоже, что маловероятно. 8)) – AndrewCr

ответ

0

Это не для меня очевидно, что это ошибка, но:

  1. Вы должны начать рекламу только после получения peripheralManager:didAddService:error: обратного вызова.
  2. Не могли бы вы подключить соответствующие журналы консоли устройства? (Используйте Organizer-> телефон-> Console)
+0

Hi Allprog, да, я быстро попробовал ваше предложение, но я все равно получаю ту же ошибку. К сожалению, мне нужно будет немного изменить вывод журнала из приложения, прежде чем я смогу прикрепить журналы, поскольку это проект, для которого я являюсь под NDA, и мне нужно будет убедиться, что в журнале ничего не секретно. Я попытаюсь опубликовать зарегистрируйся на этой неделе, когда я вернусь в офис. Спасибо за вашу помощь. –

+0

Хорошо, просто дайте мне знать об обновлении. – allprog

0

Старайтесь не добавлять свой сервис, пока вы не получите следующую функцию обратного вызова:

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral 

Вы затем проверить состояние периферической для CBPeripheralManagerStatePoweredOn. Недопустимо добавлять службы, пока периферийное устройство не включено.

0

Я получил ту же ошибку, когда я избегаю типизированный делегата на периферийной стороне, двойная проверку реализованных подписей делегата

F.E. Я написал

-(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequest:(NSArray *)requests 

вместо

-(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests 

(см недостающий «s» в первой версии)

Смежные вопросы