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

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


person user856232    schedule 13.10.2018    source источник


Ответы (2)


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

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

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

person davidgyoung    schedule 13.10.2018

Согласно официальным документам 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 = [[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);
}

}

этот beacon.rssi указывает мощность сигнала, надеюсь, это поможет вам.

person Junior Jiang    schedule 15.10.2018
comment
Спасибо за всю информацию. Я на самом деле уже реализовал то, что вы показываете. Я просто все еще надеялся, что каким-то образом фактическая измеренная мощность сигнала на расстоянии 1 м была где-то раскрыта, поскольку это единственный способ получить точное расстояние. iOs с их близостью — это хорошо, но не здорово. Я знаю, что измеренный уровень сигнала находится в потоке байтов, и просто хочу, чтобы Apple предоставила его, чтобы мы могли его получить. Еще раз спасибо за ваш ответ. - person user856232; 15.10.2018
comment
Хорошо, если хотите измеренный уровень сигнала. Надеюсь, Apple выставит. - person Junior Jiang; 16.10.2018