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
+ZDONR: "Not Found"
+ZPASR: "No Service"
+ZDONR: "Not Found"
+ZPASR: "No Service"
+ZDONR: "Not Found"
+ZPASR: "No Service"

После чего периодически снова появляется "+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: Во-первых,

Цитата:
Во-первых, usb_modeswitch не помогает сам по себе - лишь отключает /dev/sr0, а сам модем по-прежнему воспринимается, как 0x19d2 0x2000. Здесь помогает только "eject /dev/sr0".

Можете дописать эту команду в первой строке через точку с запятой. Я тоже заметил подобное поведение после того, как попытался подключить модем в консоли (видимо плазмоид извещения о новых устройствах что-то посылал ему).

Цитата:
Я пробовал подставлять туда другую команду (для теста udev) - "/sbin/echo qwe > /tmp/qwe" - файл /tmp/qwe не создаётся.

Не тот vendor/product id?

udev разбушевался

ArtSh написал(а):
Цитата:
Во-первых, usb_modeswitch не помогает сам по себе - лишь отключает /dev/sr0, а сам модем по-прежнему воспринимается, как 0x19d2 0x2000. Здесь помогает только "eject /dev/sr0".

Можете дописать эту команду в первой строке через точку с запятой. Я тоже заметил подобное поведение после того, как попытался подключить модем в консоли (видимо плазмоид извещения о новых устройствах что-то посылал ему).

Цитата:
Я пробовал подставлять туда другую команду (для теста udev) - "/sbin/echo qwe > /tmp/qwe" - файл /tmp/qwe не создаётся.

Не тот vendor/product id?

/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

ArtSh написал(а):
Намедни приобрёл я вышеозначенный комплект. Поискав, что пишут люди по этому поводу (а MF620 прекрасно работает под линуксом), я предположил что проблем не будет, но, не тут-то было!

Ах, я был так же наивен!

Quote: Ах, я был

Цитата:
Ах, я был так же наивен!

Я ещё надеюсь на драйвера, которые посоветовали выше... (сейчас заодно проверим, за сколько они скачаются через этот модем, там архив больше 70 МБ)

драйвер

драйвер собрался под х86, под х86_64 не собирается.
Там внутри кроме драйвера еще программы какие-то типа родной билайновской. Могу выложить отдельно драйвер.

Quote: драйвер

Цитата:
драйвер собрался под х86, под х86_64 не собирается.

Закомментируйте:

.num_interrupt_in  = NUM_DONT_CARE,
.num_bulk_in       = NUM_DONT_CARE,
.num_bulk_out      = NUM_DONT_CARE,

Расскажу какие

Расскажу какие есть у меня новости. Подцепил я этот модем под винду, и сервисной утилитой( брал тут 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 модем вновь поднимается, регистриуется в сети. Но самая главная мысль, что команды нужно слать не модему, а в порт.

Вопрос

rootin написал(а):
Там в корне есть HEX файл, весом в один байт - CD_STARTUP_FLAG, содержимое этого файла - 01. Могу предположить, если справить на 00, то устройство сразу будет монтироваться как модем, без всяких там ZeroCD.

Не понятно только, как поменять, система эта только для чтения.

rootin написал(а):
У меня под маком эту устройство с установленными дровами видится так:
/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

Имена файлов

rootin написал(а):
/dev/tty.ZTEUSBATPort_000010FD1
/dev/tty.ZTEUSBModem_000010FD3

А имена этих файлов определяет кто - MacOS? Туда установлен специфичный для данного устройства драйвер? Очень хорошое совпадение в названиях файлов.

Ну точно, у меня

Ну точно, у меня модем висит на интерфейсе 3, в маке ему соответствует файл /dev/tty.ZTEUSBModem_000010FD3. Так как порту соответствует файл /dev/tty.ZTEUSBATPort_000010FD1, рискну предположить, что за порт отвечает первый интерфейс.

Но в модемном интерфейсе 3 конечных точки - одна для прерывания и две bulk. А в первом интерфейсе только две точки bulk.
Для сравнения, у USB-serial преобразователя на PL2303, который оказался у меня под рукой, три конечных точки в точности, как в модемном интерфейсе MF626. Пока непонятно, как подключить к нему порт.

Quote: Но в

Цитата:
Но в модемном интерфейсе 3 конечных точки - одна для прерывания и две bulk.

На самом деле там конечных точек больше. Они разделены по интерфейсам. Интерфейс преобразователя USB<->COM состоит из трёх точек: 0x84, 0x85, 0x04. Интерфес, через который пересылается команда AT+ZOPERTE, AT+ZOPRT, AT+CSQ и т.п. состоит из двух точек: 0x82, 0x02. Интерфейс, через который подключается microSD карта - тоже из двух: 0x03, 0x83

Интерфейс

ArtSh написал(а):
Цитата:
Но в модемном интерфейсе 3 конечных точки - одна для прерывания и две bulk.

На самом деле там конечных точек больше. Они разделены по интерфейсам. Интерфейс преобразователя 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 у меня это не получается: системный вызов на запись висит...

дубль

дубль

про имена ничего толком сказать не могу

Цитата:
А имена этих файлов определяет кто - MacOS? Туда установлен специфичный для данного устройства драйвер? Очень хорошое совпадение в названиях файлов.

Скорее всего, имена такие получаются когда я макосу сую драйвера. Которыйе есть под макос на там же Zero CD.

Драйвер

rootin написал(а):
Цитата:
А имена этих файлов определяет кто - MacOS? Туда установлен специфичный для данного устройства драйвер? Очень хорошое совпадение в названиях файлов.

Скорее всего, имена такие получаются когда я макосу сую драйвера. Которыйе есть под макос на там же 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

rootin написал(а):
Чорт, кажется я случайно не тот файл стер.. Не могли бы выслать то, чего нет в этом списке... там был еще один файл))

CD_STARTUP_FLAG
PCUI.VN
UimEfsAPDULLog.Txt
ZTEMODEM.ISO
hsunvitem.sav
pbm_master_v_20.dat
pbm_phone_uid.dat
reset_cntr.bin

А вот и ответ на мой вопрос. ZTEMODEM.ISO очевидно - образ того диска, который я вижу и монтирую, как /dev/sr0 (список файлов выше)!
Таким образом, я полагаю, можно подменить данный файл и загнать туда всё, что угодно! Отлично! Осталось только запустить сам модем без обрывов связи.

Ну этот момент

Ну этот момент меня уже меньше волнует.. Главное модем чтоб заработал как положено)

А по-моему

А по-моему здорово. Представляете - втыкаете данное устройство в любой компьютер, грузится Gentoo, и сразу в сети!

А вы не могли бы

А вы не могли бы мне помочь? Я про тот файлик который я случайно потер...)

Дружище ты не сможешь залить

Дружище ты не сможешь залить этот диск на мою почту плиз

может, будет

может, будет полезно http://www.linux-fueled.com/altro/comandi.pdf -список AT комнад

AT

rootin написал(а):
может, будет полезно http://www.linux-fueled.com/altro/comandi.pdf -список 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.

Программа пока сырая, без различных проверок, потом я её переделаю.

Прошу

Прошу протестировать!

Проблема решена

eugene_b написал(а):
Прошу протестировать!

Ну всё, теперь я уверен, проблема решена. Модем отработал ночь, уже более 6 часов. При этом совершенно чётко связь обрывалась раз в полтора часа. Как говорит pppd -
LCP terminated by peer
Connect time 90.2 minutes.
Этот обрыв связи, как известно, инициирован уже Билайном. pppd успешно автоматически восстанавливает связь.

Таким образом, модем работает.

UnBeeline.c

eugene_b написал(а):
Прошу протестировать!

На pppd ещё не проверял, но контакт с оператором уже не рвёт (синий светодиод
горит постоянно).

Победа

eugene_b написал(а):
Прошу протестировать!

Ну все, я протестировал. Вчера как включил в полночь, так до сих пор работает.
Предлагаю считать вопрос решённым.

Подтверждаю. И спасибо

Подтверждаю. И спасибо огромное...

Прошу прощения,

Прошу прощения, недосмотрел. После директив #include в треугольных строках стоят названия файлов.
#include stdio.h
#include string.h
#include usb.h
Нужно добавить треугольные скобки, они теряются при форматировании страницы в движке форума, т.к. в треугольных скобках стоят команды HTML. Я не знаю, как в форуме писать строки в треугольных скобках.

Кстати, для работы, естественно, должна быть установлена libusb.

Автоматизация через cron

eugene_b написал(а):
Пока я запускал её вручную, но можно, например, заставить это делать crond.

Пока я так и сделал - использовал 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

ArtSh написал(а):
Какая версия ядра?

2-6-20-gentoo-r8.
А есть ли разница? Здесь используется libusb (кстати, версия libusb-0.2.12-r1).

Quote: 2-6-20-gentoo-r8. А

Цитата:
2-6-20-gentoo-r8.
А есть ли разница? Здесь используется libusb (кстати, версия libusb-0.2.12-r1).

есть. На 2.6.26-r1 и 2.6.27 ENOENT - no such file or directory. С этим и есть проблема. А что касаемо родных дров, так это слегка изменённый option. Он работает точно также.

P.S. На счёт 2.6.27 я поторопился. Работает!!! Вот мой вариант программы:

#include usb.h
#include unistd.h
#include iostream //отладка
#include errno.h  //отладка
#include string.h //отладка

using namespace std;

void SendToDevice( char* bi, int &len, usb_dev_handle *udev)
{                                                           
    int t;                                                  
    t=usb_bulk_write(udev, 2, bi, len, 200);                
                                                            
    if(t<0)len=0;                                           
    else len=t;                                             
    if (t<0) cout t ":" strerror(errno) endl; cout t endl; //для отладки
}                                                               


int main(void)
{             
    struct usb_bus *bus=NULL;
    struct usb_device *dev=NULL;
    usb_dev_handle *udev=NULL;  
                                
    char com[]="AT+ZOPERTE=\"beeline\"\r\n";
    char initcom1[]="AT+ZOPRT=5\r\n";       
    char initcom2[]="AT+ZSTART\r\n";        
    char initcom3[]="AT+CPBS=\"SM\"\r\n";   
    char initcom4[]="AT+CPMS=\"SM\",\"SM\",\"\"\r\n";
    int lenc,lenc1,lenc2,lenc3,lenc4,len;              
                                                       
                                                       
                                                       
    usb_init();                                        
    usb_find_busses();                                 
    usb_find_devices();                                
                                                       
    //find device and open handle                      
    for (bus = usb_busses; bus; bus = bus->next)       
        for (dev = bus->devices; dev; dev = dev->next)
            if( (dev->descriptor.idVendor==6610) &&  ( dev->descriptor.idProduct==49) ) //0x19d2 0x0031
            {
                udev = usb_open(dev);
            }

    if(udev==0)return -1;

    usb_claim_interface(udev, 1);
    usb_set_altinterface(udev, 1);
    usb_resetep(udev, 1);

    lenc=0;while(com[lenc]!=0)lenc++;
    lenc1=0;while(initcom1[lenc1]!=0)lenc1++;
    lenc2=0;while(initcom2[lenc2]!=0)lenc2++;
    lenc3=0;while(initcom3[lenc3]!=0)lenc3++;
    lenc4=0;while(initcom4[lenc4]!=0)lenc4++;

    len=lenc;
    SendToDevice(com, len, udev);
    len=lenc1;
    SendToDevice(initcom1, len, udev);
    sleep(5);
    len=lenc;
    SendToDevice(com, len, udev);
    len=lenc2;
    SendToDevice(initcom2, len, udev);
    len=lenc3;
    SendToDevice(initcom3, len, udev);
    len=lenc4;
    SendToDevice(initcom4, len, udev);

    while(1)
    {
        sleep(59);
        len=lenc;

        SendToDevice(com, len, udev);
    }

    if(udev)usb_close(udev);

    return 0;
}

Ruby

А вот аналогичная программа на Ruby (unbeeline.rb):

#!/usr/bin/env ruby

require 'rubygems'
require 'usb'

def find_device (vendor, product)
  bus = USB.first_bus
  while bus != nil
    dev = bus.first_device
    while dev != nil
      return dev if dev.idVendor == vendor and dev.idProduct == product
      dev = dev.next
    end
    bus = bus.next
  end

  return nil
end

def send_msg (d, msg)
  d.usb_claim_interface 1
  d.usb_set_altinterface 1
  d.usb_bulk_write 2, msg, 1000
  d.usb_release_interface 1
end

puts "Looking for ZTE MF626 modem"
unless (zteModem = find_device(0x19d2, 0x0031)) == nil
  puts "ZTE MF626 modem found"

  d = zteModem.usb_open

  send_msg d, "AT+CFUN=1\r\n"
  puts "\'Revival\' command sent to NMEA interface"

  `modprobe usbserial vendor=0x19d2 product=0x0031`
  puts 'ttyUSB0 device created'

  while true
    sleep 60
    send_msg d, "AT+ZOPERTE=\"beeline\"\r\n"
    puts "\'Alive\' command sent to NMEA interface"
  end

  d.usb_close
else
  puts "ZTE MF626 modem not found"
end

Требуется интерпретатор 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:

def send_msg (d, msg)
  d.usb_claim_interface 1
  d.usb_set_altinterface 1
  d.usb_bulk_write 2, msg, 1000
  d.usb_release_interface 1
end

Quote: Я симку из модема

Цитата:
Я симку из модема вообще не вынимал. Модем вырубался как раз из-за этого цикла. Когда я его закоментировал и каждую минуту запускал прогу UnBeeline без цикла while, модем не отключался.

Сегодня я посмотрел по подробнее, скорее всего, если послать 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-ки, вероятно, надо

Цитата:
SMS-ки, вероятно, надо слать через основной порт,

Тут без экспериментов не обойтись...

Я пробовал давать модему

Сорри, дубль вышел

$BOC(\pi, e)$

Вот лог

Вот лог USB-сниффера

Цитата:
000334: Bulk or Interrupt Transfer (DOWN), 15.10.2008 02:57:29.546 +6.468 Pipe Handle: 0x890ec36c (Endpoint Address: 0x2) Send 0x13 bytes to the device

41 54 2B 43 55 53 44 3D 31 2C 2A 31 30 32 23 2C
31 35 0D

AT+CUSD=1,*102#,
15.

000335: Bulk or Interrupt Transfer (UP), 15.10.2008 02:57:29.546 +0.0. Status: 0x00000000 Pipe Handle: 0x890ec36c (Endpoint Address: 0x2) Send 0x13 bytes to the device

000336: Bulk or Interrupt Transfer (UP), 15.10.2008 02:57:29.578 +0.031. Status: 0x00000000 Pipe Handle: 0x890ec34c (Endpoint Address: 0x82) Get 0x6 bytes from the device

0D 0A 4F 4B 0D 0A

..OK..

000337: Bulk or Interrupt Transfer (DOWN), 15.10.2008 02:57:29.578 +0.0 Pipe Handle: 0x890ec34c (Endpoint Address: 0x82) Get 0x1000 bytes from the device

000338: Bulk or Interrupt Transfer (UP), 15.10.2008 02:57:33.328 +3.750. Status: 0x00000000 Pipe Handle: 0x890ec34c (Endpoint Address: 0x82) Get 0x112 bytes from the device

0D 0A 2B 43 55 53 44 3A 20 30 2C 22 30 34 31 31
30 34 33 30 30 34 33 42 30 34 33 30 30 34 33 44
30 34 34 31 30 30 32 30 30 30 33 36 30 30 33 35
30 30 33 32 30 30 32 45 30 30 33 34 30 30 33 39
30 30 32 30 30 34 34 30 30 30 32 45 30 30 32 30
30 34 32 32 30 34 34 30 30 34 33 30 30 34 34 34
30 34 33 38 30 34 33 41 30 30 32 30 30 30 33 30
30 30 32 45 30 30 33 30 30 30 32 30 30 34 31 41
30 34 33 31 30 30 32 45 30 34 31 34 30 34 33 35
30 34 34 32 30 34 33 30 30 34 33 42 30 34 33 38
30 30 33 41 30 30 32 30 30 30 36 38 30 30 37 34
30 30 37 34 30 30 37 30 30 30 37 33 30 30 33 41
30 30 32 46 30 30 32 46 30 30 37 35 30 30 37 33
30 30 36 43 30 30 37 35 30 30 36 37 30 30 36 39
30 30 32 45 30 30 36 32 30 30 36 35 30 30 36 35
30 30 36 43 30 30 36 39 30 30 36 45 30 30 36 35
30 30 32 45 30 30 37 32 30 30 37 35 22 2C 37 32
0D 0A

..+CUSD: 0,"0411
0430043B0430043D
0441002000360035
0032002E00340039
00200440002E0020
0422044004300444
0438043A00200030
002E00300020041A
0431002E04140435
04420430043B0438
003A002000680074
007400700073003A
002F002F00750073
006C007500670069
002E006200650065
006C0069006E0065
002E00720075",72
..

то что в кавычках - текст в кодировке 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: Непонятно насчёт

Цитата:
Непонятно насчёт трафика 0.0 кБ

Это значит что либо предоплаченный трафик закончился, либо его не было (например на ночном безлимите).

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++) {
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] = s[i+12];
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: Почему бы не получать

Цитата:
Почему бы не получать ответ из endpoint 0x82, ведь порт ttyUSB0 (который, кстати, может меняться) занят pppd?

Я действовал по той же логике, что и родная виндовая программа. Когда pppd отключён, модем принимает команды через 0x02 а отсылает ответ через ttyUSB (это я установил экспериментальным путём). Как модем будет действовать когда pppd подключён я не знаю. Вполне может быть что он пошлёт ответ через 0x82, а может быть и нет. Надо пробовать. Модифицировать программу не сложно...

Так я пробовал - работает,

Так я пробовал - работает, листинг программы приведён выше.

$BOC(\pi, e)$

Может просветите почему

Может просветите почему приходится писать сразу в эндпоинт
а не в ttyUSB1 например?

ttyUSB

Файл устройства ttyUSB* поддерживается модулем usb_serial, рассчитанным на определённый интерфейс со стороны USB-устройства (на определённый набор оконечных точек). В данном модеме для отправки AT-команд используется нестандартный интерфейс, не используемый модулем usb_serial. Вполне возмножно, что данный модуль несложно научить работать с оконечными точками 0x02 и 0x82 данного модема, однако проще оказалось отправлять сообщения через libusb из пользовательского режима, не изменяя модули ядра.

$BOC(\pi, e)$

Quote: Может просветите

Цитата:
Может просветите почему приходится писать сразу в эндпоинт
а не в ttyUSB1 например?

Всё очень просто. Стандартный преобразователь 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

ArtSh написал(а):
Может просветите почему приходится писать сразу в эндпоинт
а не в ttyUSB1 например?

хорошо, я прописал в option VID модема, получил 3 порта ttyUSB{1,2,3}
но пообщаться терминалкой всеравно можно только с одним (в винде с двумя можно)
может в option драйвере еще что-то покрутить?
(хочется иметь возможность работать с смсками и pppd одновременно, вот и пытаюсь поднять оба порта нормальным способом)

Не могу запустить usbserial

Подключаю модем пишу eject /dev/sr0
в lsusb -v

Bus 002 Device 018: ID 19d2:0031
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x19d2
  idProduct          0x0031
  bcdDevice            0.00
  iManufacturer           2 ZTE, Incorporated
  iProduct                1 ZTE CDMA Technologies MSM
  iSerial                 3 1234567890ABCDEF

Затем пишу в консоль modprobe usbserial vendor=0x19d2 product=0x0031 ответ

host13 / # modprobe usbserial vendor=0x19d2 product=0x0031
FATAL: Error inserting usbserial (/lib/modules/2.6.23-gentoo-r9/kernel/drivers/usb/serial/usbserial.ko): Unknown symbol in module, or unknown parameter (see dmesg)

В dmesg следующее

usb 2-4: USB disconnect, address 17
usb 2-4: new high speed USB device using ehci_hcd and address 18
usb 2-4: configuration #1 chosen from 1 choice
scsi17 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 18
usb-storage: waiting for device to settle before scanning
scsi 17:0:0:0: Direct-Access     ZTE      MMC Storage      322  PQ: 0 ANSI: 2
sd 17:0:0:0: [sdb] Attached SCSI removable disk
sd 17:0:0:0: Attached scsi generic sg1 type 0
usb-storage: device scan complete
usbserial: Unknown parameter `vendor'

Не могу понять что не так делаю...

Скорее всего драйвер generic

Скорее всего драйвер generic не включён в конфиге ядра. Давайте вывод zcat /proc/config.gz|grep USB_SERIAL

Спасибо! заработало!

Спасибо! заработало!

собрал новое ядро 2.6.27 Не

собрал новое ядро 2.6.27 Не могу переключить в режим модема так как не появляется устройство sr0 в dmesg...

usb-storage: USB Mass Storage device detected
usb-storage: -- associate_dev
usb-storage: Vendor: 0x19d2, Product: 0x2000, Revision: 0x0000
usb-storage: Interface Subclass: 0x05, Protocol: 0x50
usb-storage: device ignored
usb-storage: storage_probe() failed
usb-storage: -- usb_stor_release_resources
usb-storage: -- sending exit command to thread
usb-storage: -- dissociate_dev

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".