Правильная настройка фильтрации.

Sviatoslava year ago

Помогите найти проблему. Например забыл пополнить симкарту. соответственно машина ездила без обновления местоположения. потом пополнил и машина уже далеко от того места, где была раньше. После пополнения симкарты позиция виснет и больше не обновляется... Что в конфиге неправильно?

        <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>
diagnoza month ago

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

Необходимо вносить изменения в алгоритм по фильтру максимальной скорости.

Anton Tananaeva month ago

Вы устройство телепортируете чтоли? Почему будет проблема с максимальной скоростью?

diagnoza month ago

Можно сказать телепортирую, устройство физически отключили, например, сгорел предохранитель, затем через сутки восстановили. Но физически оно уже оказалось в другом районе города.

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

diagnoza month ago

В общем вот этот код спасет отца русской демократии:

    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;
    }
Sviatoslava month ago

Куда этот код вставлять? Спасибо

Anton Tananaeva month ago

Можно сказать телепортирую, устройство физически отключили, например, сгорел предохранитель, затем через сутки восстановили. Но физически оно уже оказалось в другом районе города.

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

Sviatoslava month ago

Некоторые трекеры аккумулируют позиции, если не могут отправить их на сервер, а потом при появлении соединения их отправляют. Это не единичный случай. Как обойти эту проблему?

Anton Tananaeva month ago

Что за проблема конкретно?

diagnoza month ago

Антон, ну вы же видите исправление в коде, суть такова, что если было превышение по скорости и оно было в течении 2-х минут, только тогда фильтр сработает, в этом и есть проблема и пример того как можно ее исправить.

diagnoza month ago

Sviatoslav, код нужно вставить в исходники сервера и собрать командой ./gradlew -assemble, подробнее в инструкции.

Anton Tananaeva month ago

Я вижу то что вы называете исправления, но не понимаю как они получились. Мне кажется исправить надо устройство если оно отправляет неправильное время или местоположение.

diagnoza month ago

Я думаю любое устройство будет вести себя так, если его включить в одной точке города, затем отключить, перевезти в другую точку города и снова включить.

Anton Tananaeva month ago

С чего это вдруг? Если устройство поймает новые координаты в другой точке города, то оно одновременно получит и актуальное время этого фикса. Если ваше устройство присылает новые координаты и старое время, то это очевидно баг устройства.

diagnoza month ago

Что это меняет?
В логике работы метода: filterMaxSpeed происходит проверка на то, что между предыдущей координатой и текущей время миллисекунд > 0
если это условие выполняется, то и фильтр срабатывает.

А это значит, что если устройство пришлет новые координаты и новое время, то это подходящий случай для фильтра.