ZTE MF626 (Билайн. Интернет дома) и Linux [РЕШЕНО]
Намедни приобрёл я вышеозначенный комплект. Поискав, что пишут люди по этому поводу (а MF620 прекрасно работает под линуксом), я предположил что проблем не будет, но, не тут-то было!
1. Устройство определяется с vid=0x19d2 pid=0x2000 и подключается как usb диск (на котором расположены драйверы и программа для Windows). В сети пишут, что нужно запустить usb_modeswitch, чтобы отключить диск и подключить модем, но в реальности всё оказалось несколько сложнее... Вот что случается при подключении:
usb 1-5: new high speed USB device using ehci_hcd and address 9
usb 1-5: configuration #1 chosen from 1 choice
usb-storage: device ignored
usb 1-5: New USB device found, idVendor=19d2, idProduct=2000
usb 1-5: New USB device strings: Mfr=2, Product=1, SerialNumber=0
usb 1-5: Product: ZTE CDMA Technologies MSM
usb 1-5: Manufacturer: ZTE, Incorporated
И тишина... Немного поискав в исходниках ядра, можно найти
# cat /usr/src/linux/drivers/usb/storage/unusual_devs.h ... ...UNUSUAL_DEV( 0x19d2, 0x2000, 0x0000, 0x0000, "Onda ET502HS", "USB MMC Storage", US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_IGNORE_DEVICE),
После комментирования этого фрагмента, пересборки, перезагрузки, и создания правила для udev, которое использует usb_modeswitch, получаем:
usb 1-7: new high speed USB device using ehci_hcd and address 5
usb 1-7: configuration #1 chosen from 1 choice
scsi7 : SCSI emulation for USB Mass Storage devices
usb 1-7: New USB device found, idVendor=19d2, idProduct=2000
usb 1-7: New USB device strings: Mfr=2, Product=1, SerialNumber=0
usb 1-7: Product: ZTE CDMA Technologies MSM
usb 1-7: Manufacturer: ZTE, Incorporated
usb-storage: device found at 5
usb-storage: waiting for device to settle before scanning
usb-storage: device scan complete
scsi 7:0:0:0: CD-ROM ZTE USB SCSI CD-ROM 2.31 PQ: 0 ANSI: 0
sr1: scsi3-mmc drive: 0x/52x cd/rw xa/form2 cdda tray
sr 7:0:0:0: Attached scsi CD-ROM sr1
sr 7:0:0:0: Attached scsi generic sg2 type 5
usb 1-7: USB disconnect, address 5
usb 1-7: new high speed USB device using ehci_hcd and address 6
usb 1-7: configuration #1 chosen from 1 choice
scsi8 : SCSI emulation for USB Mass Storage devices
usb 1-7: New USB device found, idVendor=19d2, idProduct=0031
usb 1-7: New USB device strings: Mfr=2, Product=1, SerialNumber=3
usb 1-7: Product: ZTE CDMA Technologies MSM
usb 1-7: Manufacturer: ZTE, Incorporated
usb 1-7: SerialNumber: 1234567890ABCDEF
usb-storage: device found at 6
usb-storage: waiting for device to settle before scanning
usb-storage: device scan complete
scsi 8:0:0:0: Direct-Access ZTE MMC Storage 322 PQ: 0 ANSI: 2
sd 8:0:0:0: [sdb] Attached SCSI removable disk
sd 8:0:0:0: Attached scsi generic sg2 type 0
Как видно, модем опознан. После modprobe usbserial vendor=0x19d2 product=0x0031 появляется устройство /dev/ttyUSB0... Казалось бы, всё в порядке, и можно подключаться, но, не тут то было...
2. Соединение с сетью у данного модема происходит сразу при подключении (в отличие от того что пишут в интернетах про MF620). И на первый взгляд это хорошо (не надо сочинять строку инициализации, или пользоваться спец. утилитами, типа umtstools или comgt), но примерно через 2-3 минуты модем отключается от сети. Помогает посылка команды через спец. утилиты, но если в этот момент pppd работал, он отключается (радостно сообщив о зависании модема). Вот лог
pppd[11167]: Plugin passwordfd.so loaded.
pppd[11168]: pppd 2.4.4 started by root, uid 0
/etc/init.d/net.ppp1[11090]: WARNING: net.ppp1 has started, but is inactive
chat[11173]: abort on (BUSY)
chat[11173]: abort on (ERROR)
chat[11173]: abort on (NO ANSWER)
chat[11173]: abort on (NO CARRIER)
chat[11173]: abort on (NO DIALTONE)
chat[11173]: abort on (Invalid Login)
chat[11173]: abort on (Login incorrect)
chat[11173]: timeout set to 5 seconds
chat[11173]: send (ATZ^M)
chat[11173]: expect (OK)chat[11173]: ^M
chat[11173]: +ZPASR: "EDGE"^M
chat[11173]: ATZ^M^M
chat[11173]: OK
chat[11173]: -- got it
chat[11173]: send (AT+CGDCONT=1,"IP","home.beeline.ru"^M)
chat[11173]: timeout set to 60 seconds
chat[11173]: expect (OK)
chat[11173]: ^M
chat[11173]: AT+CGDCONT=1,"IP","home.beeline.ru"^M^M
chat[11173]: OK
chat[11173]: -- got it
chat[11173]: send (ATDT*99#^M)
chat[11173]: expect (CONNECT)
chat[11173]: ^M
chat[11173]: ATDT*99#^M^M
chat[11173]: CONNECT
chat[11173]: -- got it
chat[11173]: send (^M)
chat[11173]: timeout set to 5 seconds
chat[11173]: expect (~)
chat[11173]: ^M
chat[11173]: alarm
chat[11173]: send (^M)
chat[11173]: send (^M)
pppd[11168]: Serial connection established.
pppd[11168]: Using interface ppp1
pppd[11168]: Connect: ppp1 <--> /dev/ttyUSB0
pppd[11168]: CHAP authentication succeeded
pppd[11168]: CHAP authentication succeeded
pppd[11168]: IPCP: timeout sending Config-Requests
pppd[11168]: Connection terminated.
pppd[11168]: Modem hangup
Настройки /etc/conf.d/net
config_ppp1="ppp" modules_ppp1="usbserial" link_ppp1="/dev/ttyUSB0" username_ppp1='beeline' password_ppp1='beeline' pppd_ppp1="usepeerdns defaultroute modem crtscts noipdefault noip" chat_ppp1=" ABORT BUSY ABORT ERROR ABORT 'NO ANSWER' ABORT 'NO CARRIER' ABORT 'NO DIALTONE' ABORT 'Invalid Login' ABORT 'Login incorrect' TIMEOUT 5 '' ATZ OK 'AT+CGDCONT=1,\"IP\",\"home.beeline.ru\"' TIMEOUT 60 OK 'ATDT*99#' CONNECT '' TIMEOUT 5 '~--' '' "
Теперь собственно вопрос: кто нибудь знает, что надо этому сволочному модему, чтобы он не отключался каждые две минуты?
P.S. В винде модем не отключается через две минуты...
P.P.S. решено! статья http://ru.gentoo-wiki.com/wiki/MF626 милости просим, дополняйте её, если у Вас есть написать чего интересного по поводу данного модема.
- Для комментирования войдите или зарегистрируйтесь
Читать man pppd на
Читать man pppd на тему использования опций
persist
Do not exit after a connection is terminated; instead try to reopen the connection. The maxfail
option still has an effect on persistent connections.
idle n Specifies that pppd should disconnect if the link is idle for n seconds. The link is idle when no
data packets (i.e. IP packets) are being sent or received. Note: it is not advisable to use this
option with the persist option without the demand option. If the active-filter option is given,
data packets which are rejected by the specified activity filter also count as the link being
idle.
Это не то. OpenRC
Это не то. OpenRC сам следит за разрывом соединения. Но что делать с отключением от сети? После этого надо послать команду AT+CFUN=1, и подождать, но в любом случае, отключение от сети произойдёт снова примерно через две минуты.
P.S. В тот момент, когда модем отключается от сети, он пишет в порт следующее
После чего периодически снова появляется "+ZOPERTER: 0"
Ну вот, всё и
Ну вот, всё и выяснилось! Родная утилита посылает раз в минуту следующую команду: AT+ZOPERTE="beeline"! Кто-нибудь знает как реализовать подобное с pppd?
Возможно поможет
Трейс утилиты для мака можно глянуть тут: выложил http://dl.getdropbox.com/u/239457/terminal_export.txt
Quote: Трейс
К сожалению, там другое устройство (idProduct=0x0001) Кроме того, у меня есть полно трейсов передач родной программы под виндой, но ведь ещё нужно понять, что там главное, а что нет, и как это реализовать в линуксе...
Как не то
Как не то устройство? просто idProduct=0x0001 - это режим cd-rom,
у сидирома -
у сидирома - 0х2000 а у MF626 0х0031. В первом сообщение в цитате из dmesg это явственно видно...
.
Недавно аналогично приобрел такой девайс. И вот в чем делема:
eject /dev/sr0 ничего не дает и последующий модпроб также безрезультатен :(
dmesg выдает кучу непонятных сообщений от usb-storage (к сожалению сейчас не могу их продемонстрировать)
Не подскажете в какую сторону копать...
Без dmesg ничего
Без dmesg ничего сказать нельзя. Могу только предложить подождать пару минут, может быть модем переподключиться...
P.S. с отсылкой команды модема оказалось всё далеко не так просто. Сейчас я застрял на том, что оказывается родная программа как-то хитро передаёт эти команды (не в туже конечную точку что и данные, команды AT+ZOPERTE, AT+ZSTART, AT+ZOPRT и т.п. во вторую, а AT, ATDT, ATE, и данные в четвёртую, которая является обычным преобразователем USB<->serial)... А если интернет-соединения нет, то echo -e "AT+ZOPERTE=\"beeline\"\r\n">/dev/ttyUSB0 работает как надо.
P.P.S. правка и использование драйвера option также не даёт результата (появляются три порта вместо одного, но читать и писать можно только в один).
P.P.P.S. запись во все конечные точки кроме четвёртой невозможна. Видимо надо посылать в устройство что-то ещё. Сейчас я как раз анализирую какие ещё пакеты и куда отсылаются...
MF626 - это то же
MF626 - это то же железо, что и ONDA MT503HS ( http://www.ondacommunication.com )
Для ONDA есть GUI софт в том числе и под Линух. А также есть драйвер в текстах под 2.6.x
Драйвер создаёт три TTY-устройства - для модема, для диагностики и для "NMEA".
Minicom успешно чтаится только с модемом. Остальные - отваливаются.
>>и создания
>>и создания правила для udev, которое использует usb_modeswitch
а само правило не подскажите?
# cat
# cat /etc/udev/rules.d/91-usb_modeswitch.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", RUN+="/usr/sbin/usb_modeswitch"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x031"
Не забудьте отредактировать /etc/usb_modeswitch.conf
А у меня это
А у меня это почему-то не работает.
Во-первых, usb_modeswitch не помогает сам по себе - лишь отключает /dev/sr0, а сам модем по-прежнему воспринимается, как 0x19d2 0x2000. Здесь помогает только "eject /dev/sr0".
Во-вторых, такое ощущение, что первая строка вообще не выполняется, в то время, как со второй всё нормально. То есть, если вставить модем, он опознаётся, как CDROM /dev/sr0, но команда usb_modeswitch не выполняется вообще. Я пробовал подставлять туда другую команду (для теста udev) - "/sbin/echo qwe > /tmp/qwe" - файл /tmp/qwe не создаётся. В то же время, после выполнения из командной строки команды "eject /dev/sr0" MF626 переходит в режим модема и нормально загружается модуль usb_serial. Не пойму, в чём дело.
При ручном подключении модем работает, как у всех - пару минут. Как с beeline, так и с MTS.
Quote: Во-первых,
Можете дописать эту команду в первой строке через точку с запятой. Я тоже заметил подобное поведение после того, как попытался подключить модем в консоли (видимо плазмоид извещения о новых устройствах что-то посылал ему).
Не тот vendor/product id?
udev разбушевался
/sbin/eject /dev/sr0 в правилах udev также не срабатывает. Короче говоря, не срабатывают сами правила. Второе правило, как я выяснил, тоже не срабатывает. udev регистрирует устройство /dev/ttyUSB0 без участия этих правил. Я их удалял совсем, ничего не менялось. Для обновления udev давал команду
udevadm control --reload_rules
Vendor/Product те самые, я проверял, естественно. 0x19d2/0x2000 для CDROM и 0x19d2/0x0031 для модема. Так что здесь ошибки нет.
Странно с правилами другое. Я проверял их командой
udevadm test /sys/block/sr0
в результате получил, что мои правила якобы выполняются. udev их видит. Но не выполняет. Короче говоря, udev меня совсем не слушается.
Ничего не
Ничего не понимаю. Я точно выяснил, что udev выполняет моё правило. Для этого я добавил в правило дополнительную ссылку на устройство:
| SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", NAME="%k", SYMLINK="srr0", RUN+="/bin/sleep 5; /usr/bin/eject /dev/sr0; /bin/sleep 5"
Команда
>> udevadm test /sys/block/sr0
докладывает, что это правило выполняется, и ссылка создаётся:
| udev_rules_get_name: add symlink 'srr0'
Однако при этом команда не выполняется. Я менял команду на echo для теста:
| SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", NAME="%k", SYMLINK="srr0", RUN+="/bin/echo qwe > /tmp/qwe"
При этом команда
>> udevadm test /sys/block/sr0
бодро докладывает, что ссылка создаётся, а команда выполняется:
| udev_rules_get_name: add symlink 'srr0'
| udevtest: run: '/bin/echo qwe > /tmp/qwe'
В реальности действительно появляется ссылка /dev/srr0, однако файл /tmp/qwe не создаётся. В чём может быть причина? Команда RUN не выполняется.
gentoo-sources-2.6.23-gentoo-r9
udev-124-r1
Прошу прощения,
Прошу прощения, я разобрался в своей ошибке благодаря ссылке http://www.reactivated.net/writing_udev_rules.html#external-run
При выполнении команд udev не создаёт канал стандартного выхода. А именно этот канал используется в моей команде echo. После того, как я поместил эту команду в файл test:
| #!/bin/sh
| /bin/echo qwe > /tmp/qwe
файл создался.
В результате я
В результате я всё-таки выкрутился так. Создал правила:
| ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", NAME="%k", SYMLINK="srr0", RUN+="/bin/kill_mf626_disk_1"
| ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x031"
В файле /bin/kill_mf626_disk_1 я поместил следующее:
| #!/bin/sh
| /bin/kill_mf626_disk_2 &
Это нужно, чтобы не udev не дожидался окончания работы программы. В файле /bin/kill_mf626_disk_2, выполняющем реальную работу, я разместил следующее:
| #!/bin/sh
| sleep 10
| /usr/bin/eject /dev/sr0
Теперь всё заработало. Спустя некоторое время после втыкания модема появляется устройство /dev/ttyUSB0. Задержка 10 с подобрана экспериментально, при меньшей не успевает появится устройство /dev/sr0 и команда eject не срабатывает.
При размещениии команд "/bin/sleep 10; /usr/bin/eject /dev/sr0" прямо в правило ничего не работает. Почему - не знаю.
Есть ли более удачные идеи?
Вся процедура инициализации (до появления устройств /dev/ttyUSB0 и /dev/sdb) занимает 38 секунд. Какой же всё-таки этот модем тормозной!
Зато этот модем
Зато этот модем работает, как флешка! При переводе в режим модема создаются /dev/ttyUSB0 и, кроме того, /dev/sdb, /dev/sdb1.
Я вставил в модем карточку MicroSD, перевёл его в режим модема и подмонтировал /dev/sdb1: mount /dev/sdb1 /mnt/flash. Карточка прочиталась! Круто, теперь у меня есть карт-ридер для MicroSD за 2000 р! Спасибо билайну!
А если серьёздно, идея хорошая - флешка, а она не флешка, а ещё и модем. Приходишь в любое место, втыкаешь флешку и выходишь в сеть. Жаль, что с этой флешки нельзя грузиться, а то можно было бы поставить туда систему, было бы здорово.
ArtSh
Ах, я был так же наивен!
Quote: Ах, я был
Я ещё надеюсь на драйвера, которые посоветовали выше... (сейчас заодно проверим, за сколько они скачаются через этот модем, там архив больше 70 МБ)
драйвер
драйвер собрался под х86, под х86_64 не собирается.
Там внутри кроме драйвера еще программы какие-то типа родной билайновской. Могу выложить отдельно драйвер.
Quote: драйвер
Закомментируйте:
Расскажу какие
Расскажу какие есть у меня новости. Подцепил я этот модем под винду, и сервисной утилитой( брал тут http://pauk.org.ua/wp-content/uploads/2008/06/qpst_27247.rar) подключился к файловой ситеме на модеме. Там в корне есть HEX файл, весом в один байт - CD_STARTUP_FLAG, содержимое этого файла - 01. Могу предположить, если справить на 00, то устройство сразу будет монтироваться как модем, без всяких там ZeroCD. (Тем самым можно не тратить будет время на его переход из одного состояния в другое,к тому же не нужен usb_modeswitch). Александр, на форуме http://blogs.pcmag.ru/node/583?page=6 мои догадки подтвердил.
У меня под маком эту устройство с установленными дровами видится так:
/dev/tty.ZTEUSBATPort_000010FD1
/dev/tty.ZTEUSBModem_000010FD3
Первое, как понятно из названия - порт, второе - сам модем. Попробовал сделать соедение, через GUI, соединение устанавливается, если через screen слать в /dev/tty.ZTEUSBATPort_000010FD1 время от времени AT+ZOPERTE="beeline", то коннект не рвется.. Если вместо beeline написать что-нибудь другое, то модем сразу отрубается. После at+cfun=1 модем вновь поднимается, регистриуется в сети. Но самая главная мысль, что команды нужно слать не модему, а в порт.
Вопрос
Не понятно только, как поменять, система эта только для чтения.
А можно ли выяснить, каким оконечным точкам соответствуют два этих файла? Модем предоставляет ряд интерфейсов, один из которых честно заявлен, как модем, другой - как usb_storage - это карт-ридер MicroSD. Есть ещё несколько интерфейсов, смысл которых не поясняется. Возможно, один из них и есть порт, знать бы, какой.
Quote: Не
На запись тоже есть, там кнопку Lock нужно отжать, исходный файл нужно удалить и залить исправленный, переписать файл нельзя.
Это той
Это той утилитой? Так что, содержимое диска можно менять?
Отлично. Я бы загнал туда загрузчик линукс с последующим подмонтированием MicroSD и установкой нормальной системы!
Видимо, это не
Видимо, это не та файловая система, которая видна, как CD-ROM, а та, что в документации на утилиту называется EFS - embedded file system.
Чорт, кажется я
Чорт, кажется я случайно не тот файл стер.. Не могли бы выслать то, чего нет в этом списке... там был еще один файл))
CD_STARTUP_FLAG
PCUI.VN
UimEfsAPDULLog.Txt
ZTEMODEM.ISO
hsunvitem.sav
pbm_master_v_20.dat
pbm_phone_uid.dat
reset_cntr.bin
Имена файлов
А имена этих файлов определяет кто - MacOS? Туда установлен специфичный для данного устройства драйвер? Очень хорошое совпадение в названиях файлов.
Ну точно, у меня
Ну точно, у меня модем висит на интерфейсе 3, в маке ему соответствует файл /dev/tty.ZTEUSBModem_000010FD3. Так как порту соответствует файл /dev/tty.ZTEUSBATPort_000010FD1, рискну предположить, что за порт отвечает первый интерфейс.
Но в модемном интерфейсе 3 конечных точки - одна для прерывания и две bulk. А в первом интерфейсе только две точки bulk.
Для сравнения, у USB-serial преобразователя на PL2303, который оказался у меня под рукой, три конечных точки в точности, как в модемном интерфейсе MF626. Пока непонятно, как подключить к нему порт.
Quote: Но в
На самом деле там конечных точек больше. Они разделены по интерфейсам. Интерфейс преобразователя USB<->COM состоит из трёх точек: 0x84, 0x85, 0x04. Интерфес, через который пересылается команда AT+ZOPERTE, AT+ZOPRT, AT+CSQ и т.п. состоит из двух точек: 0x82, 0x02. Интерфейс, через который подключается microSD карта - тоже из двух: 0x03, 0x83
Интерфейс
Конечно больше. Модемный интерфейс - 3, а ещё есть 0-2. Как я понимаю, для команд предназначен интерфейс 1. Там есть две оконечных точки типа bulk. Может быть, просто посылать команды в оконечную точку этого интерфейса для вывода?
Quote: Может
Команды надо отсылать во вторую (/dev/ttyUSB1 для драйвера onda). Но, даже с драйвером onda у меня это не получается: системный вызов на запись висит...
дубль
дубль
про имена ничего толком сказать не могу
Скорее всего, имена такие получаются когда я макосу сую драйвера. Которыйе есть под макос на там же Zero CD.
Драйвер
Странно, вот содержимое диска на моём модеме:
/AutoRun.dat
./AutoRun.exe
./autorun.inf
./beeline.ico
./Installer
./Installer/_Setup.dll
./Installer/data1.cab
./Installer/data1.hdr
./Installer/data2.cab
./Installer/ISSetup.dll
./Installer/layout.bin
./Installer/setup.exe
./Installer/setup.ini
./Installer/setup.inx
Там вроде для mac
Там вроде для mac какая-то хитрость есть, толи в ФС другая, то ли еще чего. Но там еще есть Beeline Internet at Home.mpkg
rootin
А вот и ответ на мой вопрос. ZTEMODEM.ISO очевидно - образ того диска, который я вижу и монтирую, как /dev/sr0 (список файлов выше)!
Таким образом, я полагаю, можно подменить данный файл и загнать туда всё, что угодно! Отлично! Осталось только запустить сам модем без обрывов связи.
Ну этот момент
Ну этот момент меня уже меньше волнует.. Главное модем чтоб заработал как положено)
А по-моему
А по-моему здорово. Представляете - втыкаете данное устройство в любой компьютер, грузится Gentoo, и сразу в сети!
А вы не могли бы
А вы не могли бы мне помочь? Я про тот файлик который я случайно потер...)
Дружище ты не сможешь залить
Дружище ты не сможешь залить этот диск на мою почту плиз
может, будет
может, будет полезно http://www.linux-fueled.com/altro/comandi.pdf -список AT комнад
AT
Да, видимо, команда AT+ZOPERTE изобретена для билайна...
Ура!
Граждане, я кажется решил проблему!
Я написал программу, которая посылает АТ-команду в нужный интерфейс через libusb при подключенной сети. Сейчас я испытал её и в течении 15 минут связь не обрывалась по вине модема. Программа однократно отсылает строку "AT+ZOPERTE=\"beeline\"\r\n" в оконечную точку 0x02 первого интерфейса в первой альтернативной конфигурации. Пока я запускал её вручную, но можно, например, заставить это делать crond.
Итак, создаём файл UnBeeline.c следующего содержания:
#include
#include
#include
int OpenMyDevice(struct usb_device **device, usb_dev_handle **udev_handle, int VID, int PID)
{
struct usb_bus *bus;
struct usb_device *dev;
usb_dev_handle *udev;
int isFound = 0;
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
udev = usb_open(dev);
if ( (dev->descriptor.idVendor == VID) &
(dev->descriptor.idProduct == PID)) {
isFound = 1;
break;
} else {
if (udev) usb_close(udev);
};
}
if (isFound)
break;
}
*device = dev;
*udev_handle = udev;
return isFound;
}
int main(void)
{
struct usb_device *dev;
usb_dev_handle *udev;
int rc;
char msg[] = "AT+ZOPERTE=\"beeline\"\r\n";
int NUM = strlen(msg);
if (OpenMyDevice(&dev, &udev, 0x19d2, 0x0031)) {
printf("Device found\n");
} else {
printf("Device not found\n");
exit(1);
};
printf("Claim_interface: %d\n", usb_claim_interface(udev, 1));
printf("Alt_interface: %d\n", usb_set_altinterface(udev, 1));
rc = usb_bulk_write(udev, 2, (char *)msg, NUM, 1000);
printf("USB bulk write: %d (%d)\n", rc, NUM);
usb_close(udev);
return 0;
}
Создаём Makefile:
all:
gcc -lusb -o UnBeeline UnBeeline.c
Далее компилируем программу командой "make" и получаем исполняемый файл UnBeeline. После установки сетевого соединения этот файл нужно запускать раз в минуту, и связь не будет обрываться.
При нормальной работе данная программа выдаёт:
Device found
bNumConfigurations: 1
bNumInterfaces: 4
bNumEndpoints: 2
Claim_interface: 0
Alt_interface: 0
USB bulk write: 22 (22)
Последняя цифра 22 - длина сообщения, которое удалось записать в устройство (в скобках - сколько должно быть). Если две цифры совпадают, значит транзакция USB прошла успешно. Запускать из под root.
Программа пока сырая, без различных проверок, потом я её переделаю.
Прошу
Прошу протестировать!
Проблема решена
Ну всё, теперь я уверен, проблема решена. Модем отработал ночь, уже более 6 часов. При этом совершенно чётко связь обрывалась раз в полтора часа. Как говорит pppd -
LCP terminated by peer
Connect time 90.2 minutes.
Этот обрыв связи, как известно, инициирован уже Билайном. pppd успешно автоматически восстанавливает связь.
Таким образом, модем работает.
UnBeeline.c
На pppd ещё не проверял, но контакт с оператором уже не рвёт (синий светодиод
горит постоянно).
Победа
Ну все, я протестировал. Вчера как включил в полночь, так до сих пор работает.
Предлагаю считать вопрос решённым.
Подтверждаю. И спасибо
Подтверждаю. И спасибо огромное...
Прошу прощения,
Прошу прощения, недосмотрел. После директив #include в треугольных строках стоят названия файлов.
#include stdio.h
#include string.h
#include usb.h
Нужно добавить треугольные скобки, они теряются при форматировании страницы в движке форума, т.к. в треугольных скобках стоят команды HTML. Я не знаю, как в форуме писать строки в треугольных скобках.
Кстати, для работы, естественно, должна быть установлена libusb.
Автоматизация через cron
Пока я так и сделал - использовал cron (у меня vixie-cron). Если всё сделать совсем по-простому, то можно так. Создаём файл cron_task с содержанием:
* * * * * /bin/UnBeeline
Заносим его в базу данных cron:
>> crontab -u root cron_task
Проверяем, понял ли cron:
>> crontab -l
Данная команда должна выдать что-нибудь вроде:
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (cron installed on Thu Oct 16 23:43:56 2008)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
* * * * * /bin/UnBeeline
Далее нужно, чтобы cron был запущен. Запустить можно командой
>> cron
а убедится -
>> ps aux | grep cron
Ну всё, теперь программа (должна быть в /bin/UnBeeline) каждую минуту посылает сообщение в порт модема. Если модем не вставлен, она будет ругатся на отсутствие модема "в пустоту", потом это переделаю.
Сейчас я пишу данное сообщение через модем ZTE MF626 из-под Linux, заведённый данным способом (карточка, кстати, МТС, Beeline у меня работает отвратительно). Модем уже работает более десяти минут, и никаких намёков на сбои.
Какая версия
Какая версия ядра?
2-6-20-gentoo-r8
2-6-20-gentoo-r8.
А есть ли разница? Здесь используется libusb (кстати, версия libusb-0.2.12-r1).
Quote: 2-6-20-gentoo-r8. А
есть. На 2.6.26-r1 и 2.6.27 ENOENT - no such file or directory. С этим и есть проблема. А что касаемо родных дров, так это слегка изменённый option. Он работает точно также.
P.S. На счёт 2.6.27 я поторопился. Работает!!! Вот мой вариант программы:
Ruby
А вот аналогичная программа на Ruby (unbeeline.rb):
Требуется интерпретатор Ruby, пакет libusb, а также ruby-usb (Ruby-обёртка над libusb).
Запускается программа следующим образом:
sudo ruby unbeeline.rb
Программа делает следующие вещи:
1. оживляет модем путём посылки AT+CFUN=1;
2. создаёт ttyUSB0 через вызов modprobe;
3. висит в бесконечном цикле, посылая каждую минуту AT+ZOPERTE="beeline".
P.S. Я использую модем ZTE MF626, во внутренней файловой системе которого предварительно удалён напрочь файл CD_STARTUP_FLAG.
Если отключается модем
Если у кого, как у меня, выключается модем через некоторое время, то поменяйте в коде:
while(1)
{
sleep(59);
len=lenc;
SendToDevice(com, len, udev);
}
на :
int main(void)
{
while(1){
....................................
...................................
...................................
sleep(59);
}
return 0;
}
Т.е., while для всей функции main. Не знаю почему, но только так модем не вырубается.
Quote: Если у кого, как у
А выключается он так после того как симка побывала в телефоне... Возвращается в нормальное состояние тем, что запускается с родной программой в винде, после этого снова всё работает как надо. Будем анализировать логи сниффера дальше...
Я симку из модема вообще не
Я симку из модема вообще не вынимал. Модем вырубался как раз из-за этого цикла. Когда я его закоментировал и каждую минуту запускал прогу UnBeeline без цикла while, модем не отключался.
У меня так тоже было
Я при отладке своей Ruby-программы с этим тоже столкнулся: модем вырубается через несколько посылок AT+ZOPERTE="beeline".
Решение оказалось просто: надо для каждой посылки открывать заново интерфейс, а потом его снова закрывать.
Для этого у меня и предусмотрена функция send_msg:
Quote: Я симку из модема
Сегодня я посмотрел по подробнее, скорее всего, если послать AT+ZSTOPT AT+ZOPRT=6 а потом включить как обычно, то ничего такого не будет...
-EBUSY
Прошу помочь: добился переключения устройства в модемный режим, но не могу заслать ему этот ZOPERTE.
Попробовал обе приведённые программы, написал свою с нуля - в каждом случае usb_claim_interface (запущенный от рута) возвращает "Device or resource busy". Куда можно покопать?
Уже разобрался: option
Уже разобрался: option захватывал порт. См. ниже насчёт пофикшенной программы.
Добавление ID-а
Добавление ID-а модема в option.ko ушло в linux-usb: http://marc.info/?l=linux-usb&m=122432881624070&w=2
Обсуждение правки usb-serial: здесь: http://marc.info/?t=122382607800002&r=1&w=2 и http://marc.info/?t=122367365100002&r=1&w=2
Поправленная софтина, умеющая отсоединять от интерфейса присосавшийся драйвер временно тут: http://dumpz.org/2984/
посылать команды *102#
А кто-нибудь разобрался как посылать команды *102# и получать ответ на них?
Вынимать симку, вставлять её в телефон только для того что бы проверить баланс....
как-то не очень....
Я пробовал давать модему
Я пробовал давать модему команды из документа, ссылка на который есть в этом форуме, через ту же самую оконечную точну, что и команду AT+ZOPERTE. Таким образом, мне удалось узнать уровень сигнала, IMEI, название сети. Однако SMS послать почему-то не удалось.
А вообще, кто-нибудь разбирается в вопросах, связанных с управлением телефоном? Как я понимаю, команды типа *102# не используют SMS. Но каких-либо специфичных команд для подобных вещей я не нашёл. Подскажите, пожалуйста. Нужно проверять баланс счёта без родного софта, а также не пользуясь сайтом uslugi.beeline.ru, который сильно тормозит. Надо бы разобраться в этом вопросе. Хочу попробовать посмотреть USB сниффером.
Для себя я этот вопрос пока не решил, но очень хочется.
$BOC(\pi, e)$
SMS-ки, вероятно, надо слать
SMS-ки, вероятно, надо слать через основной порт, ибо GUI модема требует отключения GPRS для их отсылки и получения.
Quote: SMS-ки, вероятно, надо
Тут без экспериментов не обойтись...
Я пробовал давать модему
Сорри, дубль вышел
$BOC(\pi, e)$
Вот лог
Вот лог USB-сниффера
то что в кавычках - текст в кодировке UCS-2BE записанный в шестнадцатиричном виде. Завтра попробую написать программу, которая выдавала бы это всё в приемлемом виде.
Баланс
Отлично! Строку USSD я получил, отправив в первый интерфейс команду "AT+CUSD=1,*102#,15\r\n".
Теперь нужно декодировать. Говорят, есть готовая функция декодирования в gnokii. Или вот здесь: http://www.codeproject.com/KB/mobile/smspdulib.aspx?fid=348333&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=2513104
$BOC(\pi, e)$
А вообще, данная кодировка,
А вообще, данная кодировка, оказывается, поддерживается iconv, так что всё должно быть просто.
Короче говоря, я добился результата. В ответ на команду "AT+CUSD=1,*102#,15" модем ответил:
+CUSD: 0,"04110430043B0430043D0441002000340033002E003900310440002E002004220440043004440438043A0020003
0002E00300020041A0431002E0414043504420430043B0438003A002000680074007400700073003A002F002F00750073006C
007500670069002E006200650065006C0069006E0065002E00720075",72
Затем я прочитал данную строку в кавычках sscanf-ом по формату "04X", и записал в двоичном виде в файл tmp.txt. После этого команда:
>> cat tmp.txt | iconv -f UCS-2 -t utf-8
выдала следующее:
Баланс 43.91р. Трафик 0.0 кБ. Детали: https://uslugi.beeline.ru
Так что всё, дальше дело техники.
$BOC(\pi, e)$
iconv!
Непонятно насчёт трафика 0.0 кБ, может быть это имеется в виду WAP. Я использовал карточку для доступа в интернет, и деньги со счёта снимаются. Но это уже вопрос к билайну.
$BOC(\pi, e)$
Quote: Непонятно насчёт
Это значит что либо предоплаченный трафик закончился, либо его не было (например на ночном безлимите).
Quote: Завтра попробую
http://pastebin.com/m67e6ecad - полностью рабочая программа.
Запрос баланса
У меня эта программа не заработала. Видимо, интерфейс ttyUSB был занят pppd.
Вот мой вариант программы, отправляющий запрос и получающий ответ через libusb.
GetBalance.c:
#include stdio.h
#include usb.h
#include string.h
#include iconv.h
int OpenMyDevice(struct usb_device **device, usb_dev_handle **udev_handle, int VID, int PID)
{
struct usb_bus *bus;
struct usb_device *dev;
usb_dev_handle *udev;
int isFound = 0;
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
udev = usb_open(dev);
if ( (dev->descriptor.idVendor == VID) &
(dev->descriptor.idProduct == PID)) {
isFound = 1;
break;
} else {
if (udev) usb_close(udev);
};
}
if (isFound)
break;
}
*device = dev;
*udev_handle = udev;
return isFound;
}
#define BULK 512
int SendCommand(usb_dev_handle *udev, char cmd[], char reply[])
{
int rc;
int NUM = strlen(cmd);
rc = usb_bulk_write(udev, 0x02, (char *)cmd, NUM, 1000);
if (rc < 0)
return rc;
rc = usb_bulk_read(udev, 0x82, reply, BULK, 1000);
return rc;
}
int main(void)
{
struct usb_device *dev;
usb_dev_handle *udev;
int rc;
char s[BULK];
char *msg;
msg = malloc(BULK);
if (OpenMyDevice(&dev, &udev, 0x19d2, 0x0031) != 1) {
fprintf(stderr, "Device not found\n");
exit(1);
};
if (usb_claim_interface(udev, 1) != 0) {
usb_close(udev);
fprintf(stderr, "Couldn't claim USB interface\n");
exit(-1);
}
if (usb_set_altinterface(udev, 1) != 0) {
usb_close(udev);
printf("Couldn't alternate USB interface\n");
exit(-1);
}
msg = "AT+CUSD=1,*102#,15\r\n";
SendCommand(udev, msg, s);
char str[100];
int i;
unsigned short data[512];
char str2[100];
iconv_t cnv;
int cnt;
for (cnt=0;cnt<10;cnt++) {
str[i] = s[i+12];
rc = usb_bulk_read(udev, 0x82, s, BULK, 1000);
s[rc] = 0;
if (rc > 6) {
for (i=0; i<6; i++)
str[i] = s[i+2];
str[6] = 0;
if (strcmp(str, "+CUSD:") == 0)
{
for (i=0; i
str[i] = 0;
for (i=0; i
sscanf(str+i*4, "%04X", data+i);
}
int i1, i2;
char *c1, *c2;
i1 = strlen(str)/2;
i2 = strlen(str)/2;
c1 = (char*)data;
c2 = (char*)str;
cnv = iconv_open("utf-8", "UCS-2");
if (iconv(cnv, &c1, &i1, &c2, &i2) == 0) {
str[i2] = 0;
printf("%s\n", str);
}
usb_close(udev);
exit(0);
}
}
}
fprintf(stderr, "Too many retries failed\n");
return 0;
}
Собирается командой
>> gcc -o GetBalance GetBalance.c -lusb
Пример использования:
>> ./GetBalance
Баланс 55.44 р. Трафик 0.0 К
$BOC(\pi, e)$
Ошибочка вышла, вот верная
Ошибочка вышла, вот верная программа: http://pastebin.com/f7ab81357
Всё равно не работает
Всё равно не работает. Программа в цикле выдаёт пустые строки:
ans:
ans:
ans:
Видимо, модем не отвечает на команду через порт. Порт прописан правильный, интернет я останавливал, результат не меняется. Почему бы не получать ответ из endpoint 0x82, ведь порт ttyUSB0 (который, кстати, может меняться) занят pppd?
$BOC(\pi, e)$
Quote: Почему бы не получать
Я действовал по той же логике, что и родная виндовая программа. Когда pppd отключён, модем принимает команды через 0x02 а отсылает ответ через ttyUSB (это я установил экспериментальным путём). Как модем будет действовать когда pppd подключён я не знаю. Вполне может быть что он пошлёт ответ через 0x82, а может быть и нет. Надо пробовать. Модифицировать программу не сложно...
Так я пробовал - работает,
Так я пробовал - работает, листинг программы приведён выше.
$BOC(\pi, e)$
Может просветите почему
Может просветите почему приходится писать сразу в эндпоинт
а не в ttyUSB1 например?
ttyUSB
Файл устройства ttyUSB* поддерживается модулем usb_serial, рассчитанным на определённый интерфейс со стороны USB-устройства (на определённый набор оконечных точек). В данном модеме для отправки AT-команд используется нестандартный интерфейс, не используемый модулем usb_serial. Вполне возмножно, что данный модуль несложно научить работать с оконечными точками 0x02 и 0x82 данного модема, однако проще оказалось отправлять сообщения через libusb из пользовательского режима, не изменяя модули ядра.
$BOC(\pi, e)$
Quote: Может просветите
Всё очень просто. Стандартный преобразователь USB<->Serial подразумевает две (IN и OUT) точки типа bulk, и одну точку типа interrupt (IN). Интерфейс через который надо пересылать команды состоит только из двух точек (IN и OUT), поэтому стандартный преобразователь туда не подключается. На такое поведение рассчитан драйвер option, или родной - onda (который является модифицированным драйвером option, но не поддерживается разработчиками, поэтому быстро отстаёт от основной ветки). Как верно заметил eugene_b, в тот же option можно легко добавить VID и PID для данного устройства (может быть в следующей версии ядра так и будет, и надо будет переписывать и программы и скрипт), но это придётся делать каждый раз при обновлении ядра, тогда как в пространстве пользователя ничего не меняется.
Патч в option ушёл, появится
Патч в option ушёл, появится или в 2.6.28, или в 2.6.29.
option
хорошо, я прописал в option VID модема, получил 3 порта ttyUSB{1,2,3}
но пообщаться терминалкой всеравно можно только с одним (в винде с двумя можно)
может в option драйвере еще что-то покрутить?
(хочется иметь возможность работать с смсками и pppd одновременно, вот и пытаюсь поднять оба порта нормальным способом)
Не могу запустить usbserial
Подключаю модем пишу eject /dev/sr0
в lsusb -v
Затем пишу в консоль modprobe usbserial vendor=0x19d2 product=0x0031 ответ
В dmesg следующее
Не могу понять что не так делаю...
Скорее всего драйвер generic
Скорее всего драйвер generic не включён в конфиге ядра. Давайте вывод zcat /proc/config.gz|grep USB_SERIAL
Спасибо! заработало!
Спасибо! заработало!
собрал новое ядро 2.6.27 Не
собрал новое ядро 2.6.27 Не могу переключить в режим модема так как не появляется устройство sr0 в dmesg...