无法在iOS

时间:2017-02-28 22:07:27

标签: ios objective-c bluetooth cbperipheral cbcentralmanager

编辑: 删除了iBeacon代码。由于iBeacon代码没有问题。

- >一旦我们识别出我们的信标,我们就必须使用BLE与第一个信标进行通信。我们在Respberry PI上使用Bleno框架。

//传递我的服务UUID

[bluetoothManager scanForPeripheralsWithServices:@[@"87fa7df2-748c-4093-8e73-b93ee73543b4"] options:scanOptions];

问题是,如果我们通过我的服务UUID(使用Light Blue App验证),我没有得到任何结果。相反,如果我们通过“nil”,我至少能够识别我的设备。

那么,是否有任何通用方法可以从iOS Code识别我们的蓝牙设备。由于CBPeripheral正在返回有限的属性。

  

< CBPeripheral:0x1700ff700,identifier = 7915DCF8-AF2E-4AF2-B5FC-A5EEA10D3812,name = raspberrypi,state = connected>

我尝试使用BLENO框架使用以下命令更改我的蓝牙设备名称。

  

sudo BLENO_DEVICE_NAME =“SOME_NAME_86”节点iBeacon.js

有时候,我能够读到这个名字。但并不是所有的时间。所以我正在寻找替代解决方案。

这是我的代码:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.    
    _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    _data = [[NSMutableData alloc] init];
}


- (void)centralManagerDidUpdateState:(CBCentralManager *)central {    
    switch (central.state) {            
        case CBManagerStatePoweredOn:
[_centralManager scanForPeripheralsWithServices:@[[CBUUID 
UUIDWithString:@"87FA7DF2-748C-4093-8E73-B93EE73543B4"]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];                break;            
        default:            break;
    }
}


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

    if (_discoveredPeripheral != peripheral) {
        _discoveredPeripheral = peripheral;
        [_centralManager connectPeripheral:peripheral options:nil];
        [_centralManager stopScan];
    }
}

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
    NSLog(@"Failed to connect");
    [self cleanup];
}

- (void)cleanup {

    // See if we are subscribed to a characteristic on the peripheral
    if (_discoveredPeripheral.services != nil) {
        for (CBService *service in _discoveredPeripheral.services) {
            if (service.characteristics != nil) {
                for (CBCharacteristic *characteristic in service.characteristics) {
                    if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]]) {
                        if (characteristic.isNotifying) {
                            [_discoveredPeripheral setNotifyValue:NO forCharacteristic:characteristic];
                            return;
                        }
                    }
                }
            }
        }
    }

    [_centralManager cancelPeripheralConnection:_discoveredPeripheral];
}


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

    [_centralManager stopScan];
    NSLog(@"Scanning stopped");

    [_data setLength:0];

    peripheral.delegate = self;    
    [peripheral discoverServices:@[[CBUUID UUIDWithString:@"87FA7DF2-748C-4093-8E73-B93EE73543B4"]]];
}


- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    if (error) {
        [self cleanup];
        return;
    }

    for (CBService *service in peripheral.services) {
        [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]] forService:service];
    }
    // Discover other characteristics
}

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
    if (error) {
        NSLog(@"Error");
        return;
    }

    NSString *stringFromData = [[NSString alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding];

    if ([stringFromData isEqualToString:@"EOM"]) {        
        [peripheral setNotifyValue:NO forCharacteristic:characteristic];        
        [_centralManager cancelPeripheralConnection:peripheral];
    }

    [_data appendData:characteristic.value];
}

@end

问题是,我有两个并排的蓝牙设备,广告相同的服务ID。根据场景,我应该只连接到一个设备&阅读他们的特点。

3 个答案:

答案 0 :(得分:0)

如果您尝试从iOS检测并与iBeacon通信,您很可能想要使用Core Location,而不是Core Bluetooth ...

看看这里:https://developer.apple.com/reference/corelocation?language=objc

编辑:我没有运行此代码,但在快速浏览代码后,它看起来像扫描和检测iBeacons的一个很好的例子:https://github.com/ThomasJay/Locate

答案 1 :(得分:0)

您发送给scanForPeripheralsWithServices的数组是CBUUID个对象的数组,而不是字符串数组。你需要:

[_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"87FA7DF2-748C-4093-8E73-B93EE73543B4"]] options:nil];

答案 2 :(得分:0)

偶然发现这个错误,这似乎是过时的,但是由于我处于类似的情况(花了一天左右的时间来解决这个问题),所以我决定将来为任何阅读此书的人解答。您很有可能正在运行服务,但是您没有广播其可用性。这样,只有与设备配对后,您的服务才可见。

要进行测试,请使用nil值进行服务扫描,并打印centralManager:didDiscoverPeripheral:advertisementData:RSSI:中可用的advData数组的内容。如果您的服务UUID在该字典中(在键CBAdvertisementDataServiceUUIDsKey下不可用),则iOS设备无法知道没有配对就可以使用的服务。