Releases: fildunsky/luci-app-5gmodem
Release list
v2.4.49
Отчёт диагностики теперь называет причину
Если карта встала в состояние 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
Внешний 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
Что нового
Агрегация несущих видна там, где раньше была одна полоса
На части модулей карточка показывала единственную несущую, хотя модем агрегировал две-три. Причина: вендорная команда 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
Разбор живого случая: Telit FN990A28 на Huasifei WH3000 Pro не поднимал соединение, а в логе бесконечно крутилось «SIM in illegal state». Копали в модем — а половина беды оказалась в самой программе.
Диагностический отчёт больше не рвёт соединение
Самое неприятное из найденного: сбор отчёта о неполадках сам ронял дозвон. Раздел «QMI-дополнения» запускал служебного посредника (qmi-proxy), тот оставался жить после отчёта, а сторож соединения через минуту видел его как чужой процесс на канале, убивал — и вместе с ним обрывал дозвон.
Выглядело это так: человек снимает отчёт, чтобы разобраться, почему нет интернета, — и ровно через минуту интернет пропадает ещё раз. В логе это и было видно посекундно.
Канал в этот момент и так свободен, посредник там не нужен вовсе. Теперь читаем напрямую.
Сторож не будит модем с неисправной картой
Когда SIM уходит в отказ (состояние illegal), штатный дозвон OpenWrt зацикливается: раз в 8 секунд передёргивает питание карты и никогда не заканчивает. Снять это может только перезагрузка модуля — этим занимается наша лестница восстановления.
Но одна из веток сторожа поднимала интерфейс, не спрашивая о состоянии карты. Каждые две минуты она запускала петлю заново и обнуляла ошибку, за которую держится лестница. В итоге лестница не накапливала ни одной попытки и до перезагрузки модуля не доходила никогда — модем лежал часами.
Проверка состояния карты была у соседней ветки сторожа; теперь она общая, и обе ветки ходят через неё. Лишнего посредника по-прежнему убираем сразу — он мешает и дозвону, и восстановлению, — а вот интерфейс поднимаем только при живой карте.
Отчёт больше не врёт про формат кадров
Строка «РАССИНХРОН: приём отбрасывается молча» появлялась у каждого модема, который не подключился, и уводила разбор в сторону. На деле формат кадров выставляется в момент дозвона: пока дозвон не прошёл, сверять нечего. Теперь вердикт печатается только при поднятом интерфейсе, а иначе отчёт прямо говорит, почему проверка неприменима.
Настоящая улика — «ушло много, пришло ноль» — осталась и теперь сразу подсказывает вероятную причину.
Мелочи
- Раздел «QMI-дополнения» заработал на MBIM-модемах: раньше он там просто молчал.
v2.4.45
2.4.45: модем находится всегда, команды роутера из Telegram, живые темы
Модем мог не находиться вовсе
Если ваш модуль не от «типового» производителя, приложение могло не увидеть его совсем: список модемов пуст, активный модем не выбирается, управления частотами нет, а страница «Сеть» перерисовывается без конца, будто кто-то жмёт F5.
Причина — в том, как устройство искалось в системе. Приложение проверяло, модем ли это, по драйверам и классам его интерфейсов, но искало эти интерфейсы не там: в одной раскладке системных файлов они лежат рядом с устройством, в другой — внутри него. Проверка работала только для первой, а перечислитель отдавал вторую. Итог: интерфейсов находилось ноль, и модем спасало только совпадение производителя с внутренним списком или ранее сохранённый профиль.
Живой пример — Dell DW5821e: модем подключён, интернет через него идёт, а в программе пусто. Исправлено.
Команды роутера из Telegram
Слова из списка «Команды по SMS» теперь работают и в чате с ботом — раньше он знал только свои /sms, /status и /modem, а «reboot» молча игнорировал. Защитный код и задержка те же, что и по SMS: ответ уходит ДО выполнения, иначе на перезагрузке вы не получили бы ничего. Если слово не команда — бот просто молчит.
Защитный код снова стирается
Очистить поле было невозможно: значение возвращалось после каждого сохранения, хотя подсказка обещает «пусто — кода нет».
Отчёт о неисправностях
Если устройство спрятано в чёрный список, отчёт теперь говорит об этом прямым текстом и подсказывает, где снять галочку. Раньше признак терялся среди сотни строк настроек, и люди присылали отчёт с собственным заблокированным модемом, не понимая, почему он «пропал».
Внешний вид
- Смена темы больше не ломает картинку. При переключении светлая/тёмная фоновые значки на карточках на несколько секунд пропадали или держали прежние цвета. Тема теперь переспрашивается в момент переключения, а не запоминается один раз.
- Фоновые значки снова цветные. Обесцвечивать их приходилось из-за одного значка, нарисованного белым; теперь особый случай обрабатывается отдельно, а остальные показываются как есть.
- Размытие фона сильнее, прозрачность одинаковая у карточек аплинков, служб и пинга — раньше числа разъезжались.
- Пункт настроек «Иконка интерфейса» переименован в «Иконки».
- Галочки в теме Proton2025 выглядят как родные. Обход чужого бага применялся ко всем темам подряд и закрашивал здоровую галочку; теперь тема проверяется по факту.
v2.4.44
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
2.4.43: чёрный список устройств, единый вид списков и фон карточек
Чёрный список устройств
Графа «Что считать модемом» в настройках была написана задом наперёд и путала: модем стоял в списке со снятой галочкой, а длинное пояснение противоречило само себе. Теперь это «Чёрный список устройств» — в нём только то, чего нет в нашей базе модемов, то есть устройства, в которых мы не уверены. Галочка прячет устройство из программы и срабатывает сразу, без кнопки «Применить».
Заодно починена ошибка, из-за которой список исключений мог не читаться вовсе.
Внешний вид
- Все выпадающие списки в программе приведены к одному виду. В трёх местах список вообще не получал нужного класса и выглядел чужеродным.
- Форма и всплывающее окно «Слежение за интернетом» собраны на стандартных элементах LuCI.
- У галочек убран знак вопроса, а пояснение переехало на строку с самой галочкой — раньше оно стояло под ней и было непонятно, к чему относится.
- Настройки применяются сразу: страница больше не перерисовывается целиком после выбора в списке или клика мимо него.
- В теме Routy включённые галочки выглядели снятыми — обошли.
Фон карточек
Режим «Иконка интерфейса» теперь работает не только для приоритета интернета, но и для карточек служб и карточек пинга: значок уходит фоном за левый край. Настройка одна на всё. Светлая тема или тёмная — определяется по самой странице, а не по настройке операционной системы, поэтому светлая тема при тёмной системе больше не получает тёмные цвета. На новых установках режим включён по умолчанию.
Исправления
- Чужой модем в списке. Опрос HiLink-стика идёт по сети десятки секунд, а «активный модем» перечитывался в самом конце — за это время он успевал смениться, и название с IMEI стика уезжали в профиль совершенно другого модема. В списке появлялся второй такой же модем. Теперь модем фиксируется на входе, а имя из веб-интерфейса стика может попасть только в профиль HiLink-модема.
- Название модели записывается только с того порта, который принадлежит опрашиваемому модему. Для IMEI такая проверка была, для модели — нет.
- Устройство, которое мелькнуло на шине и тут же пропало, больше не получает ни профиля, ни сетевого интерфейса.
- В отчёте о неисправностях канал данных проверяется напрямую в системе: у модемов с RNDIS отчёт зря писал, что композиция сломана.
- В отчёт добавлена лента отвалов USB — по ней сразу видно, предшествует ли каждому отвалу подвисший опрос модема или модуль отваливается сам по себе.
- Убран мусор в системном логе при обращении к ещё не созданным временным файлам.
v2.4.42
Команды по 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
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
Переходник USB-UART больше не выглядит модемом
Модем в программе опознаётся по портам, и обычный переходник USB-UART, воткнутый в роутер для чужой железки, получал всё то же, что и настоящий модем: свою вкладку, место в «Приоритете интернета» и AT-команды в порт. Живой случай — WCH CH340 (1a86:7523).
Теперь известные мосты USB-UART (WCH, FTDI, Silicon Labs, Prolific) программа пропускает мимо: ни вкладки, ни опроса, ни строки в списках AT-порта.
Что считать модемом — решаете вы
В «Настройках», раздел «Для экспертов», появился список найденных USB-устройств с галочкой. Снятая галочка прячет устройство из программы; поставленная возвращает его в модемы — это нужно для отладочной платы, где сотовый модуль подключён к роутеру как раз через такой мост и других портов у него нет.
Настройка применяется сразу, перезагрузка не нужна.