|
|||||||||||||||||||
|
|
||||||||||||||||||
Алгоритм работы приложения для отправки SMS достаточно простой. При помощи компонента TWebBrowser нужно реализовать отправку данных на веб-сервер сотового оператора, содержащих информацию о телефонном номере, текст сообщения и некоторой служебной информации. http://sms.smarts-gsm.ru/sms.cgi Для отправки SMS сообщения нужно заполнить поля формы: Передаваемая строка на сервер оператора сотовой связи, при заполненном поле "Кому" - 78422973421, полем "Что" - " SMS ", в формате "Обычный SMS " выглядит следующим образом: to=78422973421&msg=SMS&dcs=0 (1) Разберемся откуда берется эта строка и что она означает. Если рассмотреть HTML код страницы, то видим следующую картину: <FORM METHOD=POST ACTION="http://sms.smarts-gsm.ru/sms.cgi"> Очевидно, что это форма со следующими компонентами : 1) поле для ввода текста с именем to , куда вводится номер абонента Таким образом, строка вида (1) образуется при отправке содержимого формы методом POST на CGI шлюз по адресу http://sms.smarts-gsm.ru/sms.cgi Делаем вывод, что нужно при помощи Delphi сформировать такую же строку и отослать ее на сервер оператора сотовой связи. Отправку строки будем производить методом Navigate2 компонента T WebBrowser . Спецификация метода следующая : procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant; var Headers: OleVariant); overload;
Описание: метод используется при навигации и закачки специфичных ресурсов. Может отсылать НТТР сообщения на специфичные адреса URL и показывать при этом результаты выполнения этого метода. Значение Описание var TargetFrameName: OleVariant - имя фрейма в ресурсе, который должен быть отображен, или NULL если таковой не может отображаться в указанном URL. Создадим форму в Delphi из необходимых для заполнения строки вида (1) компонентов. Добавляем также компонент TWebBrowser и делаем его невидимым из эстетических соображений. Выглядеть форма будет следующим образом: Номер телефона должен заноситься в компонент ComboBox1 , а текст сообщения в Memo1. Обработчик кнопки "Отправить", будет выглядеть следующим образом: var
Разберем код построчно. stPostData:=?to=?+ComboBox1.Text+?&msg=?+text+?&dcs=0?;
заполняем строковую переменную stPostData значениями полей. Отправляем обычный SMS, поэтому dcs=0, исходя из значений в HTML форме <OPTION VALUE=0>Обычный SMS
здесь создаем HTTP заголовок в виде нуль-терминальной строки( оканчивающейся на #0 ); vPostData:= VarArrayCreate([0, Length(stPostData)], varByte);
здесь, для заполнения передаваемых данных создаем вариантный массив с минимальным пределом равным 0 и максимальным, равного длине строки Length(stPostData) типа varByte ( 8-ми битовое беззнаковое целочисленное значение (тип Byte ) ) for iLoop := 0 to Length(stPostData)- 1 do
здесь посимвольно заполняем вариантный массив значениями нашей строки vPostData[Length(stPostData)]:= 0;
обнуляем последний элемент TVarData(vPostData).vType:= varArray;
В поле vType помещается признак типа данных. Присваиваем вариантной структуре данных тип varArray, что означает "Вариантный массив". Данная операция необходимо для того, чтобы массив данных был вариантного типа. Если данную операцию не производить, то массив, хотя и будет состоять из значений типа variant , не будет вариантного типа. Далее vFlags:=navNoWriteToCache;
ставим флаг "не записывать в кэш". Подводные камни 1) Абонент может получить SMS сообщение в другой кодировке. Это объясняется тем, что в шлюзе производится обработка принимаемого сообщения только в какой-либо одной кодировке. Все зависит от конкретной реализации CGI шлюза. В любом случае кодировка подбирается экспериментальным путем. 2) Результат отправки сообщения появляется в новой странице, к примеру "Сообщение отправлено успешно", после того, как сервер принимает сообщение и генерирует при помощи шлюза новую страницу. Так что узнать, корректно ли принял SMS сообщение сервер, можно при анализе новой страницы, появляющейся в браузере. |
|||||||||||||||||||
|