Skip to content

Releases: fildunsky/luci-app-5gmodem

v2.4.49

Choose a tag to compare

@fildunsky fildunsky released this 05 Sep 11:56

Отчёт диагностики теперь называет причину

Если карта встала в состояние illegal, отчёт молчал об этом: данные в нём были — и ошибка интерфейса SIM_ILLEGAL_STATE, и строки «SIM in illegal state» в журнале, — но истолкования не было. Разбор такого случая уходил в APN, тип PDP и «попробуйте другой протокол», то есть мимо.

Теперь раздел «Почему модем не подключается» объясняет механику: протокол qmi, увидев illegal, раз в ~8 секунд режет питание слота и пробует заново. Карте, которой на инициализацию нужны 1–2 минуты, он не даёт подняться никогда — петля кормит сама себя. Смена протокола (MBIM и прочие) этого не лечит; снимает illegal только перезагрузка модуля AT+CFUN=1,1, и после неё надо выждать пару минут, не поднимая интерфейс.

Заодно поясняется CFUN=0: чаще всего это след оборванного дозвона — сдавшись, протокол гасит радио при разборе сессии, — а не чей-то выбор.

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

Слоты SIM у Telit FN990

У FN990 (1bc7:1070) раздел «Слоты SIM» приходил пустым, а кнопок переключения не было: AT-команд выбора слота у Telit нет, а на QMI приложение для этого модема не переключалось. Кто переключил слот сторонней утилитой, не видел этого и не мог вернуть обратно. Теперь слоты читаются через QMI UIM — так же, как у LM960.

v2.4.48

Choose a tag to compare

@fildunsky fildunsky released this 05 Sep 10:42

Внешний IP роутера

Рядом с адресом, который выдал оператор, теперь можно показывать адрес, каким роутер виден интернету:

IPv4: 100.75.179.161 | 🇷🇺 212.233.85.162

За CGNAT и за туннелем эти адреса разные — по их различию сразу видно, идёт ли собственный трафик роутера через VPN. Флаг страны появляется, если сервис её отдаёт.

Важная тонкость: внешний адрес спрашивается через сам модем, а не по маршруту по умолчанию. Иначе в карточке модема оказался бы адрес того аплинка, через который сейчас идёт трафик, — а это совсем другой адрес.

Если оператор выдал белый IP и адреса совпали, показывается один. В «Простом виде» тоже остаётся один адрес — внешний.

В блоке «Приоритет интернета» внешний адрес можно показывать вместо адреса интерфейса; у каждой карточки он свой.

Настройки

Всё собрано в один блок «Внешний IP» в разделе «Для экспертов»: сервис для IPv4, сервис для IPv6, определение страны, User-Agent, интервал обновления и кнопка «Проверить» — она спрашивает сервисы прямо из полей, до сохранения, и печатает ответ строкой под собой.

По умолчанию функция выключена: это запрос к постороннему сервису, и какому именно — решает пользователь. Никаких «тихих запасных» сервисов нет, спрашивается ровно то, что задано.

Тест скорости больше не спрашивает сервис определения адреса отдельной настройкой — она общая. Прежние значения переезжают сами при обновлении.

Исправления

  • Тест скорости: при отмене в кэш уходил невалидный JSON, и карточка теряла результат вместе с адресом. Числа теперь нормализуются, а испорченный кэш чинится сам при первом чтении статуса.
  • Подпись «Юстировки» в настройках была русской прямо в коде — теперь она переводится как все остальные.

Переводы

Китайские каталоги (упрощённый и традиционный) дополнены 153 строками — не только новыми, но и накопившимися за прошлые релизы: SMS-команды, чёрный список устройств, eSIM, диапазоны, протоколы интерфейса. Русский каталог полон.

v2.4.47

Choose a tag to compare

@fildunsky fildunsky released this 05 Sep 06:50

Что нового

Агрегация несущих видна там, где раньше была одна полоса

На части модулей карточка показывала единственную несущую, хотя модем агрегировал две-три. Причина: вендорная команда AT^DEBUG? на такой прошивке печатает только первичную соту, а второй источник (QMI) недоступен, пока каналом владеет дозвон.

Теперь есть общий запасной путь — AT^CA_INFO?. Живой случай (issue #15, Foxconn T99W373): модем отвечает PCC LTE_B66, SCC1 LTE_B5 и NR5G_N77, а в таблице «Агрегация несущих» была одна строка. Стало — все три, с диапазоном и полосой каждой.

Несущую 5G в режиме NSA прошивка печатает такой же строкой «PCC info», как и LTE, — различаем их по имени диапазона, поэтому 5G-компонент больше не теряется.

Порядок источников не поменялся: где канал QMI свободен, данные по-прежнему берутся оттуда (там есть ещё PCI, EARFCN и уровень каждой несущей). AT^CA_INFO? — только подстраховка: спрашиваем её лишь когда вторичных несущих нет вовсе, не в 2G/3G, с выдержкой между запросами, а модем, который такой команды не знает, переспрашиваем не чаще раза в десять минут. Лишней нагрузки на AT-порт нет.

Мелочи

  • «EARFCN 0» из вендорной выдачи больше не выдаётся за номер канала: ноль означает «прошивка не заполнила», и настоящее значение из QMI его перебивает.

v2.4.46

Choose a tag to compare

@fildunsky fildunsky released this 05 Sep 03:44

Разбор живого случая: Telit FN990A28 на Huasifei WH3000 Pro не поднимал соединение, а в логе бесконечно крутилось «SIM in illegal state». Копали в модем — а половина беды оказалась в самой программе.

Диагностический отчёт больше не рвёт соединение

Самое неприятное из найденного: сбор отчёта о неполадках сам ронял дозвон. Раздел «QMI-дополнения» запускал служебного посредника (qmi-proxy), тот оставался жить после отчёта, а сторож соединения через минуту видел его как чужой процесс на канале, убивал — и вместе с ним обрывал дозвон.

Выглядело это так: человек снимает отчёт, чтобы разобраться, почему нет интернета, — и ровно через минуту интернет пропадает ещё раз. В логе это и было видно посекундно.

Канал в этот момент и так свободен, посредник там не нужен вовсе. Теперь читаем напрямую.

Сторож не будит модем с неисправной картой

Когда SIM уходит в отказ (состояние illegal), штатный дозвон OpenWrt зацикливается: раз в 8 секунд передёргивает питание карты и никогда не заканчивает. Снять это может только перезагрузка модуля — этим занимается наша лестница восстановления.

Но одна из веток сторожа поднимала интерфейс, не спрашивая о состоянии карты. Каждые две минуты она запускала петлю заново и обнуляла ошибку, за которую держится лестница. В итоге лестница не накапливала ни одной попытки и до перезагрузки модуля не доходила никогда — модем лежал часами.

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

Отчёт больше не врёт про формат кадров

Строка «РАССИНХРОН: приём отбрасывается молча» появлялась у каждого модема, который не подключился, и уводила разбор в сторону. На деле формат кадров выставляется в момент дозвона: пока дозвон не прошёл, сверять нечего. Теперь вердикт печатается только при поднятом интерфейсе, а иначе отчёт прямо говорит, почему проверка неприменима.

Настоящая улика — «ушло много, пришло ноль» — осталась и теперь сразу подсказывает вероятную причину.

Мелочи

  • Раздел «QMI-дополнения» заработал на MBIM-модемах: раньше он там просто молчал.

v2.4.45

Choose a tag to compare

@fildunsky fildunsky released this 04 Sep 12:58

2.4.45: модем находится всегда, команды роутера из Telegram, живые темы

Модем мог не находиться вовсе

Если ваш модуль не от «типового» производителя, приложение могло не увидеть его совсем: список модемов пуст, активный модем не выбирается, управления частотами нет, а страница «Сеть» перерисовывается без конца, будто кто-то жмёт F5.

Причина — в том, как устройство искалось в системе. Приложение проверяло, модем ли это, по драйверам и классам его интерфейсов, но искало эти интерфейсы не там: в одной раскладке системных файлов они лежат рядом с устройством, в другой — внутри него. Проверка работала только для первой, а перечислитель отдавал вторую. Итог: интерфейсов находилось ноль, и модем спасало только совпадение производителя с внутренним списком или ранее сохранённый профиль.

Живой пример — Dell DW5821e: модем подключён, интернет через него идёт, а в программе пусто. Исправлено.

Команды роутера из Telegram

Слова из списка «Команды по SMS» теперь работают и в чате с ботом — раньше он знал только свои /sms, /status и /modem, а «reboot» молча игнорировал. Защитный код и задержка те же, что и по SMS: ответ уходит ДО выполнения, иначе на перезагрузке вы не получили бы ничего. Если слово не команда — бот просто молчит.

Защитный код снова стирается

Очистить поле было невозможно: значение возвращалось после каждого сохранения, хотя подсказка обещает «пусто — кода нет».

Отчёт о неисправностях

Если устройство спрятано в чёрный список, отчёт теперь говорит об этом прямым текстом и подсказывает, где снять галочку. Раньше признак терялся среди сотни строк настроек, и люди присылали отчёт с собственным заблокированным модемом, не понимая, почему он «пропал».

Внешний вид

  • Смена темы больше не ломает картинку. При переключении светлая/тёмная фоновые значки на карточках на несколько секунд пропадали или держали прежние цвета. Тема теперь переспрашивается в момент переключения, а не запоминается один раз.
  • Фоновые значки снова цветные. Обесцвечивать их приходилось из-за одного значка, нарисованного белым; теперь особый случай обрабатывается отдельно, а остальные показываются как есть.
  • Размытие фона сильнее, прозрачность одинаковая у карточек аплинков, служб и пинга — раньше числа разъезжались.
  • Пункт настроек «Иконка интерфейса» переименован в «Иконки».
  • Галочки в теме Proton2025 выглядят как родные. Обход чужого бага применялся ко всем темам подряд и закрашивал здоровую галочку; теперь тема проверяется по факту.

v2.4.44

Choose a tag to compare

@fildunsky fildunsky released this 04 Sep 06:42

2.4.44: русский перевод доведён до конца

Что перевели

Часть интерфейса оставалась английской. Теперь переведено всё:

  • Настройки интерфейса модема (протокол qmiraw): устройство модема, тип PDP, тип аутентификации, PIN, APN и его номер профиля, APN для IPv6, переопределение MTU, таймаут инициализации, шлюз по умолчанию, метрика шлюза и использование DNS-серверов сети.
  • Настройки SMS: пояснения к объединению длинных сообщений и к сохранению копий.
  • Диапазоны: кнопка смены диапазонов и предупреждения о том, что связь ненадолго прервётся.
  • Страница модема: закрепление за сотой, RSCP, Ec/No, идентификаторы USB, пометка о несущей, работающей только на приём.
  • Кнопка сброса статистики, открытие панели SSClash, состояние служб, сообщение о неудачном чтении SMS.

Итого 35 строк. Заодно убраны два дублирующихся перевода.

Чтобы это не повторилось

В репозиторий добавлена проверка tools/check-i18n.py. Она находит строки, которые интерфейс переводит, но которых нет в каталоге, а также пустые переводы и дубликаты.

Она понадобилась потому, что сверка вручную дважды ошибалась: в каталоге кавычки экранированы, а в коде стоят обычные — и любая строка с кавычкой выглядела непереведённой, хотя перевод был. Похожая история с многоточием. Проверка приводит обе стороны к тому виду, в котором строка доходит до экрана, и смотрит весь интерфейс целиком, а не только основные страницы.

v2.4.43

Choose a tag to compare

@fildunsky fildunsky released this 04 Sep 06:21

2.4.43: чёрный список устройств, единый вид списков и фон карточек

Чёрный список устройств

Графа «Что считать модемом» в настройках была написана задом наперёд и путала: модем стоял в списке со снятой галочкой, а длинное пояснение противоречило само себе. Теперь это «Чёрный список устройств» — в нём только то, чего нет в нашей базе модемов, то есть устройства, в которых мы не уверены. Галочка прячет устройство из программы и срабатывает сразу, без кнопки «Применить».

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

Внешний вид

  • Все выпадающие списки в программе приведены к одному виду. В трёх местах список вообще не получал нужного класса и выглядел чужеродным.
  • Форма и всплывающее окно «Слежение за интернетом» собраны на стандартных элементах LuCI.
  • У галочек убран знак вопроса, а пояснение переехало на строку с самой галочкой — раньше оно стояло под ней и было непонятно, к чему относится.
  • Настройки применяются сразу: страница больше не перерисовывается целиком после выбора в списке или клика мимо него.
  • В теме Routy включённые галочки выглядели снятыми — обошли.

Фон карточек

Режим «Иконка интерфейса» теперь работает не только для приоритета интернета, но и для карточек служб и карточек пинга: значок уходит фоном за левый край. Настройка одна на всё. Светлая тема или тёмная — определяется по самой странице, а не по настройке операционной системы, поэтому светлая тема при тёмной системе больше не получает тёмные цвета. На новых установках режим включён по умолчанию.

Исправления

  • Чужой модем в списке. Опрос HiLink-стика идёт по сети десятки секунд, а «активный модем» перечитывался в самом конце — за это время он успевал смениться, и название с IMEI стика уезжали в профиль совершенно другого модема. В списке появлялся второй такой же модем. Теперь модем фиксируется на входе, а имя из веб-интерфейса стика может попасть только в профиль HiLink-модема.
  • Название модели записывается только с того порта, который принадлежит опрашиваемому модему. Для IMEI такая проверка была, для модели — нет.
  • Устройство, которое мелькнуло на шине и тут же пропало, больше не получает ни профиля, ни сетевого интерфейса.
  • В отчёте о неисправностях канал данных проверяется напрямую в системе: у модемов с RNDIS отчёт зря писал, что композиция сломана.
  • В отчёт добавлена лента отвалов USB — по ней сразу видно, предшествует ли каждому отвалу подвисший опрос модема или модуль отваливается сам по себе.
  • Убран мусор в системном логе при обращении к ещё не созданным временным файлам.

v2.4.42

Choose a tag to compare

@fildunsky fildunsky released this 02 Sep 12:28

Команды по SMS больше не выполняются из чужой переписки

Смена SIM отдаёт модему переписку новой карты за месяцы. Память «выполненного» у команд и «виденного» у бота была привязана к модему, а сообщения приезжают с картой — для обоих списков вся её переписка выглядела новой. На практике это значило: полугодовалое reboot с только что вставленной SIM выполнялось как свежая команда.

Четыре независимых слоя, каждый закрывает свой класс отказа:

  • Список выполненных команд привязан к ICCID карты. Идентификатор берётся из снимка метрик, без единого обращения к модему. Незнакомая карта = первая встреча: её переписка молча помечается обработанной, команды не выполняются. Если ICCID прочитать не удалось — откат на прежнюю привязку к модему, функция не отваливается.
  • Срок годности команды (cmd_max_age, сутки). Метку времени ставит SMSC, поэтому команда, застрявшая у оператора на трое суток, тоже не выполнится — обстановка за это время изменилась.
  • Кулдаун на повтор (cmd_cooldown, 5 минут). Десять копий reboot с разными метками времени давали по перезагрузке на копию: первая уводила роутер в ребут, остальные не успевали пометиться выполненными. Файл кулдауна лежит на флеше — в /tmp он исчезал бы вместе с самим /tmp.
  • sync сразу после пометки. При потере питания в момент выполнения запись иначе не доезжает до флеша, и после подъёма команда выполняется заново.

Бот не пересылает архив новой карты

Окно свежести tg_first_hours работало только при первой встрече с модемом. Теперь оно применяется всегда: сообщение старше окна молча помечается виденным и остаётся во «Входящих» и в архиве, а в журнал идёт строка с причиной. Тот же эффект давала карта из телефона и очищенная память модема.

Защитный код по умолчанию — secret

Пустое поле рядом со «словом в SMS» ничего не объясняло, их постоянно путали. Заполненное отвечает на вопрос само: команда выглядит как secret reboot, и роли обоих слов видны сразу. Подпись поля просит сменить код на свой. Код ставится только вместе с заготовками команд — тому, кто уже завёл свои и шлёт их без кода, внезапный код сломал бы всё работающее.

v2.4.41

Choose a tag to compare

@fildunsky fildunsky released this 02 Sep 11:18

SMS перестали заполнять память модема

Галочка «хранить сообщения в памяти роутера» стояла, а слоты не освобождались — три причины, и первая массовая:

  • Telegram держал слив вечно. Сообщение разрешалось удалить из модема только после подтверждения доставки ботом. Там, где Telegram недоступен без VPN, подтверждения нет никогда — не удалялось ни одно сообщение. Теперь ожидание с крайним сроком: час с момента попадания в архив, дальше слот освобождается. Сообщение не теряется — архив и есть источник правды, бот с командами читают его.
  • ModemManager. Считалось, что при MM удалять нечего. Но SMS приходят в то же хранилище (обычно на SIM), MM их оттуда не убирает — карта заполняется так же. Теперь чистим и там, при явно включённой галочке.
  • Неактивные модемы. Слив ходил только к активному; ящик второго модема забивался.

Появилась диагностика: smsbridge.sh archive-why печатает, что именно мешает освободить слоты; застрявшие сообщения раз в час уходят в журнал.

Модемом считается только модем

Раньше модем опознавался по факту наличия ttyUSB/cdc-wdm — вкладку, секцию в конфиге, место в приоритете интернета и опрос AT-командами получал любой переходник USB-UART, счётчик, плата или принтер.

Теперь решают признаки самого устройства: драйверы, привязанные ядром к интерфейсам, классы интерфейсов (MBIM, CDC ECM, NCM), вендор модуля и — страховкой — собственный профиль устройства с IMEI, чтобы проверка не спрятала работающий модем незнакомой модели. В настройках рядом с каждым устройством написано, почему оно считается тем, чем считается. Ручные списки в «Для экспертов» по-прежнему сильнее любой эвристики.

Команды по SMS

  • reboot больше не уводит роутер в петлю. Сообщение помечалось выполненным после запуска команды, а перезагрузка наступала раньше записи ключа — после загрузки та же SMS находилась снова. Теперь помечаем до запуска.
  • Две готовые команды из коробки: перезагрузка роутера и питание модема. Раздел больше не открывается пустой таблицей с одной кнопкой «+».
  • Защитный код — отдельная настройка: если задан, идёт первым словом сообщения (1234 reboot), без него роутер команду не выполнит. Раньше единственной защитой был список доверенных номеров, а номер отправителя подделывается.
  • Понятные подписи: «Слово в SMS» и «Что выполнить»; команда пишется ровно так, как в SSH.

Прочее

  • Карточка лечения подписывает ступени своей лестницы. На Wi-Fi-аплинке показывалось AT+CFUN=1,1 — команда, которая ему никогда не слалась (у Wi-Fi своя лестница: переподключение, REASSOCIATE, пересборка радио). Время попытки печатается с единицей измерения, а не голым числом секунд.
  • Скриптам в дереве выставлен бит исполнения — раскатка мимо пакета больше не оставляет их неисполняемыми.

v2.4.40

Choose a tag to compare

@fildunsky fildunsky released this 01 Sep 15:35

Переходник USB-UART больше не выглядит модемом

Модем в программе опознаётся по портам, и обычный переходник USB-UART, воткнутый в роутер для чужой железки, получал всё то же, что и настоящий модем: свою вкладку, место в «Приоритете интернета» и AT-команды в порт. Живой случай — WCH CH340 (1a86:7523).

Теперь известные мосты USB-UART (WCH, FTDI, Silicon Labs, Prolific) программа пропускает мимо: ни вкладки, ни опроса, ни строки в списках AT-порта.

Что считать модемом — решаете вы

В «Настройках», раздел «Для экспертов», появился список найденных USB-устройств с галочкой. Снятая галочка прячет устройство из программы; поставленная возвращает его в модемы — это нужно для отладочной платы, где сотовый модуль подключён к роутеру как раз через такой мост и других портов у него нет.

Настройка применяется сразу, перезагрузка не нужна.