Модем Huawei E3272 (Мегафон M100-4, МТС 824F, 824FT, Билайн E3272 HiLink) — всё что хотелось и не хотелось знать

в 1:52, , рубрики: E3272, E3276, freebsd, LTE, операционные системы

В основном про модем и про работу в разных ОС с интимными подробностями.
Режимы работы: HiLink, NCM (NDIS), modem (RAS).
Что и зачем нужно крутить в Windows и FreeBSD для того чтобы завёлся.
E3276 — тоже касается, железо аналогичное, прошивки совместимы.

image


E3272 модемом можно назвать с натяжкой — понимает AT команды с некоторыми прошивками, начинка там вполне роутерная.
Ещё и MicroSD кардридер в подарок.

Кладовая знаний по этому модему тут: 4pda.ru/forum/index.php?showtopic=508842&st=3440
В первой части много ссылок на 4PDA потому что там расписано всё в подробностях, а упомянуть об этом важно прежде чем переходить к тому что я накопал.

Режимы работы

HiLink — прошивка 22.*, так же шьётся отдельно веб интерфейс. Модем определяется как сетевой адаптер подключённый к сети, в которой есть роутер с NAT, DHCP сервер и Web сервер — это всё модем. Модем сам подключается, сам раздаёт адреса и сам NAT-ит.
В веб интерфейсе можно смотреть уровень сигнала, читать SMS и отправлять USSD запросы. (не во всех веб интерфейсах это доступно)
Минусы: если брать «белый» IP адрес то в этом режиме входящие подключения так же не будут работать; возможно что модему не хватит ресурсов для того чтобы задействовать доступную пропускную способность.

Modem — прошивка 21.*, (он же RAS) модем внутри себя эмулирует PPP сервер на COM порте. Нужно по «старинке» создавать подключение и «дозваниваться».
В таком режиме у меня наблюдались флуктуации пинга: 25+-4 мс. И в этом режиме у меня нагрузка на систему при замерах скорости была выше.
Уровень сигнала и прочее доступно через AT команды.

NCM — прошивка 21.*, модем виден в системе как сетевой интерфейс и COM порт для управления.
Ещё этот режим называют NDIS, тк модем эмулирует стандартный сетевой адаптер, драйвера на который есть во многих ОС из коробки.
Это наиболее интересный, на мой взгляд, режим работы модема.
Можно получить «белый» IP адрес прямо на сетевой интерфейс системы по DHCP, пинги не прыгают как в режиме модема, нагрузки на систему не заметно.
В винде в этом режиме он работает практически как WiFi: в списке доступных сетей показывает сеть оператора, один щелчок, вводим APN и инет работает.

Разблокировка

см шапку топика: 4pda.ru/forum/index.php?showtopic=508842&st=3440
всё делаем в точности, у меня получилось.
Код вводил командой: AT^CARDLOCK=«666666» (цифры у каждого свои).

Прошивки

Мегафоновской оригинальной прошивки нет в инете в свободном доступе, но есть близкие по номеру версии от других операторов.
Прошивки на 22.* — это HiLink режим работы, к ней в комплект нужен WebUI (веб интерфейс).
Прошивки на 21.* — это Modem+NCM режими работы, к ней в комплект можно шить (но не обязательно) Dashboard (образ компакт диска для виртуального CD-ROM).
Перешиваться 21<->22 нужно строго по инструкции из шапки.
Драйвера ставить нужно по одному разу для 21 и 22 прошивок, потом это не требуется, тк венда их сохраняет и ставит автоматом.

Прошивки есть для разных моделей: 153, 210, 927 и тп. Разные модели работают на разных частотах/каналах

Hint: Если прошить мегафоновский модем прошивкой от МТС светодиод начнёт светится красным вместо зелёного, вероятно есть и какие то другие последствия, поскольку мегафон модель 153 а мтс 210.

Большая коллекция прошивок:
unlock4modem.in/download-huawei-e3272-modem-firmware-software-update-free/
и
3ginfo.ru/download58.html

Восстановление работоспособности

Опять же отсылаю на 4pda, метод «иголки», ссылка в шапке.
Я замыкал контакт пока модем не отдавал в систему свои COM порты и дальше шил обычную прошивку.
Некоторые говорят что такое для них не срабатывает а вот флешер от хуавея помогает.
Мне приходилось его восстанавливать 2-3 раза после AT^SETPORT с неправильной последовательностью, об этом ниже.

Как это работает

Windows

Тут всё просто и без подробностей.

Сценарий 1: плывём по течению

Вставили модем, подождали пока он прогрузится, система увидела CD-ROM, можно поставить от туда софт оператора, при его установке дрова поставятся автоматом.

Сценарий 2: плывём правильно

Скачиваем дрова из инета (да, без инета их скачать не получится, а без дров туда не попасть :) ), хотя бы из шапки в 4PDA и поставим их самостоятельно.
После установки модем увидит новые устройства. (скорее всего модем, сетевой адаптер, COM порт и кардридер)
Если служба: «Автонастройка WWAN» запущена, то щёлкаем по значку с сетями, там будет «Подключение через адаптер широкополосной мобильной связи» а под ним название нашего ОПСОСа и уровень сигнала, по виду всё как с WiFi.
image
Щёлкаем подключится, оно спросит APN (для мегафона: internet), имя пользователя и пароль (для мегафона можно пустые), и всё, инет есть.
Софт от ОПСОСа смысла ставить не вижу, всё делается средствами системы и через сайт ОПСОСа.
Hint: В целях безопасности, настоятельно рекомендую зайти в свойства адаптера: «Подключение через адаптер широкополосной мобильной связи» и снять галочки с клиента и службы доступа к файлам.
image

Сценарий HiLink

Ближе ко второму случаю, максимум поставить дрова, остальное сделается автоматом.
HiLink прошивку я поставил, посмотрел и снёс, подробностей не помню.

Увы

Как только я увидел 192.168.1.1 в качестве шлюза по умолчанию и DNS сервера, зашёл и узрел веб интерфейс с минимум инфы и настроек, мне вспомнился мой первый ADLS модем DSL-300T, примерно такого же содержания, который держал максимум 100 соединений через себя в режиме «роутера». И хотя прошло 8 лет, железо уже совсем другое, но ассоциации с ограниченным функционалом никуда не делись.
EDGE, 3G, LTE

Текущий режим смотреть в конект манагере или через терминал послать команду:
AT^SYSINFOEX
^SYSINFOEX:1,0,1,255,,3,«WCDMA»,41,«WCDMA»

Настроить что использовать — аналогично, + см топик 4PDA.

USSD

В терминале набрать (через порт модема точно работает):
AT^USSDMODE=0
AT+CUSD=1,"*100#",15
В ответ придёт пачка кодов, видимо сообщение в юникоде.
Вероятно есть какой то софт, который умеет делать тоже самое по нажатию кнопки.

Как это работает на самом деле

Дальше хардкор, на основе собственных опытов.

Конфигурация модема

Команда: AT^SETPORT=? покажет как сконфигурирован модем.
Отправлять в COM порт для управления или в то что винда/линукс/фря называет модемом.
Отправить можно взяв софт из шапки в 4PDA или Putty или cu -l /dev/cuaU0.1 (~. — выход из терминалки) во FreeBSD.

В ответ можно получить какой то из вариантов:
AT^SETPORT=«A1,A2;10,12,16,A1,A2»
AT^SETPORT=«A1;10,12,16,A1,A2»
AT^SETPORT=«FF;10,12,16,A1,A2»
AT^SETPORT=«FF;61,62,76,A1,A2»

Для того чтобы узнать какой код что означает служит команда: AT^SETPORT=?

Модель 153

AT^SETPORT=?
^SETPORT:1: 3G MODEM
^SETPORT:2: 3G PCUI
^SETPORT:3: 3G DIAG
^SETPORT:5: 3G GPS
^SETPORT:A: BLUE TOOTH
^SETPORT:16: NCM
^SETPORT:A1: CDROM
^SETPORT:A2: SD
^SETPORT:10: 4G MODEM
^SETPORT:12: 4G PCUI
^SETPORT:13: 4G DIAG
^SETPORT:14: 4G GPS

Модель 153 - GPS

Я тоже было раскатал губу, но это, похоже, не распаяно физически или вообще от софта сходного чипа, тем более в прошивке от модели 210 GPS вообще не упоминается.
Модель 210

AT^SETPORT=?
^SETPORT:1: 3G MODEM
^SETPORT:2: 3G PCUI
^SETPORT:7C: SerialC
^SETPORT:78: Shell A
^SETPORT:79: Shell B
^SETPORT:76: NCM
^SETPORT:A1: CDROM
^SETPORT:A2: SD
^SETPORT:61: 4G MODEM
^SETPORT:62: 4G PCUI
^SETPORT:7B: SerialB
^SETPORT:7A: SerialA

но это не «железно», те возможно данные коды к модели и не привязаны, просто на тех прошивках что я пробовал было вот так.
Как минимум есть модели/прошивки где: ^SETPORT:46: NCM (код из дров линуха)

Итак,
AT^SETPORT="A1,A2;10,12,16,A1,A2"
AT^SETPORT="A1;10,12,16,A1,A2"
AT^SETPORT="FF;10,12,16,A1,A2"
Первый — два кода (до точки с запятой) описывают какие устройства будут видны системе до того как драйвер отправит код переключения режима, все оставшиеся коды это устройства которые доступны в рабочем режиме.
FF — означает что модем сразу переходит в рабочий режим.
A1, A2 — у меня сводился к A1 — только CD-ROM.

Пример: AT^SETPORT=«A1;10,12,16,A1,A2» — в системе появляется CD-ROM с Dashboard, если это первый раз, то юзер ставит от туда дрова, дрова отправляют спец код и в системе появляется всё остальное.
Время переключения конфигурации — примерно 2 секунды.

Пример: AT^SETPORT=«FF;10,12,16,A1,A2» — в системе сразу появляется куча устройств, юзер/система сам ищет и ставит дрова.

ВАЖНО!!!
Если мы меняем конфигурацию модема, то команда AT^SETPORT="...;...." должна содержать коды в порядке возрастания!
Иначе модем не сможет инициализироваться и придётся его восстанавливать.

С точки зрения ОС

idProduct — это PID устройства, так драйвер отличает разные устройства одного производителя.
VID — идентификатор производителя одинаковый, 0x12d1 — для хуавея.

Для начальной конфигурации A1:
idProduct = 0x14fe — с родной прошивкой меги (21.*, модель 153 скорее всего для всех них)
idProduct = 0x155b — с прошивкой МТС (21.*, модель 210)
При этом система видит только один CD-ROM. Если прошит дашборд то его можно примонтировать и там будут файлы.

Переключение режима

Для продолжения работы вставьте 5 долларов в дисковод А требуется отправить в модем специальный код.
Это не только хуавей такой, многие модемы так же работают.

В венде код отправляет драйвер, заботливо написанный хуавеем.
В Linux пользуются программой usb_modeswitch (насчёт драйверов которые это умеют я ничего не знаю).
Во FreeBSD можно воспользоваться usb_modeswitch либо это в может сделать драйвер u3g (если его заботливо пропатчить, см ниже).
Пример: usb_modeswitch -v 0x12d1 -V 0x12d1 -p 0x14fe -P 0x14fe -M 55534243123456780000000000000011060000000000000000000000000000

Коды переключение режима

В интернете нашлось три разных кода:
1. 55534243123456780000000000000011060000000000000000000000000000
2. 55534243123456780000000000000011062000000100000000000000000000
3. 55534243123456780000000000000011062000000101000100000000000000
(555342431234567800000000000000 — это коды обёртка для SCSI, насколько я понял, в u3g оно генерируется на лету и код в исходнике начинается с 0x11, 0x06).

Различия поведения с разными кодами

Код 1: 11060000000000000000000000000000
Похоже старый код инициализации.
На данный момент именно он прописан в u3g драйвере FreeBSD.

Прошивка 153-21.470.05.00.00 (вроде как самая свежая) вообще не принимает этот код и похоже зависает!

Остальные (210-21.436.11.00.143_Russia+MTS, 153-21.436.05.00.56_Tele2_Estonia, 153-21.436.05.00.1134_Baltic_OM (как и родная от меги)) принимают и выставляют PID
idProduct = 0x1c1e

при этом все устройства идут со стандартными идентификаторами, универсальными для всех производителей

usbconfig dump_all_config_desc

Interface 0

bInterfaceClass = 0x0002
bInterfaceSubClass = 0x0002
bInterfaceProtocol = 0x00ff
...

Эти идентификаторы известны как стандартные и подхватываются стандартные дрова типа if_cdce во FreeBSD или аналогичный в линухе, для COM порта и модема аналогично.

Ещё к побочным эффектам можно отнести что команда: AT^SETPORT=? на прошивке: 210-21.436.11.00.143_Russia+MTS выдаёт вот такую ошибочную конфигурацию:
AT^SETPORT:A1,A2;7C,A1,62,76,A2,79
хотя должна
AT^SETPORT:A1,A2;61,62,76,A1,A2
и под вендой она выдаёт правильно, что намекает что в венде данный код инициализации не используется.
Больше похоже на то, что этот код использовался раньше, и ещё некоторое время работал (до 153-21.470.05.00.00 или раньше), но потом хуавей отказалась от него, возможно из за каких то проблем с универсальными драйверами или ещё каких то причин.

Код 2: 11062000000100000000000000000000
Код 3: 11062000000101000100000000000000
Режим FF (это который через SETPORT настраивается)
Код 3 — похоже самый «новый», его я достал из самого свежего usb_modeswitch, а уж откуда они его взяли я не интересовался :)

PID получается:
idProduct = 0x1506

А вот устройства уже

usbconfig dump_all_config_desc

Interface 0

bInterfaceClass = 0x00ff
bInterfaceSubClass = 0x0002
bInterfaceProtocol = 0x0061
...

где, bInterfaceProtocol — содержит номер устройства из строки инициализации (см AT^SETPORT=?).
bInterfaceClass = 0x00ff — означает специфичные для вендора значения, а не стандартные как было в предыдущем случае — те нужен специальный драйвер.
В линухе только недавно сделали отдельный драйвер: huawei_cdc_ncm.
Во FreeBSD…

FreeBSD

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

Можно накатить патч: bz-attachments.freebsd.org/attachment.cgi?id=145319
Здесь обсуждение: bugs.freebsd.org/bugzilla/show_bug.cgi?id=192345
А здесь видно что он и где меняет: bugs.freebsd.org/bugzilla/attachment.cgi?id=145319&action=diff

if_cdce.c: просто добавляем идентификаторы NCM устройств от хуавея

u3g.c: выкидываем кусок неиспользуемых констант, добавляем идентификаторы E3272 в список известных, макрос U3G_HUAWEI_IS_CDC чтобы не приставать к NCM устройствам от хуавея в этом драйвере, и два места в которых эта проверка выполняется, и ещё по мелочи.

umodem.c: добавляем идентификаторы специфичные для хуавея, хотя по сути его можно не патчить, u3g делает всё вместо него.

usb_msctest.c: заменяем старый код переключения режима на новый и улучшаем обработку ошибок.

usbdevs: идентификаторы новых устройств.

Увы, но самое важное: замена кода инициализации на новый и макрос U3G_HUAWEI_IS_CDC добавлять не хотят и приходится тратить кучу времени на объяснение что в линуксе это уже сделали и без этого новые модемы хуавей работать не будут.
Притом это касается не только E3272 но и как минимум E3276 и скорее всего других моделей.

Использование под FreeBSD

NCM режим

Это для модемов со старой прошивкой, типа мегафоновской оригинальной либо после применения патча.
Для МТС не сработает без патча.
Модем эмулирует ethernet адаптер и DHCP сервер.

kldload u3g
kldload if_cdce
подключить модем
echo 'AT^NDISDUP=1,1,«internet»' > /dev/cuaU0.1
dhclient ue0
/dev/cuaU0.1 — управляющий порт NCM.

Modem режим

Это не оптимальный режим, поскольку модем эмулирует PPP сервер, а ОС занимается инкапсуляцией/декапсуляцией пакетов в/из PPP, всё это накладные расходы.

Устанавливаем mpd5 из портов, конфигурим и запускаем:
cd /usr/ports/net/mpd5
make install
make clean
cp /usr/local/etc/mpd5/mpd.script.sample /usr/local/etc/mpd5/mpd.script

Создаём такой файл:

/usr/local/etc/mpd5/mpd.conf

### MPD configuration file
###


startup:
	###set user foo bar admin
	###set user foo1 bar1

	###set console self 127.0.0.1 5005
	set console close
	#set console enable logging

	###set web self 0.0.0.0 5006
	set web close
	#set web enable auth

	set global disable one-shot tcp-wrapper

	log +auth -bund -ccp -chat +console -echo -ecp -frame -fsm -iface +ipcp -ipv6cp -lcp -link -phys -radius -rep
	#log +auth +bund +ccp +chat +console +echo +ecp +frame +fsm +iface +ipcp +ipv6cp +lcp +link +phys +radius +rep


default:
	load modem_client1


modem_client1:
	create bundle static BndModemCli1
	set bundle links L1
	set iface addrs 1.1.1.1 2.2.2.2
	set iface route default
	set iface mtu 1500
	set iface idle 0
	set iface session 0
	set iface enable tcpmssfix
	set iface disable on-demand proxy-arp tee nat netflow-in netflow-out netflow-once
	set ipcp ranges 0.0.0.0/0 1.1.1.1/0
	set ipcp enable req-pri-dns req-sec-dns
	set ipcp no vjcomp req-pri-nbns req-sec-nbns
	create link static L1 modem
	set modem device /dev/cuaU0.0
	#set modem speed 921600
        set modem watch -cd
        set modem watch -dsr
	set modem var $DialPrefix "D"
	set modem var $Telephone "*99#"
	set modem var $InitString "+CGDCONT=1,"IP","internet""
	set modem script DialPeer
	set modem idle-script Ringback
	set link action bundle BndModemCli1
	#set link mtu 1492
	#set link mru 1492
	set link fsm-timeout 2
	set link keep-alive 4 40
	set link max-redial 0
	set link redial-delay 8
	set link accept pap chap-md5 chap-msv2
	set link enable acfcomp protocomp magicnum check-magic
	set link no chap-msv1 eap incoming multilink shortseq passive callback no-orig-auth keep-ms-domain time-remain peer-as-calling report-mac
	#set link disable chap pap
	#set link accept chap pap
	#set link enable incoming
	set auth authname user
	set auth password password
	open

/dev/cuaU0.0 — это порт модема.
Запускаем: /usr/local/etc/rc.d/mpd5 forcerestart

Тесты

Сравнил работу в режимах NDIS (NCM) и RAS (modem) под FreeBSD.
Методика: Москва, после полуночи :)
wget качал в 8 потоков один и тот же файл в /dev/null
Сервер с файлом в этом же городе, канал до него позволяет более 100 мегабит забирать, сам сервер тоже может 500+ легко для одного файла.

Скорость получилась примерно одинаковой: 7-8 мегабайт в секунду.

NDIS (NCM)

Пинг стабильно (более менее) держится и ниже, нагрузки на систему (E8500 — это вам не задохлик роутер на ARM/mips) не заметно вообще.

ping

64 bytes from xxx: icmp_seq=1 ttl=244 time=25.212 ms
64 bytes from xxx: icmp_seq=2 ttl=244 time=25.939 ms
64 bytes from xxx: icmp_seq=3 ttl=244 time=29.943 ms
64 bytes from xxx: icmp_seq=4 ttl=244 time=27.439 ms
64 bytes from xxx: icmp_seq=5 ttl=244 time=25.662 ms
64 bytes from xxx: icmp_seq=6 ttl=244 time=27.778 ms
64 bytes from xxx: icmp_seq=7 ttl=244 time=28.916 ms
64 bytes from xxx: icmp_seq=8 ttl=244 time=27.233 ms
64 bytes from xxx: icmp_seq=9 ttl=244 time=24.446 ms
64 bytes from xxx: icmp_seq=10 ttl=244 time=29.356 ms
64 bytes from xxx: icmp_seq=11 ttl=244 time=25.392 ms
64 bytes from xxx: icmp_seq=12 ttl=244 time=27.369 ms
64 bytes from xxx: icmp_seq=13 ttl=244 time=25.578 ms
64 bytes from xxx: icmp_seq=14 ttl=244 time=27.748 ms
RAS (modem)

Пинг скачет и несколько выше, нагрузка на систему заметна, примерно 4-6% одного ядра. Такое походу не всем роутерам под силу.

ping

64 bytes from xxx: icmp_seq=0 ttl=244 time=33.971 ms
64 bytes from xxx: icmp_seq=1 ttl=244 time=27.066 ms
64 bytes from xxx: icmp_seq=2 ttl=244 time=28.687 ms
64 bytes from xxx: icmp_seq=3 ttl=244 time=23.930 ms
64 bytes from xxx: icmp_seq=4 ttl=244 time=26.412 ms
64 bytes from xxx: icmp_seq=5 ttl=244 time=25.663 ms
64 bytes from xxx: icmp_seq=6 ttl=244 time=30.312 ms
64 bytes from xxx: icmp_seq=7 ttl=244 time=29.905 ms
64 bytes from xxx: icmp_seq=8 ttl=244 time=35.774 ms
64 bytes from xxx: icmp_seq=9 ttl=244 time=25.895 ms
64 bytes from xxx: icmp_seq=10 ttl=244 time=31.763 ms
64 bytes from xxx: icmp_seq=11 ttl=244 time=27.883 ms
64 bytes from xxx: icmp_seq=12 ttl=244 time=23.862 ms
64 bytes from xxx: icmp_seq=13 ttl=244 time=29.746 ms
64 bytes from xxx: icmp_seq=14 ttl=244 time=34.491 ms
64 bytes from xxx: icmp_seq=15 ttl=244 time=23.722 ms
64 bytes from xxx: icmp_seq=16 ttl=244 time=31.306 ms
64 bytes from xxx: icmp_seq=17 ttl=244 time=43.241 ms
64 bytes from xxx: icmp_seq=18 ttl=244 time=38.716 ms
64 bytes from xxx: icmp_seq=19 ttl=244 time=31.190 ms

Автор: Ivan_83

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js