Подтверждаю, проблема есть.
Если устройство не будет работать какое-то время, затем его физически переместить в другое место, то оно больше никогда не заработает, т.к. будет срабатывать фильтр на максимальную скорость.
Необходимо вносить изменения в алгоритм по фильтру максимальной скорости.
Вы устройство телепортируете чтоли? Почему будет проблема с максимальной скоростью?
Можно сказать телепортирую, устройство физически отключили, например, сгорел предохранитель, затем через сутки восстановили. Но физически оно уже оказалось в другом районе города.
Если такое происходит, то сервер от такого устройства больше никогда не примет данные, всегда будет отсечка по фильтру максимальной скорости.
В общем вот этот код спасет отца русской демократии:
private boolean filterMaxSpeed(Position position, Position last) {
if (filterMaxSpeed != 0 && last != null) {
double distance = position.getDouble(Position.KEY_DISTANCE);
double time = position.getFixTime().getTime() - last.getFixTime().getTime();
//return time > 0 && UnitsConverter.knotsFromMps(distance / (time / 1000)) > filterMaxSpeed;
return (time < 120 * 1000) && (time > 0 && UnitsConverter.knotsFromMps(distance / (time / 1000)) > filterMaxSpeed);
}
return false;
}
Куда этот код вставлять? Спасибо
Можно сказать телепортирую, устройство физически отключили, например, сгорел предохранитель, затем через сутки восстановили. Но физически оно уже оказалось в другом районе города.
Ключевое слово тут через сутки. Фильтр не должен фильтровать такое потому что средняя скорость будет маленькая. Я подозреваю что ваше устройство присылает неправильное время если такое происходит, но это уже совсем другой вопрос.
Некоторые трекеры аккумулируют позиции, если не могут отправить их на сервер, а потом при появлении соединения их отправляют. Это не единичный случай. Как обойти эту проблему?
Что за проблема конкретно?
Антон, ну вы же видите исправление в коде, суть такова, что если было превышение по скорости и оно было в течении 2-х минут, только тогда фильтр сработает, в этом и есть проблема и пример того как можно ее исправить.
Sviatoslav, код нужно вставить в исходники сервера и собрать командой ./gradlew -assemble, подробнее в инструкции.
Я вижу то что вы называете исправления, но не понимаю как они получились. Мне кажется исправить надо устройство если оно отправляет неправильное время или местоположение.
Я думаю любое устройство будет вести себя так, если его включить в одной точке города, затем отключить, перевезти в другую точку города и снова включить.
С чего это вдруг? Если устройство поймает новые координаты в другой точке города, то оно одновременно получит и актуальное время этого фикса. Если ваше устройство присылает новые координаты и старое время, то это очевидно баг устройства.
Что это меняет?
В логике работы метода: filterMaxSpeed происходит проверка на то, что между предыдущей координатой и текущей время миллисекунд > 0
если это условие выполняется, то и фильтр срабатывает.
А это значит, что если устройство пришлет новые координаты и новое время, то это подходящий случай для фильтра.
Помогите найти проблему. Например забыл пополнить симкарту. соответственно машина ездила без обновления местоположения. потом пополнил и машина уже далеко от того места, где была раньше. После пополнения симкарты позиция виснет и больше не обновляется... Что в конфиге неправильно?
<entry key='filter.enable'>true</entry> <entry key='filter.future'>900</entry> <entry key='filter.invalid'>true</entry> <entry key='filter.zero'>true</entry> <entry key='coordinates.maxError'>3000</entry> <entry key="event.overspeed.notRepeat">true</entry> <entry key='filter.maxSpeed'>400</entry> <entry key='filter.skipLimit'>30</entry> <entry key='filter.distance'>30</entry> <entry key='event.motion.speedThreshold'>1</entry> <entry key='filter.accuracy'>40</entry>