2016-04-04 2 views
3

В настоящее время я работаю над приложением iOS, которое охватывает и контролирует iBeacon, чтобы иметь возможность делать некоторые действия и получать уведомления. Ranging работает безупречно, но у меня возникают проблемы с мониторингом маяка и уведомлениями. Я довольно подробно изучил этот вопрос, и я знаю, что в инфраструктуре CoreLocation обычно возникают такие проблемы, но мне было интересно, как другие разработчики исправляют/приближаются к этому.Мониторинг iBeacon с ненадежными результатами (didEnterRegion & didExitRegion)

В основном, я показываю местные уведомления, когда были сняты методы didEnterRegion и didExitRegion. К сожалению, эти два метода запускаются довольно часто (ненадёжно), даже когда iBeacon находится рядом с ним, хотя иногда работает отлично, что делает его более раздражающим. Я пытался снизить рекламный интервал iBeacon, и хотя это помогло, оно не полностью устранило проблему. Теперь я пытаюсь использовать логический фильтр, в котором я игнорирую уведомление об увольнении, если событие входа или выхода произошло за последние X минут (я думаю о «волшебном» номере от 5 до 15).

Есть ли у кого-то такие же проблемы? Добавил бы второй iBeacon в ситуацию? (возможно, контролировать оба из них и логически фильтровать выход и вводить события на основе этих двух входов?). Я также подумывал добавить еще один слой данных, чтобы показывать уведомления, возможно, на основе данных GPS или Wifi. Кто-нибудь пробовал это?

Любая другая идея? Я открыт для любой рекомендации.

На всякий случай, я использую Estimote iBeacons и iOS9 (Objective-c).

Спасибо за ваше время!

ответ

2

Прерывистые область выхода/вход событий являются общей проблемой, и, как правило, решается с помощью таймера baded программного фильтра точно так, как вы предлагаете. Специфика того, как вы настроили фильтр (минимальное время ожидания повторной записи после выхода до обработки логики выхода), меняется для каждого варианта использования, поэтому хорошо иметь его под вашим контролем.

Поймите, что выходы из региона вызваны тем, что iOS не обнаруживает никаких рекламных сообщений Bluetooth от маяка в CLBeaconRegion в течение 30 секунд. Если два обнаруженных пакета находятся на расстоянии 31 секунда, вы получите выход из региона, а затем запись региона через секунду.

Это обычно происходит при низких уровнях сигнала.Если устройство iOS находится на внешнем краю диапазона передачи маяка, будет принят только небольшой процент пакетов. При передаче маяка с частотой 1 Гц, если пропущено 30 пакетов в строке, устройство iOS получит событие выхода.

Есть несколько вещей, которые вы можете сделать, чтобы уменьшить эту проблему в конкретной области, где вы хотите твердое покрытие:

  1. Включите радиомаяк мощность передатчик до максимума. Это даст более сильный уровень сигнала и меньшее количество пропущенных пакетов в интересующем вас районе.

  2. Превратите рекламу в максимальную. Реклама с частотой 10 Гц дает 10-кратное количество пакетов для приема в 1 Гц.

  3. При необходимости добавить дополнительные маяки с тем же идентификатором для увеличения охвата.

Конечно, есть расходы на вышеупомянутое, включая сокращение срока службы батареи при высоких рекламных скоростях и уровнях мощности передатчика.

Даже если вы все вышесказанное, , вам все равно нужен программный фильтр, потому что всегда будет точка, где вы находитесь на краю, если радиус ближайшего радиуса маяка.

Вы можете увидеть пример программного кода фильтра в моем ответе here.

1

Маяки излучают импульсный сигнал. Ranging также выполняет прерывистое сканирование (примерно каждые 100 мс). Это означает, что ваше устройство может пропустить маяк в течение нескольких секунд подряд, что может привести к результатам, которые вы испытываете. Вы можете войти значение маяков RSSI в этом методе:

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

Я полагаю, вы будете видеть много нулевых значений, прежде чем увидеть didExitRegion называют. Это не ошибка вашего кода или маяка. Это связано только с тем фактом, что ни излучаемый сигнал, ни обнаружение не являются постоянными. Они пульсируют. Эти проблемы могут возникать, когда маяк сидит на одном столе с вашим устройством и может быть преувеличен в реальном мире, когда сигналы блокируются физическими объектами и людьми.

Я бы использовал дальномер, чтобы более точно определить, есть ли ваш маяк. Обратите внимание, что дальность действия, особенно в фоновом режиме, может иметь значительный заряд батареи.

Смежные вопросы