Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS CoreBluetooth : centralManager:didConnectPeripheral / didFailToConnectPeripheral: not getting called

Tags:

I'm pulling my hair out of this problems. I'm trying to connect to BLE devices, can't see what I've done wrong in my code below.

- (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"); } 

These devices are not my own. I don't know its proximity UUID, but as far as I know, It won't be needed in connecting via CoreBluetooth right?

All of the devices are discovered in didDiscoverPeripheral:, in the selector I tried to connect them. But there's nothing comes after that.

Am I to expect a dialog with Pairing Password Request when I called to didDiscoverPeripheral:? If so I don't see any dialog, why is that?

From apple documents, It clearly stated that after trying to connect to a device you should get a called to either didConnectPeripheral or didFailToConnectPeripher but I got none.

Any thoughts? I've been trying for almost a week now. Appreciate every helps, thanks.

like image 453
Mysteltainn Avatar asked Oct 15 '14 08:10

Mysteltainn


1 Answers

If you don't somehow retain the peripheral object that is delivered to didDiscoverPeripheral then it is released once this delegate method exits and you won't get a connection.

I suggest adding a property to track discovered peripherals

@property (strong,nonatomic) NSMutableArray *peripherals; 

initialise this in viewDidLoad or init

self.peripherals=[NSMutableArray new]; 

And then add the peripheral to it in 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]; } 
like image 92
Paulw11 Avatar answered Sep 20 '22 18:09

Paulw11