Предлагаю вашему вниманию софтинку, и, что важнее, исходник от нее. Изначально софтинка была написана для реализации функции DISA в мини-АТС "Порнослоник". Когда на АТС звонили, софтинка брала трубку, пищала в нее и 10 секунд ждала ответа. Если человек набирал DTMFом правильный пароль, софтинка давала команду миниАТС переключить его на нужный номер (для доступа прямо к директору).
Для изготовления роутера бралась старая 286 машина без винта и телевизора, но с флоповодом, и старинный кривенький голосовой модем на 14400 (кто будет делать - имейте в виду, у моего модема был кривой набор команд, поэтому, возможно, придется переделать команды). Всё это грузится с дискеты и запускает софтинку. Девайс работает уже пару лет без передыха и не падает ;)
Эту же софтинку можно переделать для использования в качестве двустороннего роутера для GSM. Голосовой модем принимает DTMF команды как из города, так и из GSMа (если в нем нет распознавалки DTMF) и управляет линией. GSM можно приделать ко второму порту и делать ему АТА на RING, после чего поднимать первым модемом городскую линию. Подключение трубы к линии описано раньше.
Рассмотрим структуру файла команд. STARTUP = ATX0L3#VCL=1#vln=16
Это строка инициализации модема, включающая голосовой режим и распознавание DTMF. Ваш модем может инициализироваться иначе.
SHUTDOWN = ATH0#VCL=0Z0
Это передается модему при выходе.
SUFFIX = 0D
Этот суффикс прога добавляет к строкам, он в НЕХ.
TIMEOUT = 180 ATH0 // Can redirect to "Call all" instead of hangup
Этот таймаут - в тиках таймера, т.е. 180 - это 10 секунд (у таймера - 18,2 тика в секунду).
PORT = 2E8
Номер порта модема.
IRQ = 3
Прерывание выбранного порта.
if \x105\x106\x107\x108\x10F then ATDT!24;h0 //5678#
Вот здесь пошли условия. Если модем обнаруживает строку DTMF 5678#, он делает FLASH, набирает 24 и вешает трубку, таким образом перенаправляя входящий звонок на внутренний номер 24.
if \x101\x102\x103\x104\x10F then ATDT!25;h0 //1234#
То же самое для номера 25.
if RING then ATH1D,;#VBP // if ring D,;=delay 3sec
Снять трубку и включить прием DTMF, если звонят. Внутри проги при настройке на месте, кажется, была введена искусственная задержка, считающая звонки RING. Не помню. В этом исходнике такого вроде нет.
if \x10d then ATH0 // if dialtone
Диалтон определяется модемом, как и DTMF. Строка введена от возможных глюков АТС, когда она звонит и сразу проключает на внешнюю линию. Просто чтобы не подвешивать систему.
if ERROR then ATH0 // if error
Вот, собственно, и все. Счастливой доделки! Если у кого что получится, просьба не стесняться выкладывать.
|
|