即使应用程序在同一个地方,信标的接近范围也会来回变化

Posted

技术标签:

【中文标题】即使应用程序在同一个地方,信标的接近范围也会来回变化【英文标题】:Proximity range for Beacons changes back and forth even when the App is in the same place 【发布时间】:2014-05-02 21:11:06 【问题描述】:

Beacon Proximity range 将接近响应更改为 Near - Immediate - Far,即使 ios 设备保持在同一位置。

当我在接近响应接近时打开视图时。我来回得到接近响应,近 - 立即然后近。它一次又一次地显示视图

我们如何解决这个问题。是否有任何事件处理程序。

谢谢。

【问题讨论】:

【参考方案1】:

接近度和准确度值似乎很“嘈杂”。它也可能取决于您的环境。水(以及人)会吸收蓝牙使用的频率,因此移动的人可能会产生影响,但我观察到当两台设备都放在我的桌子上时,它们的距离在 1.2m 和 1.9m 之间。

我认为您将不得不处理应用程序中的噪音。视图打开后,您应该将其保持打开状态,直到信标“远”(或您获得区域退出)一段时间。如果状态转换回接近或立即,则重置计时器。

你需要使用一些类似下面的代码-

-(void)locationManager:(CLLocationManager *)manager
    didRangeBeacons:(NSArray *)beacons
           inRegion:(CLBeaconRegion *)region 

    CLBeacon *beacon=beacons[0];

    switch (beacon.proximity) 

    case CLProximityFar:
        if (self.farTimer==nil) 
            self.farTimer=[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(farTimerFired:) userInfo:beacon repeats:NO];
        
    break;

    case CLProximityNear:
    case CLProximityImmediate:
        if (self.farTimer!=nil) 
            [self.farTimer invalidate];
            self.farTimer=nil;
        
    break;

    case CLProximityUnknown:
         NSLog(@"Beacon proximity is unknown");
    break;
   


-(void) farTimerFired:(NSTimer *)timer 
 CLBeacon *beacon=(CLBeacon *)timer.userInfo;
 NSLog(@"Beacon %@ is really far",beacon.proximityUUID.UUIDString);
 self.farTimer=nil;

【讨论】:

我看到的问题是,当我将信标和 iOS 设备并排放置时,这是立即接近但仍然出现问题。它会在几秒钟后将接近度更改为 NEAR 接近度。 这很好,因为立即比附近更近。一旦您在“近”触发,您需要观察状态更改为“远”(或区域退出)。当你得到一个“远”时,启动一个计时器——如果你仍然在“远”一段时间,那么你就“真的”远了。如果你回到接近或立即然后重置过程 如何在 far 上启动计时器?我尝试了很多方法,但即使计时器启动,didRangeDelegate 也会在附近或立即调用。如果你用 perfomsegue 延迟调用另一个视图,它会起作用。但是,如果你想留在同一个 View 上?请问我该怎么办? @mad_mask 查看我添加到答案中的示例代码 非常感谢 Paulw11。我今天会试试这个。【参考方案2】:

了解邻近度值只是 estimate based on radio signal strength,因此这是由于@Paulw11 在他的回答中所说的噪音而导致的预期行为。

您可以做两件事来使接近度(和准确度)读数尽可能可靠:

    选择传输速率尽可能快的 iBeacon。不同的 ibeacon 以不同的频率传输广告,从每秒 30 次到每秒一次或更少。通常,更快的传输速率可以为您提供更少嘈杂的距离估计,因为它们为 iOS 提供了更多可以使用的无线电信号强度测量值。对于您的测试,请尝试使用基于 iOS 的 iBeacon,例如 Locate for iBeacon,看看它是否有帮助。已知每秒传输 30 次。

    确保您的 iBeacon 已正确校准。这不会减少噪音,但会确保您获得的读数平均而言是正确的。如果未正确校准,当设备稳定地位于即时区域时,您可能会更频繁地看到即时和附近之间的跳跃,因为它计算的距离太远了。

除此之外,如@Paulw11 建议的那样,对邻近度值进行软件过滤器可能会有所帮助,但它仍然不是完美的。您只需决定是否可以忍受用例的噪音。

【讨论】:

我们可以使用 RSSI 值/精度来测量 Beacon 的距离,而不是 Proximity(FAR、NEAR、IMMEDIATE)。 是的,但这无助于解决噪音问题。 Proximity 字段(FAR、NEAR、IMMEDIATE)只是将 Accuracy 字段值分组到预定义的存储桶中。 RSSI 字段的噪音更大,因为它没有像 Accuracy 那样的软件过滤器。 Accuracy 字段使用大约 30 秒内 RSSI 的运行平均值。 我们可以使用加速度计来获得滚动平均值吗?有可能吗? 在非常具体的基于运动的用例中添加加速度计数据可能对自定义算法有用,但在用户静止不动的主要用例中可能没有帮助。如果用户静止不动,你能做的最好的就是采用更长的滚动平均值。您可以收集一长串 RSSI 平均值,然后使用算法计算距离,如下所示:***.com/questions/20416218/…

以上是关于即使应用程序在同一个地方,信标的接近范围也会来回变化的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS10 中,即使 iPhone 肯定在信标旁边,screen-off 也会调用 DidExitRegion

CLLocationManager didRangeBeacons 停止在前台工作

信标区域的 iBeacon 监控模式接近度

iBeacon:何时向服务器发送信标事件

从 iBeacon 接近控制视图

信标接近检测器在iOS swift中不起作用