Pull to refresh

Comments 19

Хм, спасибо! Очень хорошая работа по собиранию всей информации в одну программу, в будущем эти наработки, думаю, мне понадобятся =)
А чтобы не задавать номера портов вручную в скрипте а определять автоматически не экспериментировали?
Мысли такие посещали, но все бегом бегом, так и оставил выбор портов вручную.
А сделать изменения например ожидание нажатия кнопки 1 или 0 сложно доработать?
Вы имеете ввиду голосовое меню?
Такие изменения сделать можно. Но нужно учесть что для того чтобы принимать данные о нажатых кнопках на телефоне (по моему эта информация передается в виде USSD, но полной уверенности нет) во время разговора (в голосовой порт пишутся аудиоданные каждые 0.02 секунды) можно поступить 2-я способами:
1. чтение данных из командного в параллельном потоке (возможны различные варианты: fork, thread, и по моему был модуль в составе IO умеющий распараллеливать процессы чтения и записи. В случае с fork и thread нужно организовать межпроцессное взаимодействие помоему)
2. неблокирующее чтение данных из командного порта (в этом подходе так же есть свои нюансы)
Немного почитав доку — выяснил что во время звонка нажатия кнопок передаются как DTFM, и в этом случае для организации голосового меню достаточно паралельно с записью в голосовой порт произвоодить чтение из него-же, и считанный 320 байтный кусок анализировать на наличие в нем сигнала DTFM. Попробую на неделе сделать/доработать скрипт — умеющий распознавать сигналы тонального набора.
Для более глубокого понимания механизмов организации голосовых меню можно почитать то что выдает google по запросу IVR DTFM
С наскоку победить DTMF не удалось. (в 2-х предыдущих сообщениях ошибочно обозвал DTFM).
Нашел несколько косвенных упоминаний о том что e1550 не умеет аппаратно распознавать DTMF сигналы.
Программно вроде как распознает perl модуль Modem::Vgetty, более того — этот модуль умеет звонить через модем и организовывать голосовые меню.
Также на CPAN-е было найдено еще несколько модулей для создания голосовых меню, и для декодирования DTMF, но эксперименты результата не дали. Возможно я что то не так делал.
Есть еще вариант пойти по пути предложенному человеком выложившим код на Си с предложением переделать его в перл.

Ну вот как то так. Вынужден пока отступиться от проблемы.
Переписал на Perl эту программу. Потратил на нее уйму времени, но так и не добился распознавания DTMF сигнала. Потерялся в логике функции read_frame, а именно странный расчет количества считываемых байтов:
   x = read(fd, &buf[i], N-i);
   ...
   i += x;

А также не доконца понимаю логику функции calc_power, Логика функции зависит от значений в массиве:
   int k[] = { 11, 13, 14, 19, 21, 23, 26, 27, 28, 33, 36, 39, 40,  /*44,*/ 45, 49, 51, 72, 78, };
Но что означают эти цифры — не понимаю.

Если кто знает как это работает — поделитесь пожалуйста опытом.
Да уж смотрю сложности с голосовым меню не маленькие…
Насколько мне помниться есть алгоритм распознавания сигнала Wiki: «Сигнал DTMF может быть декодирован на цифровой ЭВМ с использованием алгоритма Гёрцеля.» Но я так и не смог его понять.
Да читал, просто хорошо так подзабыл математику. Буду пробовать дальше. Если выйдет каменный цветок — отпишусь.
Все таки победил DTMF. И сумел получить из этого работающий perl код. В архиве 3 файла:
1. dtmf_decode.01.pl — работающая версия perl скрипта DTMF декодера.
2. test.for.bug.raw — записанный с телефона голос и нажатия кнопок (DTMF сигналы): 01234567890*#
2. test.for.bug.1.raw — с генерированный файл с нажатиями кнопок (DTMF сигналы): 112163 112196 11#9632 ##9696

Хочу отметить, что на реально записанный файл на части где говорю голосом происходят ложные срабатывания. Вот вывод анализатора на этот файл:
DIALTONE BUSY RING DIALTONE RING BUSY RING BUSY RING BUSY DIALTONE 01234567890*#

Таким образом делаю вывод что использовать DTMF декодер нужно совместно с Voice activity detector
UFO just landed and posted this here
Я писал (собирал информацию) именно под e1550, как обстоят дела с другими девайсами к сожалению не подскажу.
По поводу разлочки модемов — точной информацией не обладаю — но мне кажется что модем может быть «залочен» как на уровне десктопного ПО идущего в комплекте с модемом, так и на уровне прошивки. Подобное мнение у меня сложилось после эксперементов с 3-я модемами huawei e1550 от мегафона. Один был разлочен другом, 2 остальных разлочены небыли. И при попытках выйти в интернет сложилась такая картина:
1-й модем: выходит в нет под любой симкой как в Linux так и в MS Windows
2-й модем: выходит в нет под любой симкой только в Linux, и под родной симкой в MS Windows
3-й модем: выходит в нет и в Linux, и в MS Windows только с родной симкой.
Для выхода в нет под MS Windows использовалась ПО из комплекта модема.
Для выхода в нет под Linux использовался kNetworkManager.

Вроде как для разлочки модема (залоченного на уровне прошивки) нужно ввести AT команду: AT^CARDLOCK=«nck code» (источник1, источник2, источник3)
Также где то читал, что данный метод работает не на всех прошивках и не у всех операторов связи.
по многочисленным просьбам залил все имеющиеся наработки по теме статьи на github
Sign up to leave a comment.

Articles