繁体   English   中英

iOS核心蓝牙不要求配对

[英]iOS Core Bluetooth Not asking for Pair

在我最近的项目中,我需要通信硬件(蓝牙低功耗)。我已经实现了所有委托方法代码。 我能够连接硬件和设备,但我没有得到配对警报(附加屏幕截图)。 为什么不要求配对? 谢谢。

  #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
`

如果我理解正确,您可以成功地为某个特征写一个值,但是您没有得到配对请求。

配对由外围设备触发 这意味着外设必须拒绝中心对特性的写入或读取请求。 您的中心获得拒绝“未经授权的身份验证”,然后尝试与外围设备配对并显示您正在等待的配对警报弹出窗口。 这一切都是由核心蓝牙自动完成的。 您唯一需要做的就是更改外围设备中的特性选项和权限。 这是触发配对的苹果示例代码:

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

来源: CoreBluetooth _concepts iOS7预览

还可以在28分钟查看WWDC 2012高级核心蓝牙视频 ,他们解释了配对的概念。

暂无
暂无

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

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