Получение CID, LAC и уровня сигнала всех вышек сотовой связи в радиусе действия

В настоящее время я трилатерирую свой Android с ячейками в своей сети. Это даже точнее, чем я думал. Но не так точно, как хотелось бы. Поэтому я хочу задействовать больше башен, чем получаю от getNeighboringCellInfo. Я хочу получить идентификатор соты и уровень сигнала каждой вышки в радиусе действия. каждого сетевого оператора. Есть ли способ "пинговать" вышки, чтобы они отвечали сотовым ID, Lac и сигналом? Каким-то образом это должно быть возможно. И можно ли сканировать 2G и 3G (и 4G) параллельно? Или можно переключаться между ними программно? Какие-либо предложения? Надеюсь, я достаточно ясно выразился...


person albrechtATnetzfactor    schedule 19.09.2012    source источник


Ответы (2)


Кажется, TelephonyManager и getNeighboringCellInfo() - это то, что вы ищете.

Вот простой и понятный пример:

/* first you wanna get a telephony manager by asking the system service */
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

/* then you can query for all the neighborhood cells */
List<NeighboringCellInfo> neighbors = tm.getNeighboringCellInfo();

/* here's something you can get from NeighboringCellInfo */
for (NeighboringCellInfo n : neighbors) {
    Log.v("CellInfo", "" + n.getCid());
    Log.v("CellInfo", "" + n.getLac());
    Log.v("CellInfo", "" + n.getPsc());
    Log.v("CellInfo", "" + n.getRssi());
}

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

Кстати, это работает только для 2G. 3G или более поздние версии не поддерживают такие операции.

person Simon Liu    schedule 12.11.2012
comment
Поэтому я хочу задействовать больше башен, чем получаю от getNeighboringCellInfo. Я уже читаю CID из соседних ячеек. Но я хочу получить ВСЕ CID КАЖДОГО сетевого оператора в диапазоне. - person albrechtATnetzfactor; 03.12.2012
comment
tm.getAllCellInfo() - лучший выбор. - person ofskyMohsen; 29.07.2017

На данный момент это правильный способ получения информации о соседних ячейках:

    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    List<CellInfo> cellInfoList = telephonyManager.getAllCellInfo();
    for (int i = 0; i < cellInfoList.size(); i++) {
        if (cellInfoList.get(i) instanceof CellInfoWcdma) {
            CellInfoWcdma cellInfoWcdma = (CellInfoWcdma) cellInfoList.get(i);
            /* Get LAC, strength etc. here */
        } else if (cellInfoList.get(i) instanceof CellInfoGsm) {
            CellInfoGsm cellInfoGsm = (CellInfoGsm) cellInfoList.get(i);
            /* Get LAC, strength etc. here */
        } else if (cellInfoList.get(i) instanceof CellInfoLte) {
            CellInfoLte cellInfoLte = (CellInfoLte) cellInfoList.get(i);
            /* Get TAC, strength etc. here */
        } else if (cellInfoList.get(i) instanceof CellInfoCdma) {
            CellInfoCdma cellInfoCdma = (CellInfoCdma) cellInfoList.get(i);
            /* Get strength etc. here */
        }
    }

В настоящее время,

  1. Вы можете найти LAC как cellInfoWcdma.getCellIdentity().getLac(), аналогично для cellInfoGsm и cellInfoLte. Обратите внимание, что CDMA не содержит LAC. Также обратите внимание, что LTE имеет TAC вместо LAC, которые похожи, за исключением их терминологии.

  2. Вы можете найти силу как cellInfoWcdma.getCellSignalStrength().getLevel(). Аналогично для LTE, GSM и CDMA. Обратите внимание, что вы можете getLevel, getDbm или getAsuLevel в зависимости от того, что вам интересно.

  3. Для CID вы можете получить его как cellInfoWcdma.getCellIdentity().getCid(), аналогично для LTE и GSM. Обратите внимание, что LTE имеет getCi вместо getCid. Также обратите внимание, что он недоступен для CDMA.

  4. Если вас интересуют MCC и MNC, вы можете получить его как cellInfoWcdma.getCellIdentity().getMccString() для уровня API >= 28, в противном случае используйте cellInfoWcdma.getCellIdentity().getMcc(). Обратите внимание, что вы не можете получить MCC и MNC для CDMA.

Вы можете создать свой собственный класс модели и сохранить все необходимые значения, создав их объекты (где я прокомментировал). Сохраните эти объекты в списке. Не забудьте добавить разрешения в манифест.

person Ananth    schedule 02.08.2019
comment
Очень интересный ответ, мне очень помог :) - person Silas; 10.12.2020