简体   繁体   English

iOS核心蓝牙不要求配对

[英]iOS Core Bluetooth Not asking for Pair

In My recent project, I need to communicate a Hardware (Bluetooth Low energy).I have implement all the delegate methods code. 在我最近的项目中,我需要通信硬件(蓝牙低功耗)。我已经实现了所有委托方法代码。 I am able to Connect hardware and device, But I am not getting pairing alert (Attached screen shot). 我能够连接硬件和设备,但我没有得到配对警报(附加屏幕截图)。 Why not it is asking for pairing? 为什么不要求配对? Thank you. 谢谢。

  #import "BTWCentralConnectionManager.h"

    @implementation BTWCentralConnectionManager

    @synthesize cbcManager;

    @synthesize discoveredPeripheral;

    @synthesize findMeServiceCharacteristic;

    @synthesize findMeService;

    @synthesize delegate=_delegate;

    static NSString *kFindMeServiceUUID=@"1802";

    static NSString *kFindMeCharacteristicUUID=@"2A06";

    static BTWCentralConnectionManager* connectionManager = nil;

    +(BTWCentralConnectionManager *)sharedConnectionManager{

    @synchronized(self)

    {

        if (!connectionManager){

            connectionManager=[[self alloc] init];


        }

        return connectionManager;

    }

    return nil;

}


    -(void)findMe {

    Byte code=0x02;

    if(self.discoveredPeripheral){

        [self.discoveredPeripheral writeValue:[NSData dataWithBytes:&code length:1] forCharacteristic:self.findMeServiceCharacteristic type:CBCharacteristicWriteWithoutResponse];


    }else{

        UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:@"Invalid Charactersitcs" delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

        [alertView show];

        alertView=nil;

    }
}

-(void)searchForDevices{

    self.cbcManager=[[CBCentralManager alloc] initWithDelegate:self queue:nil];

}

    -(void)connect {

    NSDictionary* connectOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey];


    [self.cbcManager connectPeripheral:self.discoveredPeripheral options:connectOptions];

}

    -(void)disconnect{

    [self cleanup];

}


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

    switch (central.state) {

        case CBCentralManagerStatePoweredOn:{

            [self.cbcManager scanForPeripheralsWithServices:@[ [CBUUID UUIDWithString:kFindMeServiceUUID] ] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @NO }];

        }

            break;

            // Scans for any peripheral

        default:{

            UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:@"Cental Manager did change state" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

            [alertView show];

            alertView=nil;

        }

            break;
    }

}


- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

    // Stops scanning for peripheral

    [self.cbcManager stopScan];


    if (self.discoveredPeripheral != peripheral) {

        self.discoveredPeripheral = peripheral;

        [self.delegate didDeviceDiscoverd:self.discoveredPeripheral.name];

    }

}

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{

    [self.delegate didDeviceConnectionFailed:error];

    [self cleanup];
}


- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{

    [self.delegate didDeviceConnected];

    [self.discoveredPeripheral setDelegate:self];

    [self.discoveredPeripheral discoverServices:@[[CBUUID UUIDWithString:kFindMeServiceUUID]]];

}


- (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverServices:(NSError *)error {

    if (error) {

        NSString *strMsg=[NSString stringWithFormat:@"didDiscoverServices: %@",  error];

        UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg 
delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

        [alertView show];

        alertView=nil;

        [self cleanup];

        return;

    }

    for (CBService *service in aPeripheral.services) {

        if ([service.UUID isEqual:[CBUUID UUIDWithString:kFindMeServiceUUID]]) {

            self.findMeService=service;

            [self.discoveredPeripheral discoverCharacteristics:@[[CBUUID UUIDWithString:kFindMeCharacteristicUUID]] forService:self.findMeService];

        }

    }

}

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{

    if(error){

        NSString *strMsg=[NSString stringWithFormat:@"didDiscoverCharacteristicsForService: %@",  error];

        UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

        [alertView show];

        alertView=nil;

    }

    for(CBCharacteristic *character in [service characteristics])
    {

        if([[service UUID] isEqual:[CBUUID UUIDWithString:kFindMeServiceUUID]] &&
           [[character UUID] isEqual:[CBUUID UUIDWithString:kFindMeCharacteristicUUID]])
        {

            NSString *strMsg=[NSString stringWithFormat:@"didDiscoverCharacteristicsForService: %@",  character];

            UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

            [alertView show];

            alertView=nil;

            self.findMeServiceCharacteristic = character;

        }
    }
}


- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

{

    NSString *strMsg=[NSString stringWithFormat:@"Did update value for characteristic %@, new value: %@, error: %@", characteristic, [characteristic value], error];

    UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

    [alertView show];

    alertView=nil;


}

- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {

    if (error) {

        NSLog(@"Error changing notification state: %@", error.localizedDescription);

    }


    // Exits if it's not the transfer characteristic

    if (![characteristic.UUID isEqual:[CBUUID UUIDWithString:kFindMeCharacteristicUUID]]) {

        return;

    }


    NSString *strMsg=[NSString stringWithFormat:@"didUpdateNotificationStateForCharacteristic %@, reason: %@", characteristic, error];

    UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

    [alertView show];


    alertView=nil;

}

- (void) peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

{

    if (error)

    {

        NSString *strMsg=[NSString stringWithFormat:@"Failed to write value for characteristic %@, reason: %@", characteristic, error];

        UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

        [alertView show];

        alertView=nil;

    }
    else
    {
        NSString *strMsg=[NSString stringWithFormat:@"Did write value for characterstic %@, new value: %@", characteristic, [characteristic value]];

        UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil     otherButtonTitles:@"OK", nil];

        [alertView show];

        alertView=nil;

    }
}

- (void)cleanup

{

    if (!self.discoveredPeripheral.isConnected) {

        return;

    }

    if (self.discoveredPeripheral.services != nil) {

        for (CBService *service in self.discoveredPeripheral.services) {

            if (service.characteristics != nil) {

                for (CBCharacteristic *characteristic in service.characteristics) {

                    if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:kFindMeServiceUUID]]) {

                        if (characteristic.isNotifying) {

                            [self.discoveredPeripheral setNotifyValue:NO forCharacteristic:characteristic];

                            return;

                        }

                    }

                }

            }
        }
    }
    [self.cbcManager cancelPeripheralConnection:self.discoveredPeripheral];
    [self.delegate didDeviceDisconnected];
}
@end
`

If I understand you right you can write a value successfully to a characteristic but you don't get a pairing request. 如果我理解正确,您可以成功地为某个特征写一个值,但是您没有得到配对请求。

The pairing is triggered by the peripheral . 配对由外围设备触发 Meaning the peripheral has to refuse the write or read request of your central to a characteristic. 这意味着外设必须拒绝中心对特性的写入或读取请求。 Your central gets the refusal "unauthorized authentication" and then tries to pair with the peripheral and showing the pairing alert pop up you are waiting for. 您的中心获得拒绝“未经授权的身份验证”,然后尝试与外围设备配对并显示您正在等待的配对警报弹出窗口。 This is all done by core bluetooth automatically. 这一切都是由核心蓝牙自动完成的。 The only thing you need to do is change the characteristics options and permissions in your peripheral. 您唯一需要做的就是更改外围设备中的特性选项和权限。 This is the apple sample code to trigger a pairing: 这是触发配对的苹果示例代码:

emailCharacteristic = [[CBMutableCharacteristic alloc]
    initWithType:emailCharacteristicUUID
    properties:CBCharacteristicPropertyRead
    | CBCharacteristicPropertyNotifyEncryptionRequired
    value:nil permissions:CBAttributePermissionsReadEncryptionRequired];

source: CoreBluetooth _concepts iOS7 preview 来源: CoreBluetooth _concepts iOS7预览

Also check out the WWDC 2012 advanced core bluetooth video at 28 minutes they explain the concept of pairing. 还可以在28分钟查看WWDC 2012高级核心蓝牙视频 ,他们解释了配对的概念。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM