Кто-нибудь работал с отправкой смс?
Модератор: Модераторы
Кто-нибудь работал с отправкой смс?
Столкнулся с задачкой отправки смс, пока что наковырял только программы или компоненты под Windows, а сам работаю под Debian Linux. Если кто-нибудь видел подходящую информацию или работал в том же направлении подскажите как это выглядит или дайте ссылку, где могу почитать, сам пока что не нашел
Читайте документацию по AT командам для GSM модемов.
-
immortal1977
- новенький
- Сообщения: 16
- Зарегистрирован: 14.07.2008 15:52:23
- Откуда: Новоуральск
Когда-то писал прогу для массовой рассылки смс (spam), правда для винды на Дельфе, под siemens mc35 terminal. Все кодировалось в PDU специальным классом. Макс. длина ондного сообщения 335 символов (склейка). Если надо, пиши в личку, намылю исходники.
натыкнулся на прогу, которая напрямую с сайтов отправляет, даже код в гуе просит ввести, но все равно слабо понял как оно работает, да и смс не дошла
Вот функция которой я отправлял через модем короткую (не склеенную) СМС-ку (используя synaser):
...она не доработана (не реагирует на ответы модема как следует), и скорее всего всё тоже буду оформлять в класс, с отдельным потоком чтения и возможностью склейки смс.
immortal1977 буду оч. благодарен - fedex[собака]i.ua
Код: Выделить всё
TSMSSendErrorCode=(ssecOk,ssecBadParams,ssecOperationNotSupported,ssecMSGLength,ssecUnkn);
...
uses LCLProc;
...
function EncodeUCS2(s: UTF8String): string;
var
i: integer;
w:widestring;
begin
w:=UTF8Decode(s);
for i:=1 to length(w) do
Result:=Result+IntToHex(word(w[i]),4);
end;
function Encode7bit(Src:String):String;
var Dst:String;
i:Integer;
CurS,NextS:Byte;
TStr:String;
begin
for i:=1 to Length(Src) do begin
if (i mod 8)=0 then Continue;
TStr:=Copy(Src,i,1);
CurS:=Ord(TStr[1]);
if (i mod 8)>1 then
CurS:=(CurS shr ((i mod 8)-1) );
if i<Length(Src) then begin
TStr:=Copy(Src,i+1,1);
NextS:=Ord(TStr[1]);
end else
NextS:=0;
NextS:=(NextS shl (8-(i mod 8)));
Dst:=Dst+IntToHex(CurS+NextS,2);
end;
Result:=Dst;
end;
function SendSMS(bs:TBlockSerial; DestinationPhoneNumber: AnsiString; aText: UTF8String; StatusReport,IsNationalRecvNumb,IsUTF: boolean; out aATResult:AnsiString):TSMSSendErrorCode;
var
SMSC,
SMS_SUBMIT,
DATA_CODING_SCHEME,
MSG_BODY,
DPhN,tmpPhN:AnsiString;
i:integer;
begin
Result:=ssecUnkn;
if not Assigned(bs) then begin Result:=ssecBadParams; Exit; end;
if (IsUTF and (UTF8Length(aText)>70)) or (Length(aText)>160) then begin Result:=ssecMSGLength; Exit; end;
aATResult:=bs.ATCommand('AT+CMGS=?');
if not bs.ATResult then begin Result:=ssecOperationNotSupported; Exit; end;
DPhN:=trim(DestinationPhoneNumber);
SMSC:='00';
SMS_SUBMIT:='';
if StatusReport then
SMS_SUBMIT:=SMS_SUBMIT+'31' else
SMS_SUBMIT:=SMS_SUBMIT+'11';
SMS_SUBMIT:=SMS_SUBMIT+'00';
SMS_SUBMIT:=SMS_SUBMIT+IntToHex(Length(DPhN),2);
if IsNationalRecvNumb then
SMS_SUBMIT:=SMS_SUBMIT+'81' else
SMS_SUBMIT:=SMS_SUBMIT+'91';
if Length(DPhN) mod 2 = 1 then
DPhN:=DPhN+'F';
tmpPhN:='';
for i:=1 to Length(DPhN) do
if (i mod 2)=0 then
tmpPhN:=tmpPhN+DPhN[i]+DPhN[i-1];
DPhN:=tmpPhN;
SMS_SUBMIT:=SMS_SUBMIT+DPhN;
SMS_SUBMIT:=SMS_SUBMIT+'00';
if IsUTF then begin
SMS_SUBMIT:=SMS_SUBMIT+'08';
MSG_BODY:=EncodeUCS2(aText);
end else begin
SMS_SUBMIT:=SMS_SUBMIT+'00';
MSG_BODY:=Encode7bit(aText);
end;
SMS_SUBMIT:=SMS_SUBMIT+'C1';
SMS_SUBMIT:=SMS_SUBMIT+IntToHex(Length(aText),2);
SMS_SUBMIT:=SMS_SUBMIT+MSG_BODY;
//bs.ATCommand('ATE=0');
bs.SendString('AT+CMGS='+IntToStr(Length(SMS_SUBMIT) div 2)+#13);
Sleep(1000);
aATResult:=bs.ATCommand(SMSC+SMS_SUBMIT+^Z);
if not bs.ATResult then Exit;
Result:=ssecOk;
end;
...она не доработана (не реагирует на ответы модема как следует), и скорее всего всё тоже буду оформлять в класс, с отдельным потоком чтения и возможностью склейки смс.
immortal1977 буду оч. благодарен - fedex[собака]i.ua
alexs писал(а):avis
А ты как отправляеш - через модем? или напрямую - через оператора?
Я писал для отправки напряму оператору.
Там всё достаточно просто.
Я начал читать про AT, как посоветовал Mr.Smart, то есть буду работать через телефон. подключенный к компьютеру, но и твоя идея интересна, можешь подробнее рассказать?
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
при большом объёме рассылаемых СМС с оператором сотовой связи зкалючается договор на рассылку СМС используя нет для передачи данных
они тебе дают адрес их шлюза, пароль и номер (у меня он 4-х значный)
и вот ты по протоколу SMPP делаеш рассылку.
протокл хорошо описан. под дельфина куча компонентов. Я сам для лазаря написал процедуры - там ничего сложного. БОльше всего у меня проблем было с кодировкой - пока добися от провайдера как надо. Сейчас шлю в USC16BE. В виде компонента планмрую оформить - но это когда либо потом.
они тебе дают адрес их шлюза, пароль и номер (у меня он 4-х значный)
и вот ты по протоколу SMPP делаеш рассылку.
протокл хорошо описан. под дельфина куча компонентов. Я сам для лазаря написал процедуры - там ничего сложного. БОльше всего у меня проблем было с кодировкой - пока добися от провайдера как надо. Сейчас шлю в USC16BE. В виде компонента планмрую оформить - но это когда либо потом.
