Отправка SMS при помощи Delphi

Алгоритм работы приложения для отправки sms достаточно простой. При помощи компонента twebbrowser нужно реализовать отправку данных на веб-сервер сотового оператора, содержащих информацию о телефонном номере, текст сообщения и некоторой служебной информации. 
Отправку sms сообщения рассмотрим на примере оператора сотовой связи "Ульяновск- gsm ", позволяющего производить отправку sms сообщений через web- страничку по адресу:
 http://sms.smarts-gsm.ru/sms.cgi
Для отправки sms сообщения нужно заполнить поля формы: 
* в поле "Кому" ввести полный телефонный номер, например 78422973421 . 
* в поле "Что" вводится текст сообщения. 
* в списке "Формат" выбирается тип сообщения. 
Отправка сообщения инициализируется кнопкой "send >>".
Передаваемая строка на сервер оператора сотовой связи, при заполненном поле "Кому" - 78422973421, полем "Что" - "sms", в формате "Обычный sms" выглядит следующим образом:
 to=78422973421&msg=sms&dcs=0 (1)
Разберемся откуда берется эта строка и что она означает. Если рассмотреть html код страницы, то видим следующую картину:
<form method=post action="http://sms.smarts-gsm.ru/sms.cgi"> 
<input type=text name=to value="" size=15>[номер абонента] 
<textarea name=msg cols=30 rows=5> </textarea> 
<select name=dcs> 
<option value=0>Обычный sms 
<option value=24 >flash sms 
<option value=200 >Индикация голосового сообщения (Вкл.) 
<option value=192 >Индикация голосового сообщения (Выкл.) 
<option value=201 >Иидикация наличия факса (Вкл.) 
<option value=193 >Иидикация наличия факса (Вкл.) 
<option value=202 >Индикация сообщения e-mail ( Вкл. ) 
<option value=194 >Индикация сообщения e-mail ( Выкл. ) 
<input type=reset value="clean"> 
<input type=submit value="send >>"> 
</form>
Очевидно, что это форма со следующими компонентами:
:1) поле для ввода текста с именем to, куда вводится номер абонента 
:2) элемент ввода текста с именем msg, куда вводится текст сообщения 
:3) выпадающее меню с именем dcs, где выбирается тип сообщения 
:4) кнопка "clean" для очистки формы от текстовой информации 
:5) кнопка "send >>" для отправки содержимого формы на сервер
Таким образом, строка вида (1) образуется при отправке содержимого формы методом post на cgi шлюз по адресу http://sms.smarts-gsm.ru/sms.cgi
Делаем вывод, что нужно при помощи Delphi сформировать такую же строку и отослать ее на сервер оператора сотовой связи. Отправку строки будем производить методом Navigate2 компонента TWebBrowser.
Спецификация метода следующая :
procedure Navigate2(var Url: OleVariant; var Flags: OleVariant;
 var TargetFrameName: OleVariant; var PostData: OleVariant;
 var Headers: OleVariant); overload;
Описание: метод используется при навигации и закачки специфичных ресурсов. Может отсылать НТТР сообщения на специфичные адреса URL и показывать при этом результаты выполнения этого метода. 
Параметры: 
* Url - указатель на локальный файл или ресурс в сети Интернет. 
* Flags - может принимать одно из нескольких возможных значений:
** NavOpenInNewWindow = 1 - открывать файл или URL в новом окне 
** NavNoHistory = 2 - не добавлять файл в лист History. Новая страница заменяет имеющуюся страницу в кэше. 
** NavNoReadFromCache = 4 - Не читать страницу из кэша. 
** NavNoWriteToCache = 8 - Не записывать результат навигации в кэш. 
** NavAllowAutoSearch = 16 - Если навигация не удалась, разрешить браузеру искать ресурсы с таким же названием, но с именем домена (com, .edu, и т.д.)
* TargetFrameName - имя фрейма в ресурсе, который должен быть отображен, или null если таковой не может отображаться в указанном URL. 
* PostData - содержит данные, пересылаемые серверу. Используется для генерации post метода. Если значение переменной null, то генерируется метод get. Данные, содержащиеся в PostData игнорируются, если URL по которому производится навигация, не HTTP типа. 
* Headers - содержит НТТР заголовок передаваемых данных
Создадим форму в Delphi из необходимых для заполнения строки вида (1) компонентов. Добавляем также компонент TWebBrowser и делаем его невидимым из эстетических соображений.
Номер телефона должен заноситься в компонент ComboBox1, а текст сообщения в Memo1. Обработчик кнопки "Отправить", будет выглядеть следующим образом:
var
 vWebAddr, vPostData, vFlags, vFrame, vHeaders: OleVariant;
 iLoop: Integer;
 Text, stPostData: string;
begin
 Text := Memo1.Text;
 // заполняем строковую переменную stpostdata значениями полей.
 // Отправляем обычный sms, поэтому dcs=0, исходя из значений в html форме <option value=0>Обычный sms
 stPostData := 'to=' + ComboBox1.Text + '&msg=' + Text + '&dcs=0';
 // создаем http заголовок в виде нуль-терминальной строки(оканчивающейся на #0);
 vHeaders := 'content-type:application/x-www-form-urlencoded' + #10#13#0;
 // для заполнения передаваемых данных создаем вариантный массив 
 // с минимальным пределом равным 0 и максимальным, равного длине строки Length(stPostData)
 // типа VarByte (8-ми битовое беззнаковое целочисленное значение (тип Byte))
 vPostData := VarArrayCreate([0, Length(stPostData)], VarByte);
 // посимвольно заполняем вариантный массив значениями нашей строки
 for iLoop := 0 to Length(stPostData)-1 do
 begin
 vPostData[iLoop] := Ord(stPostData[iLoop+1]);
 end;
 // обнуляем последний элемент
 vPostData[Length(stPostData)] := 0;
 // В поле VType помещается признак типа данных. Присваиваем вариантной структуре данных 
 // тип VarArray, что означает "Вариантный массив". Данная операция необходимо для того,
 // чтобы массив данных был вариантного типа. Если данную операцию не производить,
 // то массив, хотя и будет состоять из значений типа Variant, не будет вариантного типа.
 TVarData(vPostData).VType := VarArray;
 vWebAddr := 'http://sms.smarts-gsm.ru/sms.cgi';
 // ставим флаг "не записывать в кэш". 
 vFlags := NavNoWriteToCache;
 vFrame := EmptyParam;
 // используя метод Navigate2, отправляем заполненные структуры данных на известный нам адрес,
 // предусмотрев обработку ошибки.
 try
 WebBrowser1.Navigate2(vWebAddr, vFlags, vFrame, vPostData, vHeaders);
 except
 end;
end;
Подводные камни
:1) Абонент может получить sms сообщение в другой кодировке. Это объясняется тем, что в шлюзе производится обработка принимаемого сообщения только в какой-либо одной кодировке. Все зависит от конкретной реализации cgi шлюза. В любом случае кодировка подбирается экспериментальным путем.
:2) Результат отправки сообщения появляется в новой странице, к примеру "Сообщение отправлено успешно", после того, как сервер принимает сообщение и генерирует при помощи шлюза новую страницу. Так что узнать, корректно ли принял sms сообщение сервер, можно при анализе новой страницы, появляющейся в браузере.
Source: http://delphi-ex.narod.ru
ID: 03588
Category:Связь
Category:WebBrowser
Category:Статьи
Category:Учебники