PDA

Просмотр полной версии : Получение голоса с Huawei E1550 сторонними программами


Raiv_ixx
03.09.2010, 15:55
Ситуация:
У меня есть E1550 от мтс, в родной программе звонки работают, всё разлочено.
Мне требуется написать софт на С++, который бы работал со звонками аналогично софту от МТС. С терминала команда ATD принимается, но звука нет. В программе от МТС всё работает.
Кто знает, где отловить звук, и в каком он идет формате?

iganshan
03.09.2010, 16:11
Ситуация:
У меня есть E1550 от мтс, в родной программе звонки работают, всё разлочено.
Мне требуется написать софт на С++, который бы работал со звонками аналогично софту от МТС. С терминала команда ATD принимается, но звука нет. В программе от МТС всё работает.
Кто знает, где отловить звук, и в каком он идет формате?

подобную проблему (пулл из 20 модемов E1550) знакомый решил с помощью http://www.asterisk.org/
Работает только на линухе.

Raiv_ixx
03.09.2010, 16:22
У меня ограничение WinXP-Vista-7:(

iganshan
03.09.2010, 18:49
Ситуация:
С терминала команда ATD принимается, но звука нет. В программе от МТС всё работает.


Ставьте снифер ком порта и смотрите обмен модема со сьютой в момент дозвона.

p.s. попробуйте atd; (добавить точку с запятой, без неё модем считает что идёт обмен данными, если я ничего не путаю)

Raiv_ixx
06.09.2010, 10:43
Да, идея со снифером хорошая.
Ща попробую:)

Raiv_ixx
07.09.2010, 12:54
Так... по результатам пробования снифферов.
попробовал два:
HDD free serial port monitor - перестает работать после первых пары пакетов.
Com port toolkit - вообще не работает:(
Ктонибудь посоветует нормальный сниффер для WinXP?

BurlakovSG
08.10.2010, 12:29
Голос идёт по другому порту (HUAWEI Mobile Connect - 3G Application Interface) и активируется командой AT^DDSETEX=2 после команды ATD. Звук передаётся в формате PCM.

Для прослушивания СОМ портов я использовал программу portmon.

vanesko
21.09.2011, 11:06
Голос идёт по другому порту (HUAWEI Mobile Connect - 3G Application Interface) и активируется командой AT^DDSETEX=2 после команды ATD. Звук передаётся в формате PCM.

Для прослушивания СОМ портов я использовал программу portmon.

Пишу аналогичную программу на delphi. Какова частота дискретизации и битовое разрешение выборки?

Raiv_ixx
23.09.2011, 23:02
Пишу аналогичную программу на delphi. Какова частота дискретизации и битовое разрешение выборки?

канал моно, частота 8000, размер 16 бит, сэмплы знаковые.

vanesko
24.09.2011, 13:58
канал моно, частота 8000, размер 16 бит, сэмплы знаковые.

Срасибо огромное, буду пробовать. Нет случайно примера на любом языке программирования по работе с портом звука для E1550? И еще вопрос. Как узнать в программе какие COM-порты соответствуют модему? COM-порт, в который посылаются AT команды найти не проблема, просто шлем туда AT и ждем ответа OK. А как определить порт, по которому идет звук?

Raiv_ixx
25.09.2011, 00:25
Срасибо огромное, буду пробовать. Нет случайно примера на любом языке программирования по работе с портом звука для E1550?

Есть но на работе. могу потом кинуть. там RAW PCM. читаешь его байтами и пишешь... 160 байт по-моему размер пакета, или 320, не помню точно.

исходящий звук: кодировщик в рсм-> выходные данные - пишешь в порт
входящий звук - читаешь с порта -> гонишь в декодировщик
проигрывание raw pcm в дельфях гугли - я с дельфями такого не делал) По идее должно работать через DirectSound.

И еще вопрос. Как узнать в программе какие COM-порты соответствуют модему? COM-порт, в который посылаются AT команды найти не проблема, просто шлем туда AT и ждем ответа OK. А как определить порт, по которому идет звук?

Ищи в установленных драйверах драйвер с именем "HUAWEI Mobile Connect - 3G Application Interface", у него пропертя "порт" - там ком-порт звука. На си для этого используется набор функций вида "SetupDi..." из Windows DDK. Возможно их както удастся тебе проэкспортить, см. например тут (http://www.rsdn.ru/forum/delphi/451928.all.aspx).

vanesko
25.09.2011, 02:02
Есть но на работе. могу потом кинуть. там RAW PCM. читаешь его байтами и пишешь... 160 байт по-моему размер пакета, или 320, не помню точно.


Не могли бы Вы кинуть при случае? Чтобы уже окончательно во всем разобраться. Заранее спасибо!

om2804
13.01.2012, 17:11
Raiv_ixx, подкинешь сорцы?

Autumnus
08.03.2012, 23:35
Размер пакета 320 байт. У кого-то получилось читать и писать голос?
Тоже сижу с аналогичной ситуацией.
--------------------------------------------------------------
Сделал чтение звуковых данных и их запись в файл
а вот когда из этого файла передаю данные обратно в порт, то слышны какие-то отрывки, такое ощущение, что воспринимаются только куски.
http://depositfiles точка ком files/9djo6h3z
исходник

duser
09.03.2012, 13:01
Здравствуйте Autumnus...

А как Вы это сделали? Можете исходником поделиться?!
Ваша ссылка на депозитфайлс не активна.

Спасибо
С Уважением duser
------------------------------------------------
Добавлено позже:
Пишет: Либо файл не существует или была удалена из-за нарушения авторских прав.

Autumnus
09.03.2012, 14:04
ввв getzilla точка нэт /files/3057162/gsm.rar.html
ps как тут ссылки нормально выкладывать без звездочек?

duser
09.03.2012, 14:41
Если время будет, можете более подробно описать исходный код...

Autumnus
10.03.2012, 20:13
гетзилла.нэт
files/3068525/gsm.rar.html
реализовано проигрывание звука из файла в аудиопорт и запись аудио из порта в wav файл. снабдил исходник некоторыми комментариями и добавил отсылку и получение смс. будут вопросы отвечу.
Код писался в Delphi 5 с компонентом ApdComPort из AsyncPro 4.07.

duser
12.03.2012, 14:51
Здравствуйте Autumnus...

Если у Вас что-то доработано пожалуйста дайте ссылку...

Мучаюсь разработкой проги, которая должна как минимум повторять функционал MTS Connect (особенно голосовые звонки, через наушники, микрофон...)(даа, круто сказано...) :)

Или может нужно пользоваться вот этими компонентами, как Вы думаете "Как превратить «сырое» аудио в файл wav (или другой формат)?" ссылка http://symmetrica.net/audio/newac-tech.htm

С Уважением duser

duser
13.03.2012, 14:45
И ёще код в Вашем исходнике, которой создает wav файл, у меня не проигрывается, даже не открывается проигрывателем? В чем может быть дело??? :confused:

Autumnus
13.03.2012, 16:59
Работу со звуком я доделаю, у меня это был отдельный проект, только сейчас со временем плохо. Как доберусь, так объединю.

Wav файл состоит из заголовка 44 байт + данные:
52 49 46 46 xx xx xx xx 57 41 56 45 66 6D 74 20
10 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00
02 00 10 00 64 61 74 61 yy yy yy yy .. данные ..
это стандартный заголовок для наших нужд, меняться будут лишь x и y, при этом, y= размер данных в байтах, а x=y-8. Проверьте, верно ли сформирован заголовок.
Или так, y=размер файла-44.

duser
13.03.2012, 17:19
Да Спасибо со звуком вроде справился, записывается в файл и с проигрыванием проблем нет, buf: string; string заменил на AnsiString и все заработало...

Скажите пожалуйста Autumnus, а можно ли записывать PCM данные с микрофона в порт?

Autumnus
13.03.2012, 18:44
C микрофона звук идет по такому же принципу, как и через порт. В данном случае необходимо настроить микрофон на тот же формат и брать буфер равным 320 байт, при заполнении которого пересылать данные в порт. Если память не изменяет, для получения звука я использовал компонент из DelphiX. Хотя могу и наврать )
Постараюсь найти время и глянуть.
------------------------------------------------
Добавлено позже:
Наврал ))
Это куски кода, которые осуществляют получение звукового потока из микрофона (ну или другого выбранного устройства в микшере)


WavBufLen=10;
FCapture: TSoundCaptureStream;
FWaveStream: TWaveStream;


ShellMW.FWaveStream := TWaveFileStream.Create(ShellMW.LastFile, fmCreate);
with ShellMW.FCapture.SupportedFormats[SoundFormatIndex] do ShellMW.FWaveStream.SetPCMFormat(SamplesPerSec, BitsPerSample, Channels); //здесь задаются параметры входного сигнала
ShellMW.FWaveStream.Open(true);

ShellMW.FCapture.BufferLength:=WavBufLen;
ShellMW.FCapture.OnFilledBuffer:=ShellMW.CaptureFilledBuffer;
ShellMW.FCapture.CaptureFormat:=SoundFormatIndex;
ShellMW.FCapture.Start;

procedure TShellMW.CaptureFilledBuffer(Sender: TObject);
var
work_buffer: array [0..999] of byte;
i: integer;
begin
Fcapture.Read(work_buffer, 200);
end;

процедура CaptureFilledBuffer срабатывает каждый раз при заполнении буфера

наводку дал, пока много времени нет, когда напишу то выложу ;)

Autumnus
15.03.2012, 22:04
duser, ну как, помогло?

duser
16.03.2012, 12:25
Здравствуйте Autumnus...

Спасибо что написали!

... Да как-то со временем у меня не получилось, сегодня завтра посмотрю. И еще много вопросов возникают. :confused:

1. Прога записывает в файл без проблем (взято из Вашего кода).
Вопрос: Как можно параллельно воспроизвести этот кусок RAW PCM?

2. И еще не успел проанализировать Ваш последний код (с микрофоном...) т.е. записывать PCM данные с микрофона в порт?

3. В Зависимости от условия, записывать данные в файл, в один файл, целиком и звук и данные с микрофона (т.е. тел. разговор...)???

Вот такие вопросы??? Если время будет пишите!

С уважением duser...

Autumnus
16.03.2012, 13:05
1. В аудиоустройство данные записываются так же - потоком. Т.е. буфер записывается в файл и этот же буфер отправляем в аудиоустройство.
2....
3. Скорее всего данные в порту будут смешиваться. Даже не придется отдельно выводить каждый поток в аудиоустройство. В общем нужно попробовать. А если не будут - то большой проблемы тоже не вижу buf_out[i]:=buf1[i]+buf2[i];

duser
16.03.2012, 16:10
Спасибо Autumnus, попробую разобраться...

duser
17.03.2012, 11:40
Да никак не получается с параллельным проигрыванием... :confused::confused:
---------------------------------------------------------------------
Здравствуйте Autumnus...

Вроде бы этот код должен воспроизвести RAW PCM из буфера..., или я не правильно делаю???

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
...


bufStream := 'RIFF WAVEfmt '+#$10+#0+#0+#0+#01+#0+#01+#0+#$40+#$1F+#0+#0+#$80+#$3E+#0+#0+#02+#0+#$10+#0+'data ';

ApdComPort1.GetBlock(buf, Count);

with TMemoryStream.Create do begin
try
SetSize(44 + Count);
Seek(0, soFromBeginning);
WriteBuffer(bufStream[1], 44);
Seek(44, soFromBeginning);
WriteBuffer(buf, Count);
Seek(4, soFromBeginning);
dk:=Count-8;
WriteBuffer(dk, 4);
Seek(40, soFromBeginning);
WriteBuffer(Count, 4);
Seek(0, soFromBeginning);

PlaySound(Memory, 0, SND_MEMORY or SND_SYNC);
finally
Free;
end;
end;
...
end;

Autumnus
18.03.2012, 09:03
http://www.delphisources.ru/pages/faq/base/about_sound_again.html
http://www.delphisources.ru/pages/faq/base/waveform_audio_win32_api.html
можно покопаться вот тут
а по поводу примера - можно проигрывать данные по 320 байт, это во-первых, а во-вторых, Memory не вижу как связаны Memory и TMemoryStream

думаю, лучше всё-таки порциями через waveOutWrite звук выводить

duser
18.03.2012, 09:30
Здравствуйте Autumnus

На счет Memory (с помощью with)...

with TMemoryStream.Create do begin
PlaySound(Memory, 0, SND_MEMORY or SND_SYNC);
end;

или

OutStream = TMemoryStream.Create;
PlaySound(OutStream.Memory, 0, SND_MEMORY or SND_SYNC);
...

В отдельные потоки передаю stream, что-то тормоз получается (не синхронно, с обрывами)...
Да верно говорите, надо как-то по другому нужно воспроизвести.
Суть ясна, проблема именно в реализации... :confused:
Спасибо за ссылки...

Autumnus
18.03.2012, 20:26
Тормозит из-за того, что звук идет маленькими порциями. Можно попробовать двойную буферизацию. Т.е. два массива - из одного проигрывается, а в другой пишется. Думаю здесь это лучше реализовать через потоки.

duser
19.03.2012, 10:12
Здравствуйте Autumnus

Если Вам Нетрудно!, можете привести код (пример для Нашего случая, т.е. синхронно проигрывался звук с порта.......)

:confused:

...
Спасибо...

Autumnus
29.03.2012, 17:18
Здравствуйте Autumnus

Если Вам Нетрудно!, можете привести код (пример для Нашего случая, т.е. синхронно проигрывался звук с порта.......)

:confused:

...
Спасибо...

Пока сам еще этим не занимался.

Как успехи, что-то получилось?

duser
30.03.2012, 09:32
Здравствуйте Autumnus

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

А Вы можете мне помочь в реализации следующей задачи?...

1. С модемом идет родная программа, там есть весь функционал (звонилка, смс и т.д. ...)

2. Пока что для звонков буду использовать родную программу, мне нужно будет просто захватить разговор и записывать в файл.

3. Когда запускается эта программа, Мы знаем что она блокирует порт HUAWEI Mobile Connect - 3G Application Interface. ВОПРОС. Можно ли параллельно получить доступ к этому порту??? (хотя наверно нет...)

4. Если невозможно получить доступ к этому порту, как записать звук с компьютера, т.е. как понимаю с микшера (звук+микрофон...)???
Вчера скачал компоненты AudioLab, там есть компонент SystemMixer. Никак не могу понять как с этим компонентом можно захватить звук и записывать в файл???...

Спасибо
С Уважением duser

Autumnus
30.03.2012, 09:44
Здравствуйте, duser!
Подключиться к порту можно программой Advanced Serial Port Monitor. В своё время она мне здорово помогла разобраться в работе модема. Это сниффер. Можно наглядно смотреть что в порт пишется и что из него читается. Через эту программу так же хорошо видно, как идёт голосовой поток - по 320 байт туда и сюда.

Удачи!

duser
30.03.2012, 09:49
Спасибо Autumnus!
Вы не подскажите как можно из Delphi подключится к этому порту параллельно, т.е. когда я запускаю родную программу модема, этот порт блокируется...
-------------------------------------------------------
Спасибо Autumnus!
Advanced Serial Port Monitor то что нужно ... Но
Есть ли готовые компоненты, или пример на Delphi, открыть порт в режиме сниффера???

g_grey
25.04.2012, 00:40
гетзилла.нэт
files/3068525/gsm.rar.html
реализовано проигрывание звука из файла в аудиопорт и запись аудио из порта в wav файл. снабдил исходник некоторыми комментариями и добавил отсылку и получение смс. будут вопросы отвечу.
Код писался в Delphi 5 с компонентом ApdComPort из AsyncPro 4.07.

Пожалуйста, помогите со следующим вопросом по данной программе:
при записи звукового файла (8000Гц, 16бит, удалил первые 44 байта) в порт, в телефоне только слышен очень короткий шум, а в программе в memo выводится "block is empty 1".

g_grey
28.04.2012, 00:10
гетзилла.нэт
files/3068525/gsm.rar.html
реализовано проигрывание звука из файла в аудиопорт и запись аудио из порта в wav файл. снабдил исходник некоторыми комментариями и добавил отсылку и получение смс. будут вопросы отвечу.
Код писался в Delphi 5 с компонентом ApdComPort из AsyncPro 4.07.

Получилось у кого-то проигрывание звука в аудиопорт?

Autumnus
06.05.2012, 16:11
Проблема в том, что нужно подавать данные по счетчику. Т.е. не весь буффер целиком и за раз. А рассчитать сколько блоков в секунду. В исходнике эта проблема решена.

g_grey
06.05.2012, 20:07
Проблема в том, что нужно подавать данные по счетчику. Т.е. не весь буффер целиком и за раз. А рассчитать сколько блоков в секунду. В исходнике эта проблема решена.

За исходники огромное спасибо!
Меня остановила описанная выше проблема и комментарий в исходнике "но это почему-то не работает" в процедуре ApdComPort2TriggerOutbuffFree.
Если исходник рабочий, попробую поискать у себя проблему.

ilya-nk
07.05.2012, 09:23
Благодарю за исходники.
При попытке приёма возникает ошибка переполнения стека.

Как организовать синхронную запись\чтение в порт?

Autumnus
09.07.2012, 13:29
Долго не мог зайти. Почему-то в IE страница до конца не открывалась. Только шапочка. С файерфокса всё теперь открылось нормально.
Исходники я выкладывал, если ссылки битые, то перезалью. Проблему отправки голоса можно решить отправляя буфера по таймеру в порт. Размер буфера должен быть 320 байт.

VitSVA
12.09.2012, 18:46
Кто может помочь с проблемой передачи данных к com порт модема! Хотя бы ссылки дайте!
Это известно: для Huawei звук идет в порт HUAWEI Mobile Connect - 3G Application Interface, после того как скажешь ему AT^DDSETEX=2.
Звук идет по порту в формате PCM 8000fps 16бит signed.
А вот как получить данные с com порта и вывести на компьютор (колонки) и как взять с микрофона звук порциями по 320 байт и передовать в com порт модема?
Если есть пример с описанием вообще хорошо!

Vituskosoy
13.09.2012, 08:10
VitSVA, научись сперва сохранять и воспроизводить wav-файл с помощью waveIn/waveOut-функций (примеров полно), а потом уже легко привяжеш к модему.
А готовый отшлифованый пример врядли кто-то выложит, пока такие программы используются в комерческих целях. Сам помучишся и посмотрим, выложиш ли ты...
Если хочеш, можеш поковырять в Asterisk модуль chan_dongle, там есть все, открытые коды, но под линух.

Eryoma85
13.11.2013, 04:49
Здравствуйте уважаемые форумчане!
Решил написать программу как у МТС - естественно с своим дизайном и функционалом. Как это сделать пока не пойму (в части передачи звука из микрофона или аудиофайла - например автоответчик). ссылки на примеры которые здесь выложены уже мертвые. Может кто-нибудь поможет примером или советом.... буду очень признателен.

Autumnus
21.12.2013, 11:10
Исходники
http://kronosa.ru/gsm.rar

Autumnus
03.09.2014, 08:32
Доброе время суток!
Исходником не занимался всё это время. Времени нет. Насколько я помню, возможно, wav пишется без заголовка. Заголовок у файла не такой уж и сложный, можно посмотреть описание и сам файл в шестнадцатиричном виде и сорентироваться.
Файл перезалил, доступен http://kronosa.ru/gsm.rar

По преобразованию сырого аудио в вав-файл могу сказать, что нужно добавить только заголовок. Но это будет не сжатый PCM.

pochekutov
26.02.2016, 09:00
Доброе время суток!
Исходником не занимался всё это время.


Актуально. Выложи, пожалуйста, исходники. Ссылка kronosa.ru/gsm.rar не работает.