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

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>
diagnoz2 months ago

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

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

Anton Tananaev2 months ago

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

diagnoz2 months ago

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

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

diagnoz2 months 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;
    }
Sviatoslav2 months ago

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

Anton Tananaev2 months ago

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

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

Sviatoslav2 months ago

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

Anton Tananaev2 months ago

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

diagnoz2 months ago

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

diagnoz2 months ago

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

Anton Tananaev2 months ago

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

diagnoz2 months ago

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

Anton Tananaev2 months ago

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

diagnoz2 months ago

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

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