我正在使用CoreLocation检测我教室中的4个特定信标,不幸的是,无论我如何移动以及我与灯塔有多接近,CoreLocation都为我提供了proximity: 0, +/- -1.00m
和RSSI: 0
。
我的控制器中的代码是:
func centralManagerDidUpdateState(central: CBCentralManager) {
if(central.state == CBCentralManagerState.PoweredOn){
print("Powered on")
}
else if(central.state == CBCentralManagerState.PoweredOff){
print("Powered off")
}
else if(central.state == CBCentralManagerState.Unknown){
print("Unknown state")
}
}
func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
print(peripheral)
}
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
print(advertisementData)
}
func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
var knownBeacons = beacons.filter{$0.proximity != CLProximity.Unknown}
if(knownBeacons.count > 0){
closestBeacon = knownBeacons[0] as CLBeacon
}
print(beacons)
for beacon in beacons{
print(beacon.proximity.rawValue)
}
}
编辑:经过一些调试后,我发现iPhone上的iOS不会调用方法didConnectPeripheral
和didDiscoverPeripheral
。
答案 0 :(得分:0)
如果您正确打印出CLBeacon
信息,一个问题可能是您拥有的信标的广告频率。如果他们以非常低的频率(每秒一次或更少)进行广播,那么iOS将很难确定RSSI和接近度的准确值。
关于您的CBCentralManager
问题,您必须明确调用scanForPeripheralsWithServices:options:
开始扫描,然后stopScan
。您希望至少有两个原因致电stopScan
:扫描电池耗尽电量,几秒钟后您将收到有关您周围BLE外围设备的所有信息。您可以使用计时器停止扫描,也可以从UI手动停止扫描。收到有关外围设备的信息后,您可以对它们进行连接。只有这样,您才会收到有关didConnectPeripheral
委托方法的通知。