ios objective-c delegates bluetooth-lowenergy core-bluetooth

iOS CoreBluetooth: centralManager: didConnectPeripheral/didFailToConnectPeripheral: no se llama



objective-c delegates (2)

Si no conserva de alguna manera el objeto peripheral que se entrega a didDiscoverPeripheral , se libera una vez que este método de delegado didDiscoverPeripheral y no obtendrá una conexión.

Sugiero agregar una propiedad para rastrear periféricos descubiertos

@property (strong,nonatomic) NSMutableArray *peripherals;

inicializa esto en viewDidLoad o init

self.peripherals=[NSMutableArray new];

Y luego agregue el periférico en didDiscoverPeripheral

-(void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { NSLog(@"Discovered peripheral %@",peripheral.identifier.UUIDString); [self.peripherals addObject:peripheral]; [central connectPeripheral:peripheral options:nil]; }

Estoy sacando mi cabello de estos problemas. Estoy tratando de conectarme a dispositivos BLE , no puedo ver lo que he hecho mal en mi código a continuación.

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _cm = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } + (NSString*)UUIDString:(CFUUIDRef)uuid { CFStringRef string = CFUUIDCreateString(NULL, uuid); return (__bridge_transfer NSString*)string; } - (void)centralManagerDidUpdateState:(CBCentralManager *)central { if (central.state == CBCentralManagerStatePoweredOn) { [self scanForPeripherals]; } } - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { // NSLog(@"Received peripheral : /n%@", peripheral); // NSLog(@"Adv data : %@", advertisementData); [peripheral setDelegate:self]; [central connectPeripheral:peripheral options:nil]; [peripheral readRSSI]; } - (int)scanForPeripherals { NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; [_cm scanForPeripheralsWithServices:nil options:options]; return 0; } - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { NSLog(@"didConnectPeripheral"); } - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"didDisconnectPeripheral"); } - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"failed to connect"); } - (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error { NSLog(@"didReadRSSI"); }

Estos dispositivos no son míos. No sé su UUID de proximidad, pero por lo que sé, no será necesario para la conexión a través de CoreBluetooth, ¿verdad?

Todos los dispositivos se detectaron en didDiscoverPeripheral: en el selector, intenté conectarlos. Pero no viene nada después de eso.

¿Debo esperar un diálogo con Solicitud de contraseña de emparejamiento cuando llamé a didDiscoverPeripheral: :? Si es así no veo ningún diálogo, ¿por qué?

De los documentos de Apple, se estableció claramente que después de intentar conectarse a un dispositivo debería recibir una llamada a didConnectPeripheral o didFailToConnectPeripher pero no obtuve ninguno.

¿Alguna idea? He estado intentando durante casi una semana. Aprecio cada ayuda, gracias.


var peripherals = [CBPeripheral]() func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { peripherals.append(peripheral) bleManager.connectPeripheral(peripheral, options: nil) }

Esta es la versión Swift.