FreeBSD и 3G USB-модем ZTE MF626
Использование USB-модема ZTE MF626 для организации (резервного) канала через билайновскую сеть 3G и FreeBSD 8.2-STABLE.
- Модемы ZTE MF626, продаваемые в комплекте контрактов Билайна, могут быть привязаны к некоему Windows-based софту, ожидая от него во время соединения периодические сигналы через USB, в отсутствие которых модем быстро рвет связь. Первоначально модем нужно "отвязать" от этого. Метод отвязывания многократно описан в сети и выходит за рамки этой заметки.
- Модем поддерживается драйвером
u3g
, поэтому, если драйвера нет в ядре, первым делом нужно подгрузить его (kldload u3g
) и обеспечить подгрузку после ребута:echo 'u3g_load="YES"' >> /boot/loader.conf
- После загрузки драйвера можно вставлять модем в порт USB. В выводе
usbconfig
модем определяется так:ugen1.3: <ZTE CDMA Technologies MSM ZTE, Incorporated> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON
Далее возможны варианты. Если после подключения модема появилось новое устройство вида/dev/cd0
, значит, модем представляется CD-приводом, содержащим драйвера для Windows и прочих. Выводится модем из этого режима следующим образом:usbconfig -d 1.3 add_quirk UQ_MSC_EJECT_ZTESTOR
camcontrol eject pass0Цифры
1.3
скопированы из выводаusbconfig
, а0
- из названия/dev/cd0
, у вас могут быть другие значения.
После этого пропадает/dev/cd0
и появляются/dev/cuaU0.0
,/dev/cuaU0.1
и/dev/cuaU0.2
. Опять же, конкретные цифры у вас могут быть другими при наличии в системе других устройств/dev/cuaUx
.
Необходимо добиться появления/dev/cuaUx.x
, без этого к следующим шагам переходить рано. - Установка 3G PPP-соединения через mpd-5.5.
Дописываем в файл/usr/local/etc/mpd5/mpd.script
(или создаём, если не существует; отступы делаем табуляциями):dial-beeline: print "AT&F\r\n" match "ERROR" ModemError match "NO CARRIER" ModemError match "OK" NoEcho wait 5 log "Modem not ready" failure NoEcho: print "ATE0\r\n" match "OK" ModemQuery wait 5 log "Modem not ready" failure ModemQuery: print "AT+CRSM=176,12258,0,0,10\r\n" regex "[+]CRSM: .*\"(.*)\"" wait 5 log "Detected ICC (BCD): $matchedString1" match "OK" wait 5 print "AT+CRSM=176,28423,0,0,9\r\n" regex "[+]CRSM: .*\"(.*)\"" wait 5 log "Detected IMSI: $matchedString1" match "OK" wait 5 print "AT+CSQ\r\n" regex "[+]CSQ: .*$" wait 5 log "Detected $matchedString0" match "OK" wait 5 ModemInit: print "AT&D2&C1S0=0S7=60S30=0+CGDCONT=1,\"IP\",\"internet.beeline.ru\"\r\n" match "OK" DialOut match "ERROR" ModemError wait 5 ModemError: log "Modem error" failure DialOut: log "Calling, waiting 60 seconds for connect..." print "ATDT*99#\r\n" match "CONNECT" Connected match "NO CARRIER" DialError match "BUSY" DialError wait 60 log "Modem error" failure DialError: log "Cannot connect" failure Connected: log "Connected" success
В
/usr/local/etc/mpd5/mpd.conf
пишем:startup: # configure mpd users set user admin xxx admin # configure the console set console self 127.0.0.1 5005 set console open default: load beeline beeline: log +auth +bund +ccp +chat +echo +iface +ipcp +lcp +phys create bundle static BEELINE set bundle links B-Link set ipcp ranges 0.0.0.0/0 1.1.1.1/0 set ipcp disable vjcomp create link static B-Link modem set link action bundle BEELINE set modem device /dev/cuaU0.2 set modem speed 921600 set modem watch -cd set modem watch -dsr set modem script dial-beeline set auth authname beeline set auth password beeline set link disable chap pap acfcomp protocomp set link keep-alive 6 60 set link max-redial 0 open
Билайновский PPP не выдаёт нам IP-адрес своей стороны, поэтому команда
set ipcp ranges 0.0.0.0/0 1.1.1.1/0
выглядит так странно. Если создаётся не резервный, а основной канал, не забудьте непосредственно перед этой командой вставить командуset iface route default
для установки маршрута по умолчанию в этот сетевой интерфейс. - После запуска mpd5 в журнале работы получаем:
mpd: [BEELINE] Bundle: Interface ng0 created mpd: [B-Link] Link: OPEN event mpd: [B-Link] LCP: Open event mpd: [B-Link] LCP: state change Initial --> Starting mpd: [B-Link] LCP: LayerStart mpd: [B-Link] chat: Detected ICC (BCD): 98765432109876543210 mpd: [B-Link] chat: Detected IMSI: 123456789012345678 mpd: [B-Link] chat: Detected +CSQ: 8,99 mpd: [B-Link] chat: Calling, waiting 60 seconds for connect... mpd: [B-Link] chat: Connected mpd: [B-Link] MODEM: chat script succeeded mpd: [B-Link] Link: UP event mpd: [B-Link] LCP: Up event mpd: [B-Link] LCP: state change Starting --> Req-Sent mpd: [B-Link] LCP: SendConfigReq #1 mpd: [B-Link] ACCMAP 0x000a0000 mpd: [B-Link] MRU 1500 mpd: [B-Link] MAGICNUM 4d142054 mpd: [B-Link] LCP: rec'd Configure Request #0 (Req-Sent) mpd: [B-Link] ACCMAP 0x00000000 mpd: [B-Link] AUTHPROTO CHAP MD5 mpd: [B-Link] MAGICNUM 2632583e mpd: [B-Link] PROTOCOMP mpd: [B-Link] ACFCOMP mpd: [B-Link] LCP: SendConfigAck #0 mpd: [B-Link] ACCMAP 0x00000000 mpd: [B-Link] AUTHPROTO CHAP MD5 mpd: [B-Link] MAGICNUM 2632583e mpd: [B-Link] PROTOCOMP mpd: [B-Link] ACFCOMP mpd: [B-Link] LCP: state change Req-Sent --> Ack-Sent mpd: [B-Link] LCP: rec'd Configure Ack #1 (Ack-Sent) mpd: [B-Link] ACCMAP 0x000a0000 mpd: [B-Link] MRU 1500 mpd: [B-Link] MAGICNUM 4d142054 mpd: [B-Link] LCP: state change Ack-Sent --> Opened mpd: [B-Link] LCP: auth: peer wants CHAP, I want nothing mpd: [B-Link] LCP: LayerUp mpd: [B-Link] LCP: rec'd Discard Request #1 (Opened) mpd: [B-Link] CHAP: rec'd CHALLENGE #1 len: 35 mpd: [B-Link] Name: "UMTS_CHAP_SRVR" mpd: [B-Link] CHAP: Using authname "beeline" mpd: [B-Link] CHAP: sending RESPONSE #1 len: 28 mpd: [B-Link] CHAP: rec'd SUCCESS #1 len: 4 mpd: [B-Link] LCP: authorization successful mpd: [B-Link] Link: Matched action 'bundle "BEELINE" ""' mpd: [B-Link] Link: Join bundle "BEELINE" mpd: [BEELINE] Bundle: Status update: up 1 link, total bandwidth 28800 bps mpd: [BEELINE] IPCP: Open event mpd: [BEELINE] IPCP: state change Initial --> Starting mpd: [BEELINE] IPCP: LayerStart mpd: [BEELINE] IPCP: Up event mpd: [BEELINE] IPCP: state change Starting --> Req-Sent mpd: [BEELINE] IPCP: SendConfigReq #1 mpd: [BEELINE] IPADDR 0.0.0.0 mpd: [BEELINE] IPCP: rec'd Configure Nak #1 (Req-Sent) mpd: [BEELINE] PRIDNS 10.11.12.13 mpd: [BEELINE] SECDNS 10.11.12.14 mpd: [BEELINE] PRINBNS 10.11.12.13 mpd: [BEELINE] SECNBNS 10.11.12.14 mpd: [BEELINE] IPCP: SendConfigReq #2 mpd: [BEELINE] IPADDR 0.0.0.0 mpd: [BEELINE] IPCP: rec'd Configure Nak #2 (Req-Sent) mpd: [BEELINE] PRIDNS 10.11.12.13 mpd: [BEELINE] SECDNS 10.11.12.14 mpd: [BEELINE] PRINBNS 10.11.12.13 mpd: [BEELINE] SECNBNS 10.11.12.14 mpd: [BEELINE] IPCP: SendConfigReq #3 mpd: [BEELINE] IPADDR 0.0.0.0 mpd: [BEELINE] IPCP: rec'd Configure Request #0 (Req-Sent) mpd: [BEELINE] IPCP: SendConfigAck #0 mpd: [BEELINE] IPCP: state change Req-Sent --> Ack-Sent mpd: [BEELINE] IPCP: rec'd Configure Nak #3 (Ack-Sent) mpd: [BEELINE] IPADDR 10.207.212.144 mpd: [BEELINE] 10.207.212.144 is OK mpd: [BEELINE] IPCP: SendConfigReq #4 mpd: [BEELINE] IPADDR 10.207.212.144 mpd: [BEELINE] IPCP: rec'd Configure Ack #4 (Ack-Sent) mpd: [BEELINE] IPADDR 10.207.212.144 mpd: [BEELINE] IPCP: state change Ack-Sent --> Opened mpd: [BEELINE] IPCP: LayerUp mpd: [BEELINE] 10.207.212.144 -> 1.1.1.1 mpd: [BEELINE] IFACE: Up event
Строчка
Detected +CSQ
сообщает нам уровень сигнала, две предыдущие наши ICC-ID и IMSI соответственно.
Вывод ifconfig выглядит так:ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1500 inet 10.207.212.144 --> 1.1.1.1 netmask 0xffffffff