Как получить значение силы сигнала из пакета iBeacon на iOS с помощью Objective-C - PullRequest
0 голосов
/ 13 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Согласно официальным документам Apple, I 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 beнапример:

_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);
}

}

this beacon.rssi - уровень сигнала, я надеюсьэто может вам помочь.

0 голосов
/ 13 октября 2018

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

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

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

...