Skip to content

Instantly share code, notes, and snippets.

@achmel
Last active April 3, 2023 18:15
Show Gist options
  • Save achmel/2d30ba321010aa25a911549f994deca8 to your computer and use it in GitHub Desktop.
Save achmel/2d30ba321010aa25a911549f994deca8 to your computer and use it in GitHub Desktop.
FAQ с выжимкой публичных источников про Huawei E3372h на маке/линуксе

The Ultimate Guide for Huawei E3372h

TL;DR

Что я сделал, чтобы подружить модем с антенной?

  1. Взял стоковый модем, запустил виртуалку 2015 года с WindowsXP (песочницу), там уже были дрова Huawei, но в Мобильном ассистенте общаться с модемом не удалось.
  2. Скачал c 4pda Pupdatewiz и подходящую прошивку.
  3. Запустил Pupdatewiz — вуаля!

После прошивки стало:

Device name:	E3372
Serial number:	G4################
IMEI:	###############
Hardware version:	CL2E3372HM
Software version:	22.333.01.00.00
Web UI version:	17.100.13.112.03 (17.100.13.01.03_Mod1.12)
LAN MAC address:	BA:AB:DE:AD:BE:EF
  1. Выключил винду, на маке использовал mode_switch и переключил модем на вечный debug mode.
  2. Снова загрузил винду, в ней стал доступен Терминал.exe.

Вот этими командами восстанавливается убитая в ходе прошивки имеюшка. Тут как повезет либо AT^CIMEI, либо AT^NVWREX. Первая команда, как я понял, не всегда доступна, для успешного использования в второй надо предварительно воспользоваться утилитой imei_converter и вместо нулей записать то что надо. Команда AT^INFORBU нужна имхо для применения долгосрочной записи в NVRAM.

AT^CIMEI="###############"
AT^NVWREX=0,0,16,08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
AT^INFORBU
AT^RESET

Код imei_converter.c приведен ниже:

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[]) {
    int i;
    const size_t imei_length = 15;

    if (argc == 2 && strlen(argv[1]) == imei_length)
    {
        for (i = 0; i < imei_length; i++)
        {
            printf("0%i ", argv[1][i] - '0');
        }

        printf("00");

        return 0;
    }
    else
    {
        printf("Usage: imei_converter imei\n");
        return -1;
    }
}
  1. На фоне модем плевался мне подобными сообщениями в терминал:
^RSSI:26
^HCSQ:"LTE",61,51,146,22
^RSSI:24
^HCSQ:"LTE",56,51,151,22
+CREG: 1,"#####","#########"

Последнее событие — событие IMSI Attach.

  1. Самая полезная команда — AT^LOCINFO?, она выдает сразу MCC, MCN, LAC, CID. C этими данными можно сразу смело идти на https://xinit.ru/bs/ и получать данные базовой станции.
AT^LOCINFO?
^LOCINFO:25001,0x#####,0xA,0x#######

0x#####h == #####d
0x#######h == #######d


curl --request GET 'https://xinit.ru/api/bs/250/01/#####/##########' \
-H 'referer: https://xinit.ru/bs/' \
-H 'accept-language: en-US,en;q=0.9'

{"average":{"lat":xx,"lon":yy},"yandex":{"lat":xx,"lon":yy},"google":null,"mylnikov":{"lat":xx,"lon":yy},"opencellid":null,"cell2gps":null}

curl 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode?outSR=4326&returnIntersection=true&location=30.00%2C60.00&f=json'
  1. Но под виндой сидеть было грустно. После перепрошивки на маке/линуксе можно сделать telnet 192.168.8.1 и засылать AT-команды в /dev/appvcom1 либо просто слушать cat < /dev/appvcom1

Первый способ — если не нужен интерактив

echo -e "AT^LOCINFO?\r" > /dev/appvcom1
echo -e "at^reset\r" > /dev/appvcom1

Второй способ — двухсторонний обмен с модемом, он не очень удобен, т.к. обычно происходит много событий.

telnet 192.168.8.1
busybox sh
cat < /dev/appvcom1 & cat | busybox tr "\n" "\r" > /dev/appvcom1

Наиболее удобная для меня система — слушать события в отдельном терминале, а в другом кидать команды:

telnet 192.168.8.1
busybox sh
cat < /dev/appvcom1

telnet 192.168.8.1
busybox sh
cat | busybox tr "\n" "\r" > /dev/appvcom1
  1. RSRP, SINR и все-все-все

RSRP – средний уровень сигнала принимаемого с базовой станции оператора. Измеряется по логарифмической шкале в дБм (dBm) и отображается в виде отрицательных значений. Чем значение ближе к нулю, тем выше уровень принимаемого сигнала. Например, значение сигнала RSRP равное -65 dBm, намного лучше, чем значение -97 dBm.

SINR - отношение уровня полезного сигнала к уровню шума (соотношение сигнал/шум). Измеряется в дБ (dB). Чем выше данное значение, тем лучше качество сигнала. При значениях SINR ниже 0 скорость подключения будет очень низкой, т.к. это означает, что в принимаемом сигнале шума больше, чем полезной части.

Считается, что параметр сигнал\шум (SINR) в ряде случаев может быть важнее, чем уровень сигнала. При SINR в интервале 15-20 (dB) модем выдаст все, на что способна данная БС, даже при посредственном, около -70...-80 dBm, уровне RSRP, если сама БС окажется не перегружена в момент тестирования.

Показатели качества принимаемого сигнала

Значения параметров RSSI SINR (Ec/Io)
Отличные -30...-50 dBm 30 dB и выше
Хорошие -50...-70 dBm от 20 dB до 30 dB
Удовлетворительные -70...-85 dBm от 10 dB до 20 dB
Плохие -85...-110 dBm менее 10 dB

Основная часть (выборочная копипаста)

1. Предварительная подготовка

Есть две разновидности прошивок: Stick и HiLink. С прошивкой Stick модем будет видеться AT-модемом, для подключения к интернету нужно «дозваниваться». С HiLink-прошивкой модем представляется сетевой картой Ethernet, и не требует настроек в ОС.

По умолчанию, модем находится в режиме HiLink, такой типа роутер, с красивым веб-интерфейсом.

$ lsusb | grep Huawei
Bus 001 Device 010: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard 
# Здесь 12d1 это идентификатор производителя а 1506 это режим сетевой карты.
# Если не 1506, то надо переключить.
sudo minicom -D /dev/ttyUSB0
AT^NVWREX=50502,0,128,8F 29 FF 8E A8 CA 34 89 78 73 18 BA 9E F5 9C 64 0B A4 DB 81 DC 03 45 6E 72 DA EC 6A 0C 7C 90 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8B 8C F4 B5 AF 0C F2 2C FE E0 F4 46 9C CF 47 95 36 71 1F 1C BF 05 7F 84 AB A9 F2 92 89 33 3C 12 01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
AT^DATALOCK="00000000"
AT^CIMEI="#############"

2. Balong Flash / Прошивка под mac, linux, windows

Для прошивки под Linux используется утилита balong_flash.

В отличие от Linux, нa Macintosh адрес, скорее всего, будет не /dev/ttyUSB0, а /dev/tty.HUAWEIMobile-Diag.

Достоверно узнать адрес устройства можно с помощью команды ls /dev | grep HUA.

$ ./balong_flash -h

 Утилита предназначена для прошивки модемов на чипсете Balong V7

./balong_flash [ключи] <имя файла для загрузки или имя каталога с файлами>

 Допустимы следующие ключи:

-p <tty> - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0)
-n       - режим мультифайловой прошивки из указанного каталога
-g#      - установка режима цифровой подписи (-gl - описание параметров)
-m       - вывести карту файла прошивки и завершить работу
-e       - разобрать файл прошивки на разделы без заголовков
-s       - разобрать файл прошивки на разделы с заголовками
-k       - не перезагружать модем по окончании прошивки
-r       - принудительно перезагрузить модем без прошивки разделов
-f       - прошить даже при наличии ошибок CRC в исходном файле

3. Pupdatewiz Flash / Прошивка под windows

Распаковать архив, поместить нужную прошивку (.exe или .bin) в папку с командным файлом go.cmd и запустить его.

4. Полезные и интересные АТ-команды и настройка конфигурации модема

https://4pda.ru/forum/index.php?showtopic=582284&view=findpost&p=41114446

NVRAM

В модеме имеется хранилище различной конфигурационной информации - NVRAM. Оно организовано в виде набора записей переменной длины. Каждая запись имеет номер - от 0 до 65535, но не все номера записей физически присутствуют в модеме. Чтобы узнать длину конкретной записи, используется команда:

at^nvrdlen=<item>

<item> - номер записи. В ответ модем выдает ее длину:

at^nvrdlen=8268 
^NVRDLEN: 12

Посмотреть содержимое конкретной записи можно командой:

at^nvrdex=<item>,<offset>,<len>

<offset> - смещение от начала записи до интересующего нас фрагмента (0 - с начала) <len> - длина выводимого фрагмента, должна быть не больше полной длины записи минус смещение.

Пример:

at^nvrdex=8268,0,12
^NVRD: 8268,0,12,01 00 00 00 01 00 00 00 0A 00 00 00

Поиск базовых станций сотовой связи

Данный модем обладает уникальным свойством - он умеет делать поиск всех окружающих базовых станций (БС). Причем не только БС оператора вставленной в него симкарты, а вообще все БС всех операторов, сигнал от которых достигает антенны модема. Для каждой найденной БС выводится ее CID и уровень принимаемого от нее сигнала. Это позволяет выбрать оператора с наивысшим уровнем сигнала, а также выбрать конкретную БС для наведения на нее внешней антенны. Единственный недостаток данного модема - он умеет искать только БС 2G и 3G. LTE-соты искать он не умееет.

Если в округе имеется сигнал LTE, то следует перевести модем в режим 2G3G командой AT^SYSCFGEX="0201",3FFFFFFF,1,2,800C5,, или в настройках веб-интерфейса. Также обратите внимание, что эту команду можно ввдить только через порт управления (PCUI). Если ее ввести через порт, предназначенный для установки РРР-соединения (modem), то команда будет выдавать пустой ответ (просто ОК и все). Формат команды: AT^NETSCAN=num,level,mode num - число находимых БС, от 1 до 20. Если будет найдено больше num БС, то станции с самым слабым сигналом будут исключены из списка level - минимальный уровень сигнала БС, включаемых в список. Задается в дБ, от -110 (самый низкий уровень) до -47 (самый высокий уровень). Станции с уровнем сигнала меньше level в список включаться не будут. mode - тип БС. 0 -поиск 2G-станций, 1 - поиск 3G-станций.

Пример команды:

at^netscan=20,-108,1
^NETSCAN: 10638,,,1e7e,250,02,0,-78,8b77,400000
^NETSCAN: 10687,,,1e7e,250,02,0,-79,d5c8,400000
^NETSCAN: 10662,,,1e7e,250,02,0,-82,8ade,400000
^NETSCAN: 10587,,,4cf8,250,20,0,-105,d4fc,400000
^NETSCAN: 10563,,,4cf8,250,20,0,-106,d4f9,400000

В этом примере заказывается поиск 3G БС с уровнем сигнала не ниже -108 дБ. Результат выдается в виде списка, отсортированного по уровню сигнала. Самая верхняя БС - самая мощная, нижняя - самая слабая. Формат элемента списка:

^NETSCAN: 10638,,,1e7e,250,02,0,-78,8b77,400000
1e7e - LAC станции
250 - MCC (Россия)
02 - MNC (В данном случае - МТС).
0 - хотел бы я сам знать что это, из дизассемблированного кода я так и не понял смысла этого поля.
-78 - уровень сигнала данной БС
8b77 - CID станции
400000 - диапазнон, в котором принимается сигнал БС (как в команде ^syscfgex).

По результатам данного примера можно сделать вывод, что самый сильный сигнал в данной местности - у МТС, а антенну надо направлять на БС с CID=8b77 LAC=1e7e. Координату БС можно посмотреть на сайте xinit.ru.

Прочие полезные команды из https://github.com/pixelspark/tymodem

  • AT+COPS - информация о текущем операторе Recieve: +COPS: (1,"MTS-RUS","MTS","25001",0),(2,"MTS-RUS","MTS","25001",2),,(0,1,2,3,4),(0,1,2)
  • AT^PLMN? - Query the connected network code (MNC/MCC).
  • AT^LOCINFO? - Query network location info.
  • AT^CREG?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment