Работа с модемом

Задача: остановить дозвон по номеру, если дозвон пошел. Другими словами, нужно после первого гудка останавливать дозвон.
Проблема в том, что МОДЕМ не возвращает мне сигнал, когда он дозвонился до номера и ждёт, пока на том конце провода что-то сделают (поднимут трубку, положа). Я пробовал TAPI для С++ и С#, но ни там, ни там я не смог получить такой сигнал.
Такую функциональность я получил с помощью Skype. Но надо сделать с помощью модема. Это реально сделать? Если да, то что для этого надо? (кромя прямых рук = )) )

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Если кому будет интересно, то пишите мне в личку, кину код класса, который определяет валидность номера с помощью модема. По крайней мере, для нашей странны.

Если поднапрячь мозги, что было лет 15 назад в низкоуровневом программировании модема, вспоминается вот что:
я так понимаю — модем для телефонного dial-up? Значит, он Hayes — совместимый. Значит, у него есть стандартные hayes — команды, и регистры. на примере модема us robotics 14400: он определяет верно сигнал ЗАНЯТО (и ответит в порт BUSY), у него есть s-регистр, по типу watchdog, определяющий макс. время времени на дозвон (по истечении — положит трубку, и ответит по-моему NO RESPONSE). Если на том конце провода ему отхрюкает другой модем, они пройдут handshaking — можно почитать бит CD (carrier detected) из микросхемы UART. ++ переключает в цифровой вывод (и наоборот)
В общем, какое-то кривоватое, но решение — такое:

ставим watchdog timer на определенное время (или вообще не ставим, но тогда если трубку возьмут и положат — будет BUSY). Если модем вернет типа NO RESPONSE — значит дозвонились. Если модем вернет BUSY — было занято. Во втором фреймворке есть компонент ComPort — его и юзай, но можно для проверки юзать и терминалку: соединяемся в определенный порт модема, и ему:

ATZ (ентер — сбросит модем — отвечать нам будет всегда ОК)
ATE1 (ентер — включит вывод локального эха)
ATS_хренЕгоЗнаетНеПомнюРегистрНадоЧитатьДоку = таймауту (ентер)
ATDP8w0441234567 (ентер — наберет восьмерку, дождется гудка, потом наберет остальное)
теперь нужно ждать ответ

ATDP — пульсовый набор, ATDT — тоновый

Спасибо за ответ!

Не знаю, толи Ваша помощь, толи сегодня звёзды правильно на небе расположились, но у меня пошел процесс. Две недели назад пробовал SerialPort и ничего у меня не получалось. Сейчас получилось.

Если серийный порт открывается — значит все хорошо (стандартные параметры СОМ порта — 9600 8n1, ну можно и ставить больше чем 9600 бит, но не всегда сработает. 8 бит, нет контроля четности, 1 стоповый бит). А если нет ответа — то нужно посмотреть свойства (лень Студию открывать — по памяти напишу) — Flow Control: из XON/XOFF и RTS/DTR нужно выбрать последнее (аппаратный контроль потока). Далее, ReceivedBufferThreshold — если поставить в единицу, то при получении каждого байта будет выполняться событие Received, возвращающее весь буфер (пока его не прочитать) — ну это дело вкуса. Команды модему следует посылать на конце с \r (или \r\n), говорят, что они чувствительные к регистру. Пока ATE1 не пошлешь — ответов (эха) может не быть. Если сильно намудрил с настройками — модем можно сбросить в фабричные настройки: AT&F0 вместо нуля — заводской профиль настроек.

Підписатись на коментарі