LINUX.ORG.RU

Принять звонок 3g модема из консоли


2

4

Здравствуйте, являюсь обладателем 3g модема huawei E171 от МТС, он поддерживает голосовые звонки, смс и интернет. Для мака и винды для этого модема есть софт с помощью которого можно слать смс сидеть в нете и звонить. В линуксе я справился с задачей отправки/приема смс, теперь мне нужно следующее: Когда я звоню на этот модем, комп должен взять трубку и включить микрофон, в телефоне я буду слышать все, что происходит рядом с компом, небольшая система безопасности.

★★

Если «модем» прикидывается serial-портом, то при входящем звонке он отдает в порт строчки

RINGING
RINGING
RINGING
RINGING

а если надо снять трубку, командуем в порт

ATA

no-dashi ★★★★★ ()
Ответ на: комментарий от no-dashi

При входящем звонке он отдает команду RING. Это отслеживает мой скрипт, затем тот же скрипт шлет команду ATA, и модем снимает трубку, а как с микрофона аудио передать на модем не знаю! При подключении модема появляются 3 устройтсва ttyUSB0,ttyUSB1,ttyUSB2

aivs ★★ ()

Мне известна только вот эта штука: http://forge.asterisk.org/gf/project/chan_datacard/. Это модуль для asterisk'а, который может использовать модемы huawei. Насчёт наличия чего-либо более простого в использовании и подходящего под задачу - хз. Простого способа программно «соединить» микрофон с 3G-модемом точно нет.

Deleted ()
Ответ на: комментарий от aivs

При входящем звонке он отдает команду RING. Это отслеживает мой скрипт, затем тот же скрипт шлет команду ATA, и модем снимает трубку, а как с микрофона аудио передать на модем не знаю! При подключении модема появляются 3 устройтсва ttyUSB0,ttyUSB1,ttyUSB2

Судя по всему, аудио-данные (закодированные каким-то кодеком из семейства GSM) нужно писать и читать из ttyUSB1...

ArtSh ★★★ ()
Ответ на: комментарий от ArtSh

Подсказали что аудио-данные должны быть посылаться пакетами по 320 байт каждые 20 мс в формате slin. Вот как создать поток в таком формате и порциями направлять на ttyUSB1, по не могу сделать.

aivs ★★ ()
Ответ на: комментарий от aivs

320 байт за 20мс, по моему, маловато. По крайней мере, конечные точки типа bulk по стандарту USB 2.0 предназначены для пересылки больших объёмов данных, блоками по 512 байт. Что же касается формата slin, то это 16 bit Signed Linear PCM. Поэтому, читайте http://www.linuxjournal.com/article/6735 и действуйте по аналогии.

ArtSh ★★★ ()
20 марта 2012 г.
Ответ на: комментарий от aivs

Столкнулся с подобной задачей! Получилось ли у вас отослать голосовые данные на модем? и если да поделитесь советом как это реализовать?

outgluk ()
Ответ на: комментарий от mumpster

Тут дело не в том как создан фаил и сжат он или нет тут дело в передачи этого файла через GSM соединение! то есть как происходит передача пакетами или идёт потоком тут в этом дело!!!

outgluk ()
Ответ на: комментарий от outgluk

хз. думаю что что надо копать стандарты на GSM. :-(
либо reverse-eng .:)

mumpster ★★★★★ ()
Ответ на: комментарий от outgluk

Тут дело не в том как создан фаил и сжат он или нет тут дело в передачи этого файла через GSM соединение! то есть как происходит передача пакетами или идёт потоком тут в этом дело!!!

Вы не пробовали просто послать звук формата 16 bit Signed Linear PCM в /dev/ttyUSB1, например так cat sound.wav >/dev/ttyUSB1?

ArtSh ★★★ ()
Ответ на: комментарий от mumpster

как ты себе это представляешь? там же AT-команды ожидаются (GSM subset)

Зря не пробовали. В ttyUSBx можно посылать всё что угодно, просто модем отвечает только на то что понимает. AT-команды ожидаются в USB0 (ppp-сессия) и USB2 (контрольный интерфейс). Перечитайте тред внимательнее, узнаете много нового.

ArtSh ★★★ ()

А вообще тут кто-нибудь засовывал сотовую связь в софтфоны через huawei-мопеды? Астериск такое потянет?

pekmop1024 ★★★★★ ()
Ответ на: комментарий от ArtSh

2ArtSh Пробывал посылать тишина в трубке, игрался с форматом выходного wav файла! при чём на обычно dial-up модеме проверил он мне с первого раза проиграл в трубку wav.

outgluk ()
Ответ на: комментарий от outgluk

После того, как послали команду ATA\r, пошлите команду AT^DDSETEX=2\r

ArtSh ★★★ ()
Ответ на: комментарий от ArtSh

Спасибо большое! в системе два модема ZTE 180S и Huawei E1550 система определяет так: ZTE /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 симлинки соответсвенно ZTE_MODEM[0-2] Пока не разобрался как заставить работать!

Huawei /dev/ttyUSB3 /dev/ttyUSB4 /dev/ttyUSB5 симлинки соответсвенно HUAWEI_MODEM[3-5] команды шлю для Huawei в /dev/ttyUSB5 команда AT^CVOICE? возвращает

^CVOICE:0,8000,16,20 OK

команда cat test.wav > /dev/ttyUSB4 в трубке слышится кряхтение и шипение значит в порт пишутся данные и то что в трубке не тишина уже радует

Снял показания снифом в винде и обнаружил что если скидывать всё что приходит с аудио порта модема в wav там не хватает 44 байта что соответствует заголовку wav файла теперь разбираюсь с форматом файла, проигрывать в порт wav блоками по 320 байт или как то иначе ? сейчас буду проверять как подготовить wav файл что бы он нормально воспроизводился!

outgluk ()
Ответ на: комментарий от minakov

Точно проверенно! Для свистков от Huawei нада: Писать в порт буфер в 320 байт каждые 0,2 секунды! файл wav или другой паток формата PCM 8000Гц 16 bit Mono (для файла смещение на длину заголовка 44 байта) по быстрому накатал для проверки на дельфях (не было под рукой компилятора С) прожку и услышал свой wav фаил!!!

Спасибо ArtSh!!! за подсказки с АТ командами

outgluk ()
Ответ на: комментарий от ArtSh

Накатал скрипт на Perl но он не оправдал мои ожидания в трубки слышатся треск и шипение по длительности точно такое же как фаил. по идеи должен проиграть фаил и повесить трубку!

#!/usr/bin/perl use IO::File;

$OPT_I = «/dev/ttyUSB4»; $OPT_O = «/dev/ttyUSB5»; $PATH_WAV = «/home/123.wav»;

open (SENDPORT, '+<', $OPT_O) or die «Can't open '$OPT_O': $!\n»; print SENDPORT «ATA\r»; while (<SENDPORT>) { if ($_ eq «^CONN:1») {

} last; } print SENDPORT «AT^DDSETEX=2\r»; close SENDPORT;

open (SENDPORT_WAV, '+<', $OPT_I) or die «Can't open '$OPT_I': $!\n»; my $FILE = new IO::File «< $PATH_WAV» or die «Cannot open $PATH_WAV : $!»; binmode($FILE); my $BUFER; my $BUFLEN = 320; seek($FILE,44,0);

while (read($FILE,$BUFER,$BUFLEN)) {

print SENDPORT_WAV $BUFER; sleep(0.2); }

close SENDPORT_WAV;

open (SENDPORT, '+<', $OPT_O) or die «Can't open '$OPT_O': $!\n»; print SENDPORT «AT+CHUP\r»; close SENDPORT;

outgluk ()
Ответ на: комментарий от outgluk

Издеваешся? Использовать кривые реализации скриптов,в которых даже стабильного АПИ нет?(питон/перл/и все подобное-включая QT) Там нету четкой документации как сейчас реализованы теже буферы-т.е. вот тебе недо размер 320-а размер буфератам может определятся ОС,та и чемугодно-оно все невообразимо криво...

Только Си можно использовать когда тебе нужно чтоб работало-а не выискивать что в этой реализации интерпретатора/компилятора С++ под эту ос НЕЛЬЗЯ создавать строки длиной 15 символов(образно к примеру,но случай реальный)...Только Си.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.