Кто-нибудь работал с отправкой смс?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Кто-нибудь работал с отправкой смс?

Сообщение avis » 11.12.2009 12:02:04

Столкнулся с задачкой отправки смс, пока что наковырял только программы или компоненты под Windows, а сам работаю под Debian Linux. Если кто-нибудь видел подходящую информацию или работал в том же направлении подскажите как это выглядит или дайте ссылку, где могу почитать, сам пока что не нашел
avis
новенький
 
Сообщения: 19
Зарегистрирован: 04.11.2009 13:18:10

Re: Кто-нибудь работал с отправкой смс?

Сообщение Mr.Smart » 11.12.2009 12:18:15

Читайте документацию по AT командам для GSM модемов.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Кто-нибудь работал с отправкой смс?

Сообщение immortal1977 » 11.12.2009 13:08:10

Когда-то писал прогу для массовой рассылки смс (spam), правда для винды на Дельфе, под siemens mc35 terminal. Все кодировалось в PDU специальным классом. Макс. длина ондного сообщения 335 символов (склейка). Если надо, пиши в личку, намылю исходники.
immortal1977
новенький
 
Сообщения: 16
Зарегистрирован: 14.07.2008 15:52:23
Откуда: Новоуральск

Re: Кто-нибудь работал с отправкой смс?

Сообщение Astralis » 11.12.2009 13:12:12

Если цель исключительно отправка sms с целью оповещения, то можно воспользоваться каким-нибудь веб-сервисом, тот же sms-club например.
Аватара пользователя
Astralis
новенький
 
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet

Re: Кто-нибудь работал с отправкой смс?

Сообщение avis » 11.12.2009 13:16:43

натыкнулся на прогу, которая напрямую с сайтов отправляет, даже код в гуе просит ввести, но все равно слабо понял как оно работает, да и смс не дошла
avis
новенький
 
Сообщения: 19
Зарегистрирован: 04.11.2009 13:18:10

Re: Кто-нибудь работал с отправкой смс?

Сообщение Astralis » 11.12.2009 15:38:32

Да очень просто оно работает - простейший HTTP-клиент (наример TIdHTTP). Вытаскивает нужные данные сайта оператора (мегафона например) и потом через POST-параметы отсылает данные.
Аватара пользователя
Astralis
новенький
 
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet

Re: Кто-нибудь работал с отправкой смс?

Сообщение alexs » 11.12.2009 20:57:47

avis
А ты как отправляеш - через модем? или напрямую - через оператора?
Я писал для отправки напряму оператору.
Там всё достаточно просто.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Кто-нибудь работал с отправкой смс?

Сообщение FedeX » 12.12.2009 00:18:26

Вот функция которой я отправлял через модем короткую (не склеенную) СМС-ку (используя synaser):
Код: Выделить всё
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 :)
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Кто-нибудь работал с отправкой смс?

Сообщение avis » 12.12.2009 12:53:50

alexs писал(а):avis
А ты как отправляеш - через модем? или напрямую - через оператора?
Я писал для отправки напряму оператору.
Там всё достаточно просто.


Я начал читать про AT, как посоветовал Mr.Smart, то есть буду работать через телефон. подключенный к компьютеру, но и твоя идея интересна, можешь подробнее рассказать?
avis
новенький
 
Сообщения: 19
Зарегистрирован: 04.11.2009 13:18:10

Re: Кто-нибудь работал с отправкой смс?

Сообщение alexs » 12.12.2009 15:43:35

при большом объёме рассылаемых СМС с оператором сотовой связи зкалючается договор на рассылку СМС используя нет для передачи данных
они тебе дают адрес их шлюза, пароль и номер (у меня он 4-х значный)
и вот ты по протоколу SMPP делаеш рассылку.
протокл хорошо описан. под дельфина куча компонентов. Я сам для лазаря написал процедуры - там ничего сложного. БОльше всего у меня проблем было с кодировкой - пока добися от провайдера как надо. Сейчас шлю в USC16BE. В виде компонента планмрую оформить - но это когда либо потом.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru