Как получить значение силы сигнала из пакета iBeacon на iOS с помощью Objective-C

Протокол iBeacon включает в себя мощность сигнала или измеренную мощность в качестве последнего байта пакета. Есть ли способ получить это значение?

2 ответа

К сожалению, iOS не предоставляет способа прочитать это значение. CoreLocation не предоставляет доступ к этому полю, а CoreBluetooth блокирует доступ к необработанным байтам рекламных объявлений iBeacon. По иронии судьбы вы можете прочитать этот байт на устройствах MacOS, Android, Windows и Linux - но не на iOS.

Вы можете прочитать свойство CLBeacon rssi, которое дает вам обнаруженную силу сигнала. Но, как вы, вероятно, знаете, это не то же самое, что байт измеренной мощности, передаваемый внутри пакета маяка, который сообщает ожидаемую мощность сигнала на 1 метре.

Очень неприятно, что iOS не разрешает доступ к этому полю.

Согласно официальным документам Apple, RSSI рассматривается как сила сигнала.

Instance Property
rssi
The received signal strength of the beacon, measured in decibels.

Declaration
@property(readonly, nonatomic) NSInteger rssi;

В коде Objective-C, вам нужно добавить два заголовка

#import <CoreLocation/CoreLocation.h>
#import <CoreBluetooth/CoreBluetooth.h>

и в.m вы должны добавить их делегата:

CBPeripheralManagerDelegate,
CLLocationManagerDelegate

тогда вы должны создать три объекта

@property(nonatomic, strong)CLBeaconRegion *beacon; //iBeacon device be scaned
@property(nonatomic, strong)CLLocationManager *locationManager;//location manager
@property (strong, nonatomic) CBPeripheralManager *peripheralManager;//periphera manager

locationManager может быть создан следующим образом:

 _locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager requestWhenInUseAuthorization];//set location be allow when use

Beacon можно описать так:

_beacon = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"FDA50693-A4E2-4FB1-AFCF-C6EB07647825"] identifier:@"media"];
//FDA50693-A4E2-4FB1-AFCF-C6EB07647825 this modified be your need scaned device's UUID

Периферийный менеджер может быть установлен следующим образом:

self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];

в viewdidload настройте службу определения местоположения в порядке, а затем сделайте следующее:

BOOL enable = [CLLocationManager locationServicesEnabled];
if (enable) {
    if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]])
    {
        [self.locationManager requestAlwaysAuthorization];
        [self.locationManager startMonitoringForRegion:_beacon];
        [self.locationManager startRangingBeaconsInRegion:_beacon];

    }
}

когда найдете устройство iBeacon, можете вызвать этот метод делегата:

//find IBeacon device then scan
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray*)beacons i    nRegion:(CLBeaconRegion *)region{
//if not we need found deice then stop scan
if (![[region.proximityUUID UUIDString]           
isEqualToString:@"12334566-7173-4889-9579-954995439125"]) {
[_locationManager stopMonitoringForRegion:region];
[_locationManager stopRangingBeaconsInRegion:region];
}
//print all IBeacon information
for (CLBeacon *beacon in beacons) {
   NSLog(@"rssi is : %ld", beacon.rssi);// this is signal strength
   NSLog(@"beacon.proximity %ld", beacon.proximity);
}

}

этот сигнал-маяк - сила сигнала, я надеюсь, что это может вам помочь.

Другие вопросы по тегам