ВСЕ ЗАПИСИ

Статьи,заметки

Отправка СМС через GSM модем из программы на Delphi

В одной из моих прог используется функция оповещения об определённых событиях по СМС, которые отсылаются с GSM модема, который подключен к компу, я когда-то обещал рассказать об этом способе более подробно. Это делается с помощью AT команд, посылаемых в COM порт, к которому подключен модем, пример кода:

//---Delphi 7 code-------
var
hFile:THandle;
s1,s2,s3:string;
z:Cardinal;

.......................
begin
//открываем порт COM6
hFile:=Windows.CreateFile(PChar('\\.\COM6'), GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
if hFile<>INVALID_HANDLE_VALUE then
begin
s1:='AT+CMGF=1'+#$D#$A;
z:=256;
//перевод модема в текстовый режим
WriteFile(hFile,PAnsiChar(s1)^,Length(s1),z,nil);
s2:='AT+CMGS="+79057335199",145'+ #$D#$A;
//номер телефона адресата
WriteFile(hFile,PAnsiChar(s2)^,Length(s2),z,nil);
s3:='SMS text here'+ #$D#$A#$1A;
//текст сообщения (только латиница!)
WriteFile(hFile,PAnsiChar(s3)^,Length(s3),z,nil);
Windows.CloseHandle(hFile);//закрываем порт
end;
end;
//----------

Таким образом можно отправлять сообщения, только если они содержат исключительно латинские символы.

Если же нужно, чтобы текст сообщения был на кириллице, придется перевести модем в цифровой режим, и отправить ему строку,в формате PDU (protocol description unit). Эта строка формируется по специальному алгоритму и представляет собой HEX-последовательность, в которой закодированы все параметры СМС: срок доставки, номер СМС-центра, номер получателя, текст самого сообщения и его кодировка, и пр.

AT команды:
AT+CMGF=0 - переключение в режим PDU
AT+CMGS=44 тут длина сообщения в байтах
AT+CMGS=440011000C919725268371F300 08C11E041F0440043E043204350440043A0 4300020005400450053005400230033 тут текст СМС, включая остальные параметры.

В процессе реализации этого способа отправки, я изучил много различных исходников, найденных в инете, в итоге создал достаточно простой шаблон кода, где сам код не разбит на кучу различных модулей, и не задействованы никакие сторонние компоненты для работы с COM портом, всё реализовано стандартными средствами Delphi.

Вот пример кода для юникодных версий Delphi (компилировал в RAD Studio XE5):

показать

А это код для тех, кто работает в Delphi 7:

показать

скачать рабочий исходник для RAD Studio (обновлён, добавлена поддержка FLASH СМС)
скачать рабочий исходник для Delphi 7

В данных примерах сообщение может содержать русский и английский текст, цифры, спецсимволы, типа #, @ и пр., всё это будет корректно отображаться в телефоне. Длина СМС не должна превышать 70 символов. Для длинных сообщений до 140 символов, используется свой метод кодирования, который здесь не рассматривается.

Я использую модем ZTE MF-180, который не залочен, и может работать с сим-картами любого оператора. Он определяется в моей системе, в Диспетчере устройств как ZTE NMEA Device (COM6), в разделе Порты (COM и LPT), соответственно в программе, которая работает с модемом, прописан порт COM6, если необходимо, через тот же Диспетчер устройств порт можно изменить на любой другой, если он не занят уже каким-либо устройством.

Следует иметь ввиду, что если в модеме имеется программа-звонилка от оператора сотовой связи, то при подключении модема к компьютеру она будет запускаться автоматически , и ваша программа не сможет получить доступ к модему. Это можно обойти например, таким способом: я нашел родные драйвера для модема, и первым делом, не подключая модем к компу, установил сначала их, и только потом подключил модем. Система при этом выдала стандартное сообщение, что найдено новое оборудование, после чего следует выбрать опцию "атоматическая установка драйверов", после завершения модем будет виден в разделе Мой компьютер просто как съёмный диск, он появится в разделе Порты (COM и LPT), и с ним можно будет работать.
Драйвер для ZTE MF-180 можно загрузить здесь

Добавлено: апрель 2016

©Veterock




комментарии (0)



Имя

Сообщение

введите защитный код


Обновить

Powered by ©Veterock Studio 2013