rssi, возвращенный библиотекой altbeacon 127, искажает расстояние

Я работаю над приложением, которое создает определенные сообщения при входе в разные регионы на основе диапазона до маяка (например, позиция ‹ .5 | позиция ‹ 2 | позиция ‹ 10). У меня было странное поведение при регистрации расстояния и rssi. В настоящее время я заменяю RSSI последним полученным RSSI, если он равен 127. Это единственное значение, которое кажется совершенно неуместным.

Проблема

05-08 10:09:48.379  21495-22283 I/RangingService? RSSI: 127 Distance: 2533.712149492241 meters
05-08 10:09:49.500  21495-22284 I/RangingService? RSSI: -38 Distance: 0.07068384635393776 meters
05-08 10:09:50.662  21495-22301 I/RangingService? RSSI: 127 Distance: 0.07068384635393776 meters
05-08 10:09:51.795  21495-22302 I/RangingService? RSSI: 127 Distance: 2533.712149492241 meters
05-08 10:09:52.946  21495-22318 I/RangingService? RSSI: -34 Distance: 0.10971085339590038 meters
05-08 10:09:54.074  21495-22327 I/RangingService? RSSI: 127 Distance: 0.10971085339590038 meters
05-08 10:09:55.375  21495-22404 I/RangingService? RSSI: 127 Distance: 2533.712149492241 meters
05-08 10:09:56.499  21495-22488 I/RangingService? RSSI: -36 Distance: 0.08827424889527898 meters
05-08 10:09:57.637  21495-22492 I/RangingService? RSSI: -36 Distance: 0.008486821580451052 meters
05-08 10:09:58.771  21495-22493 I/RangingService? RSSI: 127 Distance: 0.08827424889527898 meters
05-08 10:09:59.902  21495-22509 I/RangingService? RSSI: 127 Distance: 2533.712149492241 meters

Если вы посмотрите на расстояние, оно будет случайным образом всплескиваться при каждом расчете после или с rssi 127. Я не понимаю, почему rssi будет 127 так случайным образом так часто. Любые идеи?

Обходной путь

int rssi2use = beacon.getRssi();
if (rssi2use == 127) {
    Log.i(TAG, "Using last Rssi " + lastRssi + " instead of 127");
    rssi2use = lastRssi;
} else {
    lastRssi = beacon.getRssi();
}

MyBeacon.java Упрощение расчета расстояния для очистки средних значений rssis

public class MyBeacon extends Beacon {

    private static final String TAG = MyBeacon.class.getSimpleName();

    private final Beacon beacon;
    private final int rssi2use;

    public MyBeacon(final Beacon beacon, int rssi2use) {
        this.beacon = beacon;
        this.rssi2use = rssi2use;
    }

    @Override
    public double getDistance() {
        return mDistance = calculateDistance(beacon.getTxPower(), rssi2use);
    }

    public Beacon getSuperBeacon() {
        return beacon;
    }
}

RangingService.java

@Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "Service onCreate");
        beaconManager.setDebug(true);
        RangedBeacon.setSampleExpirationMilliseconds(2200);
        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.bind(this);
    }

Я слушаю только один специальный маяк.

@Override
    public void onBeaconServiceConnect() {

        beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() == 1) {
                    Beacon beacon = beacons.iterator().next();
                    handleBeaconInRange(beacon);
                }
            }
        });

        try {
            beaconManager.startRangingBeaconsInRegion(new Region(RANGE_REGION_ID, null, null, null));
        } catch (RemoteException e) {
            Log.e(TAG, "Exception on onbeaconServiceConnect", e);
        }

    }

Есть еще обработка BeaconInRange(), которая реагирует на разные расстояния, но это создает журнал.

private void handleBeaconInRange(Beacon beacon) {
        int rssi2use = beacon.getRssi();
        if (rssi2use == 127) {
            Log.i(TAG, "Using last Rssi " + lastRssi + " instead of 127");
            rssi2use = lastRssi;
        } else {
            lastRssi = beacon.getRssi();
        }

        MyBeacon myBeacon = new MyBeacon(beacon, rssi2use);
        double distance = myBeacon.getDistance();
        Log.i(TAG, "RSSI: " + rssi2use + " Distance: " + distance + " meters");
}

Журнал:

05-08 09:25:47.675  27646-29040/ I/RangingService? Using last Rssi -56 instead of 127
05-08 09:25:47.675  27646-29040/ I/RangingService? RSSI: -56 Distance: 0.7040448636262671 meters
05-08 09:25:48.839  27646-29041/ I/RangingService? RSSI: -56 Distance: 0.7040448636262671 meters
05-08 09:25:49.982  27646-29042/ I/RangingService? RSSI: -58 Distance: 0.97085 meters
05-08 09:25:51.121  27646-29043/ I/RangingService? Using last Rssi -58 instead of 127
05-08 09:25:51.121  27646-29043/ I/RangingService? RSSI: -58 Distance: 0.97085 meters
05-08 09:25:52.263  27646-29044/ I/RangingService? Using last Rssi -58 instead of 127
05-08 09:25:52.263  27646-29044/ I/RangingService? RSSI: -58 Distance: 0.97085 meters
05-08 09:25:53.408  27646-29045/ I/RangingService? RSSI: -55 Distance: 0.5879588872684474 meters
05-08 09:25:54.575  27646-29046/ I/RangingService? Using last Rssi -55 instead of 127
05-08 09:25:54.575  27646-29046/ I/RangingService? RSSI: -55 Distance: 0.5879588872684474 meters
05-08 09:25:55.701  27646-29047/ I/RangingService? RSSI: -54 Distance: 0.4893928979531776 meters
05-08 09:25:56.858  27646-29064/ I/RangingService? RSSI: -61 Distance: 1.1474711863884917 meters
05-08 09:25:57.991  27646-29074/ I/RangingService? Using last Rssi -61 instead of 127
05-08 09:25:57.992  27646-29074/ I/RangingService? RSSI: -61 Distance: 1.1474711863884917 meters
05-08 09:25:59.130  27646-29075/ I/RangingService? RSSI: -46 Distance: 0.09846874009910023 meters
05-08 09:26:00.247  27646-29081/ I/RangingService? Using last Rssi -46 instead of 127
05-08 09:26:00.247  27646-29081/ I/RangingService? RSSI: -46 Distance: 0.09846874009910023 meters
05-08 09:26:01.392  27646-29085/ I/RangingService? RSSI: -49 Distance: 0.18521700814366415 meters
05-08 09:26:02.534  27646-29086/ I/RangingService? Using last Rssi -49 instead of 127
05-08 09:26:02.534  27646-29086/ I/RangingService? RSSI: -49 Distance: 0.18521700814366415 meters
05-08 09:26:03.680  27646-29087/ I/RangingService? Using last Rssi -49 instead of 127
05-08 09:26:03.680  27646-29087/ I/RangingService? RSSI: -49 Distance: 0.18521700814366415 meters
05-08 09:26:04.823  27646-29088/ I/RangingService? RSSI: -33 Distance: 0.0035551625558338114 meters
05-08 09:26:05.967  27646-29089/ I/RangingService? RSSI: -37 Distance: 0.011161878866100936 meters

person itsJASPERr    schedule 08.05.2015    source источник
comment
Похоже, вы получаете неправильные показания аппаратного обеспечения или встроенного ПО драйвера Bluetooth на вашем мобильном устройстве. Можете ли вы показать свой код для RangingService, который выдает эти строки журнала? Вы рассчитываете расстояние вручную или используете встроенный калькулятор расстояния Android Beacon Library? Встроенный в библиотеку калькулятор расстояний уже выбрасывает верхние 10% и нижние 10% показаний RSSI, поэтому, если вы используете его расчеты расстояний, это предполагает, что более 10% ваших показаний имеют это недопустимое значение RSSI.   -  person davidgyoung    schedule 08.05.2015
comment
@davidgyoung Я использую встроенный калькулятор библиотеки по умолчанию, но я установил для sampleExpirationMilliseconds значение 2200. Однако это не влияет на результат. Я отредактирую свой вопрос по вашему запросу.   -  person itsJASPERr    schedule 11.05.2015
comment
@davidgyoung На самом деле, чтобы найти обходной путь, я упростил метод getDistance() в Beacon, чтобы увидеть, имеет ли библиотека какое-либо отношение к этим числам.   -  person itsJASPERr    schedule 11.05.2015
comment
Можете ли вы сказать мне модель телефона, который вы используете, и версию ОС Android? Похоже, что вы получаете более 10% показаний RSSI как 127. Я могу внести исправление в библиотеку, чтобы автоматически отфильтровывать необоснованные показания RSSI, подобные этому, но сначала я хотел бы понять, какие устройства имеют проблему.   -  person davidgyoung    schedule 11.05.2015
comment
@davidgyoung Я использую LG G3 S Android 4.4.2 / 5.0.2, обе версии показывают такое поведение. Я буду тестировать это с другим оборудованием от того же производителя. Я использую самую маленькую версию Sensorberg. Может ли это быть проблемой, связанной с маяком, что отправляются ложные сигналы?   -  person itsJASPERr    schedule 13.05.2015
comment
Я подозреваю, что это проблема с LG G3 S. Тот факт, что вы видите проблему на двух разных устройствах, говорит о том, что это не неисправное устройство, а проблема с чипом Bluetooth или прошивкой на этой модели устройства.   -  person davidgyoung    schedule 14.05.2015
comment
Я создал бета-версию библиотеки, которая отфильтровывает показания RSSI со значением 127: github.com/AltBeacon/android-beacon-library/releases/tag/ Пожалуйста, попробуйте это и дайте мне знать, если это решит вашу проблему.   -  person davidgyoung    schedule 14.05.2015
comment
@davidgyoung Прошу прощения за то, что не совсем понял устройство. Это одно устройство, ОС которого была обновлена ​​в прошлые выходные, и все еще показывает такое поведение. Так что это может быть просто мое устройство, а не модель. Бета-версия библиотеки работает - спасибо! Это как фикс пусть еще немного лагает? -Я думаю, чем больше значений 127, тем медленнее вычисление? ... пока я печатал это, я только что получил 127 один раз.   -  person itsJASPERr    schedule 15.05.2015
comment
@davidgyoung Я только что протестировал сценарий с другим устройством, и вы были правы: устройство Samsung вообще не читает 127.   -  person itsJASPERr    schedule 15.05.2015
comment
У меня также есть G3 S (jangm D722), и он сообщает о показаниях rssi 127. В настоящее время я использую LineageOS 14.1 (Android 7.1.2). Похоже, проблема с оборудованием, или, возможно, драйвер чипа Bluetooth так и не был исправлен.   -  person Gonzalo    schedule 08.05.2017


Ответы (1)


Это не связано с библиотекой. Похоже, это связано с используемым устройством, либо прошивка, либо адаптер выдает неправильные показания.

Спасибо @davidgyoung за помощь в прояснении этого.

person itsJASPERr    schedule 21.05.2015