Каждый раз при сканировании bluetooth-устройств выдает CBCentralManagerStateUnknown?


Впервые я использую coreBluetooth. Вот моя реализация есть ли в ней что-то неправильное.

@synthesize CM,activePeripheral;

- (id)init
{
    if ((self = [super init]))
    {
        CM = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (int) scanForPeripherals
{

    if (self.CM.state != CBCentralManagerStatePoweredOn)
    {
        NSLog(@"CoreBluetooth is %s",[self centralManagerStateToString:self.CM.state]);
        return -1;
    }

    [self.CM scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"180D"]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];
    return 0;
}

- (const char *) centralManagerStateToString: (int)state
{
    switch(state)
    {
        case CBCentralManagerStateUnknown:
            return "State unknown (CBCentralManagerStateUnknown)";
        case CBCentralManagerStateResetting:
            return "State resetting (CBCentralManagerStateUnknown)";
        case CBCentralManagerStateUnsupported:
            return "State BLE unsupported (CBCentralManagerStateResetting)";
        case CBCentralManagerStateUnauthorized:
            return "State unauthorized (CBCentralManagerStateUnauthorized)";
        case CBCentralManagerStatePoweredOff:
            return "State BLE powered off (CBCentralManagerStatePoweredOff)";
        case CBCentralManagerStatePoweredOn:
            return "State powered up and ready (CBCentralManagerStatePoweredOn)";
        default:
            return "State unknown";
    }

    return "Unknown state";
}


- (void) connectPeripheral:(CBPeripheral *)peripheral {
    printf("Connecting to peripheral with UUID : %srn",[self UUIDToString:peripheral.UUID]);

    self.activePeripheral = peripheral;
    self.activePeripheral.delegate = self;
    [self.CM connectPeripheral:self.activePeripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}


-(const char *) UUIDToString:(CFUUIDRef)UUID
{
    if (!UUID)
        return "NULL";

    CFStringRef s = CFUUIDCreateString(NULL, UUID);
    return CFStringGetCStringPtr(s, 0);
}


#pragma mark -Central manager delegate method

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{

    NSLog(@"hits it");
    if (central.state != CBCentralManagerStatePoweredOn) {
        return;
    }

    isOn=YES;
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"Received periferal :%@",peripheral);
    NSLog(@"Ad data :%@",advertisementData);

    [MBProgressHUD hideHUDForView:self.view animated:YES];
}


- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"Connected peripheral %@",peripheral);
}


- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"Error occured :%@",[error localizedDescription]);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)scanDevices:(id)sender {
     if (isOn) {
       [MBProgressHUD showHUDAddedTo:self.view animated:YES];
       [self scanForPeripherals];
    }
}

Каждый раз, когда он дает log

 CoreBluetooth is State unknown (CBCentralManagerStateUnknown)

Обновление к вопросу

После предложения, данного @Michael Dautermann, я узнаю, что мой метод делегата centralManagerDidUpdateState не поражает.Я не знаю, почему это происходит.Если кто-нибудь найдет причину, пожалуйста, сообщите мне.

Спасибо вам.

3 2

3 ответа:

CoreBluetooth просто находится в процессе запуска.

Вам нужен этот метод делегата, чтобы ударить первым:

- (void) centralManagerDidUpdateState: (CBCentralManager *) central;

И как только это произойдет, затем Вы можете начать сканирование периферийных устройств.

Через несколько дней я проверил инициализацию CentralManager и узнал, что метод init на firstViewController никогда не вызывался.Я проверил, распечатав вход в метод init.

- (id)init
{
    NSLog(@"hello init");
    if ((self = [super init]))
    {
        CM = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
    }
    return self;
}

- (void)viewDidLoad
{   CM = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
    isOn=NO;
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

Итак, я инициализирую центральный менеджер в viewDidLoad, и теперь он инициализируется и centralManagerDidUpdateState, наконец, вызывается.Теперь печать CBCentralManagerStateUnsupported, и это не проблема, потому что iPhone 4 не поддерживает ее.Спасибо Майклу, он мне очень помог.

Куда вы звоните scanDevices? По-моему, ты звонишь слишком рано. Вы должны вызвать его внутри centralManagerDidUpdateState.

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{

    NSLog(@"hits it");
    if (central.state != CBCentralManagerStatePoweredOn) {
        [self scanDevices]:
    }

    isOn=YES;
}