Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 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



© KERNELCHIP 2006 - 2024