iOS8 RSSI和Proximity意外结果

时间:2015-06-17 08:21:52

标签: ios iphone swift core-location ibeacon

我正在使用CoreLocation检测我教室中的4个特定信标,不幸的是,无论我如何移动以及我与灯塔有多接近,CoreLocation都为我提供了proximity: 0, +/- -1.00mRSSI: 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不会调用方法didConnectPeripheraldidDiscoverPeripheral

1 个答案:

答案 0 :(得分:0)

如果您正确打印出CLBeacon信息,一个问题可能是您拥有的信标的广告频率。如果他们以非常低的频率(每秒一次或更少)进行广播,那么iOS将很难确定RSSI和接近度的准确值。

关于您的CBCentralManager问题,您必须明确调用scanForPeripheralsWithServices:options:开始扫描,然后stopScan。您希望至少有两个原因致电stopScan:扫描电池耗尽电量,几秒钟后您将收到有关您周围BLE外围设备的所有信息。您可以使用计时器停止扫描,也可以从UI手动停止扫描。收到有关外围设备的信息后,您可以对它们进行连接。只有这样,您才会收到有关didConnectPeripheral委托方法的通知。