iOS 下 altBeacons 上的 Major 和 Minor

Posted

技术标签:

【中文标题】iOS 下 altBeacons 上的 Major 和 Minor【英文标题】:Major and Minor on altBeacons under iOS 【发布时间】:2015-02-18 11:30:17 【问题描述】:

有没有办法找出 altBeacon 的主要和次要值? 我正在使用这个库 (https://github.com/CharruaLab/AltBeacon) 来检测附近的 BLE 设备(无论它是否是信标)。 检测到信标,我知道它们的 uuid。 我可以使用 ios CoreBluetooth 框架提取主要和次要值吗?

更新: 代码看起来不错。看起来找出主要或次要的唯一方法是请求信标的数据,因为它在下面接受的答案中完成。但信标本身并不一定会在这种情况下回复您。

【问题讨论】:

【参考方案1】:

仅适用于 iBeacon:


覆盖下面的CLLocationManager委托方法,当您能够检测到信标时,将调用此方法。

-(void)locationManager:(CLLocationManager*)manager
       didRangeBeacons:(NSArray*)beacons
              inRegion:(CLBeaconRegion*)region 
    // Beacon found!
    
    CLBeacon *foundBeacon = [beacons firstObject];
    
    // You can retrieve the beacon data from its properties
    NSString *uuid = foundBeacon.proximityUUID.UUIDString;
    NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major];
    NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor];

要使用核心定位框架检测信标,您需要在viewDidLoad 方法中添加以下代码。

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // Initialize location manager and set ourselves as the delegate
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    
    // Create a NSUUID with the same UUID as the broadcasting beacon
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"];
    
    // Setup a new region with that UUID and same identifier as the broadcasting beacon
    self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
                                                             identifier:@"com.app.identifier"];
    
    // Tell location manager to start monitoring for the beacon region
    [self.locationManager startMonitoringForRegion:self.myBeaconRegion];
    
    // Check if beacon monitoring is available for this device
    if (![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) 
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Monitoring not available" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
        [alert show]; 
    


对于蓝牙设备:


用两个代理 CBCentralManagerDelegateCBPeripheralDelegate 扩展视图控制器

viewDidLoad 中创建CBCentralManager 对象。

_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

并覆盖以下方法(scan 方法除外):

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 
    if (central.state != CBCentralManagerStatePoweredOn) 
        return;
    
    // The state must be CBCentralManagerStatePoweredOn...
    // ... so start scanning
    [self scan];


- (void) scan 
    
    // UUID for peripheral services
    [self.centralManager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX"]] options:nil];
    NSLog(@"Scanning started");


- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
    
    NSLog(@"Discovered %@ at %@", peripheral.name, RSSI);
    
    if (self.discoveredPeripheral != peripheral) 
        
        // Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
        self.discoveredPeripheral = peripheral;
        
        // And connect
        NSLog(@"Connecting to peripheral %@", peripheral.UUID);
        [self.centralManager connectPeripheral:peripheral options:nil];
    


- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral 
    NSLog(@"Peripheral Connected");
    
    // Stop scanning
    [self.centralManager stopScan];
    NSLog(@"Scanning stopped");
    
    // Make sure we get the discovery callbacks
    peripheral.delegate = self;
    [peripheral discoverServices:nil];

【讨论】:

据我所知,这仅适用于 iBeacons。因为 altBeacons 触发 BT 框架委托。 仅供参考:如果 altBeacons 是 iBeacon,则它必须根据 Apple 标准和 MFI 程序支持 CoreLocation API。请检查 altBeacons API 并告诉我。 看看编辑。我检查了altBeacons git repo,没有关于主要和次要的详细信息。它以字节为单位发布数据,可以从上述方法轻松获取,如果设备可以通过覆盖核心蓝牙的更多委托方法来提供服务,您也可以获取服务。

以上是关于iOS 下 altBeacons 上的 Major 和 Minor的主要内容,如果未能解决你的问题,请参考以下文章

应用程序关闭时 AltBeacon 未检测到信标

使用 AltBeacon 库以 CoreBluetooth 格式做广告

如何使用 android-beacon-library (altbeacon) 正确停止扫描信标

AltBeacon api 在测距信标时返回空集合

AltBeacon:如何使用 AltBeacon Lib 获取广告标志(例如 BR/EDR)?

AltBeacon:didExitRegion 和 didEnterRegion 交替