notes descargar app ios core-bluetooth peripherals

descargar - ios 12 iphone 6



Ejecuta el dispositivo iOS 6 como un periférico BLE (5)

El ejemplo de transferencia BTLE tiene esta pieza de código (impar), que puede causar algunos problemas:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { // Reject any where the value is above reasonable range if (RSSI.integerValue > -15) { return; } // Reject if the signal strength is too low to be close enough (Close is around -22dB) if (RSSI.integerValue < -35) { return; }

¡Simplemente elimine esas dos declaraciones if, ya que no tiene sentido!

He hecho una versión simplificada disponible here que se puede usar para probar grandes volúmenes de mensajes que se envían de periféricos a centrales.

Tenga en cuenta que la clase CBPeripheralManager se introdujo por primera vez en iOS 6.0.

Como sabemos, iOS 6 admite dispositivos en ejecución (iPhone 4s y superiores, y nuevo iPad) como un periférico BLE. Hay una demostración en WWDC 2012 Session 705 llamada "bluetooth de núcleo avanzado". Pedí el código fuente de Apple. Me enviaron una versión modificada del código fuente (BTLE_Transfer_Draft). Entonces yo:

  • Ejecute la aplicación en iPhone 5 (iOS 6) en "Modo periférico" y comience a "Publicidad"
  • Ejecute la aplicación en el nuevo iPad (iOS 5.1.1) en "Modo Central"

El problema es que el periférico nunca se ha descubierto en absoluto. Así que uso otras aplicaciones de prueba, incluidas algunas descargadas de la App Store. Todos fallaron en descubrir periféricos. Creo que el problema debería estar en BTLE_Transfer_Draft. Porque no estoy seguro de si puedo presentar el código fuente completo. Así que solo muestro la parte de "modo periférico" aquí:

- (void)viewDidLoad { [super viewDidLoad]; // Start up the CBPeripheralManager _peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil]; } - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { // Opt out from any other state if (peripheral.state != CBPeripheralManagerStatePoweredOn) { return; } // We''re in CBPeripheralManagerStatePoweredOn state... NSLog(@"self.peripheralManager powered on."); // ... so build our service. // Start with the CBMutableCharacteristic self.transferCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID] properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable]; // Then the service CBMutableService *transferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID] primary:YES]; // Add the characteristic to the service transferService.characteristics = @[self.transferCharacteristic]; // And add it to the peripheral manager [self.peripheralManager addService:transferService]; } /** Start advertising */ - (IBAction)switchChanged:(id)sender { if (self.advertisingSwitch.on) { // All we advertise is our service''s UUID [self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] }]; } else { [self.peripheralManager stopAdvertising]; } }

El BLE está en estado encendido y se llama a startAdvertising. Pero el BLE central nunca podrá descubrirlo.

Publicación actualizada:

De acuerdo con la sugerencia de mttrb, agregué "CBAdvertisementDataLocalNameKeyKey" cuando comienzo a hacer publicidad. Pero la mayoría de las aplicaciones aún no pueden descubrir mi servicio, incluidas algunas aplicaciones de la tienda de aplicaciones. La única aplicación que puede descubrir mi servicio es una aplicación de la tienda de aplicaciones llamada "BLE scanner".

Mi pregunta es: ¿significa esto que mi aplicación funciona como periférico? ¿Pero por qué mi propio código no puede descubrir el servicio? ¿Cómo se supone que debo depurarlo?

Mi código en Modo Central es así:

- (void)viewDidLoad { [super viewDidLoad]; // Start up the CBCentralManager _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; } - (void)centralManagerDidUpdateState:(CBCentralManager *)central { if (central.state != CBCentralManagerStatePoweredOn) { return; } [self.centralManager scanForPeripheralsWithServices:nil options:nil]; } - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { ...... } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { if (error) { NSLog(@"Error discovering services: %@", [error localizedDescription]); return; } } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { // Deal with errors (if any) if (error) { NSLog(@"Error discovering characteristics: %@", [error localizedDescription]); return; } } - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"Peripheral Disconnected"); self.discoveredPeripheral = nil; }

Los servicios didDiscoverPeripheral y didDiscoverServices nunca se llaman. ¿Qué podría estar mal? ¿Alguna idea? Gracias


Este proyecto de Git hub también arroja algo de luz sobre la API de CBPeripheralManager. Llamado PeripheralModeTest . Esta línea es particularmente útil para configurar los datos de publicidad.

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey : @"Device Name", CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:CBUUIDGenericAccessProfileString]]};

Aunque todavía no puedo ver ninguna documentación oficial en la Biblioteca para desarrolladores de Apple iOS. Más específicamente, nada acerca de establecer el período de repetición de la publicidad.


Intentaría mover el método startAdvertising: call hasta el final de la forma de delegado startAdvertising: peripheralManagerDidUpdateState: delegate y ver si eso ayuda.

También agregaría un CBAdvertisementDataLocalNameKey clave-valor startAdvertising: a su llamada de método startAdvertising: Encontré que las cosas no eran confiables cuando el anuncio no tenía nombre.

Finalmente, invertiría en la aplicación BLExplr disponible en la App Store para ayudar a escanear su periférico. Se elimina la suposición de que su central está funcionando correctamente.


No conozco la versión de BTLE Central Peripheral Transfer que realmente probaste pero la versión actual tiene iOS 6 como requisito.

Por lo tanto, sugeriría probar la vinculación con iOS 5.1 para ver qué problemas de compatibilidad muestra.


También hay una aplicación gratuita de alta calidad llamada LightBlue que puedes usar para probar tu código. Debería poder capturar todos los dispositivos publicitarios en modo periférico e incluso puede convertirse en un periférico publicitario si desea asegurarse de que su dispositivo funciona correctamente.