Модератор: Модераторы
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;
alexs писал(а):avis
А ты как отправляеш - через модем? или напрямую - через оператора?
Я писал для отправки напряму оператору.
Там всё достаточно просто.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13