§ 29. Программа для регестрации звонка на телефон
|
Дмитрий Иванов, Январь 2007
|
Статья впервые опубликованна 14 Мая 2014
|
|
А эта программа, помоему, еще интересней чем все предыдущие. Она может фиксировать факты звонка на телефон. Т.е. если ктони-будь будет звонить на наш телефон, то мы тут же об этом узнаем. Запустив проект, можно увидеть следующую программу:
|
Внешне она выглядит хиловато, и кажется что кроме того как открыть порт она больше ни чего и не умеет. Обманчивое впечатление. Итак, рассмотрим, а какже это вообще возможно сделать? Мой SE T630, если на него звонят, посылает в порт сообщение об этом в виде слова RING. В этом можно убедиться, запустив HyperTerminal и позвонив на телефон. Слово RING будет с определенной частотой появляться в порту в течение всего времени, пока не взяли трубку или не разорвали связь с другой стороны. Я думаю, что и другие телефоны ведут себя примерно так же.

Отсюда очевиден способ регистрации звонка: надо переодичски считывать информацию из порта и проверять нет ли там слова RING. Теперь рассмотрим код, который это все выполняет. Код для открытия порта аналогичен предыдущим примерам, но в нем есть маленькое дополнение. Если открытие порта прошло удачно, в самом конце этого блока if стоит вызов функции SetTimer(), которая стартует таймер. Он будет срабатывать каждые 1000 мс, т.е. каждую секунду.
..........
SetCommState(m_hFile, &dcb);
MessageBox("Порт успешно открыт", "Info", MB_ICONINFORMATION);
SetTimer(1, 1000, NULL);
}
else
..........
С помощью ClassWizard`a в нашем классе диалога был создан обработчик на сообщения от таймера. Рассмотрим его реализацию. Там создается массив из 100 char, куда потом с помощью вызова функции ReadFile() помещается данные, прочтенные из порта. Затем функция strlwr() переводит прочтенные символы в нижний регистр, дабы исключить путаницу: может бы какой-нибудь телефон посылает слово ring а не RING, а при анализе это надо учисть. Далее идет перебор всех прочтенных символов и проверяется их значение. Если вдруг какой-то из них есть символ 'r' а следующий за ним 'i', я принимаю решение что это было слово RING и анализ заканчивается с выдачей информационного сообщения. Конечно, можно было проверить что за 'i' идет 'n', а затем 'g', и это бы ло бы лучше, но это Вы уже сами можете сделать если за хотите.
void CTelefonDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
char buf[100];
memset(buf,0,100);
DWORD dwBytesRead;
ReadFile(m_hFile, buf, 100, &dwBytesRead, NULL);
strlwr(buf);
for(int i=0; i<100; i++)
{
if(buf[i]=='r' && buf[i+1]=='i')
{
MessageBox("Vam zvonyat", "Info", MB_ICONINFORMATION);
break;
}
}
CDialog::OnTimer(nIDEvent);
}
© Дмитрий Иванов
Январь 2007
http://www.kernelchip.ru