Комментарии 19
Исправил ошибки парсера
Хм, спасибо! Очень хорошая работа по собиранию всей информации в одну программу, в будущем эти наработки, думаю, мне понадобятся =)
А чтобы не задавать номера портов вручную в скрипте а определять автоматически не экспериментировали?
А сделать изменения например ожидание нажатия кнопки 1 или 0 сложно доработать?
Вы имеете ввиду голосовое меню?
Да именно, в целях скажем так перенаправления или принятия решения.
Такие изменения сделать можно. Но нужно учесть что для того чтобы принимать данные о нажатых кнопках на телефоне (по моему эта информация передается в виде USSD, но полной уверенности нет) во время разговора (в голосовой порт пишутся аудиоданные каждые 0.02 секунды) можно поступить 2-я способами:
1. чтение данных из командного в параллельном потоке (возможны различные варианты: fork, thread, и по моему был модуль в составе IO умеющий распараллеливать процессы чтения и записи. В случае с fork и thread нужно организовать межпроцессное взаимодействие помоему)
2. неблокирующее чтение данных из командного порта (в этом подходе так же есть свои нюансы)
1. чтение данных из командного в параллельном потоке (возможны различные варианты: fork, thread, и по моему был модуль в составе IO умеющий распараллеливать процессы чтения и записи. В случае с fork и thread нужно организовать межпроцессное взаимодействие помоему)
2. неблокирующее чтение данных из командного порта (в этом подходе так же есть свои нюансы)
Немного почитав доку — выяснил что во время звонка нажатия кнопок передаются как DTFM, и в этом случае для организации голосового меню достаточно паралельно с записью в голосовой порт произвоодить чтение из него-же, и считанный 320 байтный кусок анализировать на наличие в нем сигнала DTFM. Попробую на неделе сделать/доработать скрипт — умеющий распознавать сигналы тонального набора.
Для более глубокого понимания механизмов организации голосовых меню можно почитать то что выдает google по запросу IVR DTFM
С наскоку победить DTMF не удалось. (в 2-х предыдущих сообщениях ошибочно обозвал DTFM).
Нашел несколько косвенных упоминаний о том что e1550 не умеет аппаратно распознавать DTMF сигналы.
Программно вроде как распознает perl модуль Modem::Vgetty, более того — этот модуль умеет звонить через модем и организовывать голосовые меню.
Также на CPAN-е было найдено еще несколько модулей для создания голосовых меню, и для декодирования DTMF, но эксперименты результата не дали. Возможно я что то не так делал.
Есть еще вариант пойти по пути предложенному человеком выложившим код на Си с предложением переделать его в перл.
Ну вот как то так. Вынужден пока отступиться от проблемы.
Нашел несколько косвенных упоминаний о том что e1550 не умеет аппаратно распознавать DTMF сигналы.
Программно вроде как распознает perl модуль Modem::Vgetty, более того — этот модуль умеет звонить через модем и организовывать голосовые меню.
Также на CPAN-е было найдено еще несколько модулей для создания голосовых меню, и для декодирования DTMF, но эксперименты результата не дали. Возможно я что то не так делал.
Есть еще вариант пойти по пути предложенному человеком выложившим код на Си с предложением переделать его в перл.
Ну вот как то так. Вынужден пока отступиться от проблемы.
Переписал на Perl эту программу. Потратил на нее уйму времени, но так и не добился распознавания DTMF сигнала. Потерялся в логике функции read_frame, а именно странный расчет количества считываемых байтов:
А также не доконца понимаю логику функции calc_power, Логика функции зависит от значений в массиве:
Если кто знает как это работает — поделитесь пожалуйста опытом.
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 может быть декодирован на цифровой ЭВМ с использованием алгоритма Гёрцеля.» Но я так и не смог его понять.
Насколько мне помниться есть алгоритм распознавания сигнала 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
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
НЛО прилетело и опубликовало эту надпись здесь
Я писал (собирал информацию) именно под 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)
Также где то читал, что данный метод работает не на всех прошивках и не у всех операторов связи.
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
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
perl скрипт производящий голосовой обзвон (оповещение) через usb модем huawei e1550