Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 01.08.2010, 18:36   #1
alenkov
Пользователь
 
Регистрация: 23.07.2010
Сообщений: 18
По умолчанию Отправка SMS посредством АТ команд через мобильник

Доброго всем времени суток!!!
Пречитал кучу инфы. но так и непонял как отправку реализовать в delphi.Можно увидеть пример как это делается.Просто два поля там где вводить номер +7ХХХХХХХХХХ и где текст самого СМС , при нажатии на Button1 отправка. Можно сюда alex_shtepa@mail.ru Спасибо!
alenkov вне форума
Старый 01.08.2010, 21:13   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

>>> тырк 1 2
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума
Старый 01.08.2010, 23:01   #3
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Сам перекопал много интернета вообщем нашёл где-то в ядре)))
Код:
procedure Tform10.SendSMS(nTel: String);
var
  lngt, i: Integer;
  nmes, m, tel, vi: String;
  h:THandle;
begin
h:=CreateEvent(nil, true,false, 'et');
  m := memo1.Text;
  // Полуоктеты представляют десятичные цифры, и, например, номер отправителя получается
  // при перестановке десятичных цифр в каждом октете: от "72 38 88 09 00 F1" к "27 83 88 90 00 1F".
  // Длина телефонного номера нечетна, поэтому в последний октет добавлен F.
  if Length(nTel) mod 2 = 1 then
    nTel := nTel + 'F';
  for i := 1 to Length(nTel) do
    if i mod 2 = 0 then
      tel := tel + nTel[i] + nTel[i-1];

  nmes :=      '00'; // Длина информации о SMSC. Длина - 0 означает, что для отправки СМС должен использоваться номер SMSC,
// сохраненный в телефоне. Этот октет является дополнительным. 
//Для некотоорых телефонов этот октет должен быть опущен! (Но все равно будет использоватьтся СМСЦ, сохраненный в телефоне.
  nmes := nmes + '11'; // Первый октет SMS-SUBMIT
  nmes := nmes + '00'; // TP-Message-Reference. Значение 0х00 указывает на то, что в качестве номера телефона отправителя будет использоваться номер.
  nmes := nmes + '0B'; // Длина номера получателя (11)
  nmes := nmes + '81'; // Тип-адреса. (91 указывает международный формат телефонного номера, 81 - местный формат).
  nmes := nmes + tel;  // Телефонный номер получателя в международном формате в полуоктетах (46708251358). 
//Если указать номер телефона в местном формате (Type-of-Address равен 81 вместо 91), то для указания номера телефона можно было бы использовать 
//10 октетов (0x0A) и октеты были бы представлены как 7080523185 (0708251358).
  nmes := nmes + '00'; // TP-PID. Идентификатор протокола
  nmes := nmes + '00'; // TP-DCS.
  nmes := nmes + 'A8'; // TP-Validity-Period. "AA" означает 4 дня. Этот октет является дополнительным, см. 4 и 3 первого октета
  nmes := nmes + IntToHex(Length(m),2); // TP-User-Data-Length. Длина сообщения.
  nmes := nmes + Encode7bit(m); // TP-User-Data. Эти октеты представляют сообщение "hellohello", преобразованное в 7 битку.
  lngt := Round((length(nmes)-2)/2);
  form1.Memo1.Lines.Add('AT+CMGS='+IntToStr(lngt)+#13);
  form1.Memo1.Lines.Add(nmes);
  form1.bcomport1.WriteStr('at+cmgf=0'+#13);
    WaitForSingleObject(h,3000);
  form1.BComPort1.WriteStr('AT+CMGS='+IntToStr(lngt)+#13);
  WaitForSingleObject(h,3000);
  form1.BComPort1.WriteStr(nmes+#26);
end;
Отправка латиницы, а вот отправка кирилицы
Код:
procedure TForm10.send_SMS_na_russkom(nomer_tel:string);
var
nmes,tel:string;
h:THandle;
i:integer;
begin
h:=CreateEvent(nil, true,false, 'et');
  if Length(nomer_tel) mod 2 = 1 then
    nomer_tel := nomer_tel + 'F';
  for i := 1 to Length(nomer_tel) do
    if i mod 2 = 0 then
      tel := tel + nomer_tel[i] + nomer_tel[i-1];

nmes:='';
nmes:='0011000B81'+tel+'0008A8'+inttohex(length(memo1.Text)*2,2)+ucs2(memo1.Text);
form1.BComPort1.WriteStr('AT+CMGF=0'+#13);
form1.Memo1.Lines.Add('AT+CMGF=0');
WaitForSingleObject(h,1000);
form1.BComPort1.WriteStr('AT+CMGS='+inttostr((length(nmes)-2) div 2)+#13);
form1.Memo1.Lines.Add('AT+CMGS='+inttostr((length(nmes)-2) div 2));
WaitForSingleObject(h,1000);
 form1.BComPort1.WriteStr(nmes+#26);
 form1.Memo1.Lines.Add(nmes);
end;
Необходимые функции
Код:
function ucs2(s: string): string;
var i,k: integer;
begin
for i:=1 to length(s) do begin
  k:= ord(s[i]);
  if k>=192 then k:= k + 1040 - 192;
  result:= result + inttohex(k,4)
end
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;
а вот компонент для всей этой работы
Вложения
Тип файла: rar Компонент.rar (16.0 Кб, 709 просмотров)
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось artemavd; 02.08.2010 в 09:28. Причина: масса орфографических ошибок
dmitriegorovih вне форума
Старый 02.08.2010, 09:10   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
нашёл гдето в едре)))
не где-то, а с моей статьи и исходников слямзено свой код всегда узнаю
Цитата:
nmes:='0011000B81'+tel+'0008A8'+int tohex(length(memo1.Text)*2,2)+ucs2( memo1.Text);
а вот это вообще тупое копирование и замена, без расшифровок ...в оригинале так:
Код:
function cnv(s: string):string;
var i: integer;
begin
 delete(s,1,1);
 if length(s) mod 2>0 then s:=s + 'F';
 i:= 1;
 while (i<length(s)+1) do begin
  result:= result + s[i+1]+s[i];
  inc(i);inc(i)
 end
end;

function ucs2(s: string): string;
var i,k: integer;
begin
 for i:=1 to length(s) do begin
  k:= ord(s[i]);
  if k>=192 then k:= k + 1040 - 192;
  result:= result + inttohex(k,4)
 end
end;

function tcod: string;
begin
 if pduf.fsms.Checked then result:= 'F8'
  else result:= '08'
end;

function cpdu(ksz,sz,num,msg: string): string;
begin
 result:= inttohex(length(sz),2) +      // 07=длина номера SMSC
          '91' +                        // 91=интернациональность номера SMSC
          cnv(ksz + sz) +               // 97103701F0=+790173100 плюс признак окончания номера F
          '01' +                        // 01=PDU Type: MTI=01 -> исходящий SMS
          '00' +                        // 00=MR - параметр, который устанавливается в SMSC
          inttohex(length(num)-1,2) +   // длина номера получателя-1
          '91' +                        // 91=интернациональность получателя
          cnv(num) +                    // 9710276338F6=+79017236836 - номер получателя
          '00' +                        // 00=PID идентификатор номера протокола
          tcod +                        // F8/08=DCS схема кодирования на экран/вну: кириллическое
          inttohex(length(msg)*2,2)+    // длина сообщения
          ucs2(msg)                     // сообщение
end;

procedure Tpduf.tpduClick(Sender: TObject);
begin
 if (sz.Text='')and(ksz.Text='') then caption:= '  !!! номер центра будет взят из SIM'
  else caption:= '  PDU conversion TEST [Siemens C-35]';
 pdu.Text:= cpdu(ksz.Text, sz.Text,num.Text, txt.Text)
end;
Код:
procedure Tpduf.SpeedButton6Click(Sender: TObject);
begin
 if pdu.Text<>'' then begin
  sendcom('AT+CMGS='+inttostr(length(txt.text)*2)+#13+#10);
  application.ProcessMessages;
  sleep(1000);
  typ.Lines.Add(trim(readcom));
  sendcom(pdu.Text+#26);
  sleep(5000);
  typ.Lines.Add(trim(readcom))
 end
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума
Старый 02.08.2010, 09:21   #5
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
не где-то, а с моей статьи и исходников слямзено свой код всегда узнаю
А можете показать статью где отправляеться на кирилеце просто интересно происходит откуда?
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума
Старый 02.08.2010, 09:24   #6
alenkov
Пользователь
 
Регистрация: 23.07.2010
Сообщений: 18
По умолчанию

Буду разбиратся. Всем спасибо!!!
alenkov вне форума
Старый 02.08.2010, 09:33   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

модератору:
зачем в сеть перенесли?

From artemavd: перенес потому что в данной теме обсуждается вопрос об отправке сообщения в виде смс, что уже подразумевает под собой работу с сетью. А по-скольку выкладываемые коды - дельфийские, то перенес тему в соответствующий раздел "Работа с сетью в Delphi".
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось artemavd; 03.08.2010 в 03:09.
Пепел Феникса вне форума
Старый 02.08.2010, 09:44   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
А можете показать статью где отправляеться на кирилеце просто интересно происходит откуда?
OFFTOP >
c поста #2:
тырк 1 (первая оригинал)
тырк 2 (официальная публикация, объединение двух материалов в один)
тырк 3 (содрано без спроса)
тырк 4 (содрано без спроса)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума
Старый 02.08.2010, 09:59   #9
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

А вот всё и не так отправку на кирилице я нашёл совсем на другом сайте код чтоб по стораз не переписывать я взял из отправки на английском но само формирование нашёл на другом да кстати вот это
Цитата:
// 97103701F0=+790173100 плюс признак окончания номера F
это не признак оканчание просто номер если не чётный поэтому и добоввляеться

Вот нашёл смотрите
Цитата:
Так.. с отправкой PDU/UCS2 разобрался
Может кому пригодится:
Само сообщение состоит из HEX-последовательности, прописанной ASCII-символами (0..9,A..F).
Пример - надо отправить сообщение абоненту +79212345678 и в нем написать 'Привет'.
ВНИМАНИЕ! РЕЧЬ ИДЕТ О ТОМ, КАК ЭТО СДЕЛАТЬ ПРОГРАММНО (или через HyperTerminal), А НЕ С ПОМОЩЬЮ, например, SiMoCo. Т.е. ручками.
Итак:
1. Берем бумажку и составляем последовательность:
00 - всегда - это означает, что телефон/модем берет адрес сервис-центра SMS из Симки
11 - всегда
00 - указывает, что в качество отправителя будет указан собственный номер тел/модема
0B - длина цифр телефонного номера = 11(дес)
91 - указывает на интернациональный формат тел. номера (+7...)
9712325476F8 - номер адресата, которому отправляем SMS
Тут интересно -
1. в начале записываем номер (на другую бумажку)
2. проверяем, четное ли количество цифр и если нет (как у нас - 11), добавляем в конце "F"
3. переставляем каждые две цифры местами - получаем результат
В нашем случае:
79212345678
79212345678F
9712325476F8
00 - идентификатор протокола
08 - формат кодирования сообщения - в нашем случае - USC2
17 - время действия SMS
возможные коды (дес)
0-143: (код + 1)*5минут - наш случай ((17H = 23дес) + 1)*5=120минут=2часа
144-167: 12 часов + (код - 143)*30минут
168-196: (код - 166) * 1день
197-255: (код - 192) * 1неделя
0C - количество байт в сообщении = количество символов*2, т.к. USC2
041F П
0440 р
0438 и
0432 в
0435 е
0442 т
Коды символов соответствуют нормальному Unicode. Можно посмотреть, например, встроенную программу "Таблица символов", выбрать шрифт, например Arial, прокрутить вниз до начала кириллицы и посмотреть их коды (отображаются в HEX-виде внизу окна).

2. Даем команду тел/модему
AT+CMGF=0 - включаем режим PDU
AT+CMGS=26 - длина байтов сообщения (по 2 цифры), без учета первого нулевого байта
>0011000B919712325476F80008170C041F 04400438043204350442Ctrl+Z
+CMGS: 13 - это уже ответ модема

OK

И еще. Тот же симоко, иногда почему-то, вставляет вместо первого нуля явный адрес сервис центра -
07919712999090F0 - понятно (см. выше), что это телефон 79219909090. Первый байт - длина последовательности (без него самого). Вроде все правильно, но MC35 возвращает ERROR. Причину не знаю.
Если надо, могу разобрать и прием PDU - SMS-ки
Удачи!
А вот сылка на сайт
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось dmitriegorovih; 02.08.2010 в 10:14.
dmitriegorovih вне форума
Старый 02.08.2010, 10:27   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

не знаю где нашли, но уследить за всем нереально ...вы читаете комментарий, забывая про функу:
Код:
function cnv(s: string):string;
var i: integer;
begin
 delete(s,1,1);
 if length(s) mod 2>0 then s:=s + 'F';
 i:= 1;
 while (i<length(s)+1) do begin
  result:= result + s[i+1]+s[i];
  inc(i);inc(i)
 end
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 02.08.2010 в 10:29.
raxp вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка письма посредством php Syltan PHP 9 17.03.2010 14:57
SMS отправка C# evgenrpo Общие вопросы .NET 3 29.11.2009 23:44
Отправка SMS через клик по строке таблицы RUBEY Microsoft Office Excel 4 25.12.2008 11:07
Отправка SMS Altera Софт 1 20.11.2008 08:56
отправка sms Promise Работа с сетью в Delphi 12 16.07.2008 18:10