Протокол iBeacon включает мощность сигнала или измеренную мощность в качестве последнего байта пакета. Есть ли способ получить это значение?
Как получить значение силы сигнала из пакета iBeacon на iOS с помощью Objective-C
Ответы (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 = [[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 указывает мощность сигнала, надеюсь, это поможет вам.