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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2015, 08:16   #1
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
Смущение 3G модем и русские символы

Доброго дня товарищи!
Выручайте! Нашел в Интернете код для отправки смс с помощью 3G модема. И все работает за исключением того, что кириллица приходит на телефон в виде кракозябр (см. в приложении). Код отправки СМС прилагается.

Код отправляющей функции:
Код:
procedure Tfuncs.SendSMS(Msg,comport,nTel: String);
var
  lngt, i: Integer;
  nmes, tel: String;
  h:THandle;
hFile: THandle;
cmd: string;
nWrited: cardinal;
begin
nTel:='7'+nTel;
h:=CreateEvent(nil, true,false, 'et');
 f 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';
nmes := nmes + '11';
nmes := nmes + '00'; 
nmes := nmes + '0B';
nmes := nmes + '91'; 
nmes := nmes + tel; 
  nmes := nmes + '00'; // TP-DCS.
  nmes := nmes + 'AA'; nmes := nmes + IntToHex(Length(Msg),2); // TP-User-Data-Length. ñîîáùåíèÿ.
  nmes := nmes + Encode7bit(ansitoutf8(Msg));
  lngt := Round((length(nmes)-2)/2);
  showmessage(Encode7bit(Msg));
  hFile:=CreateFile(pchar(comport), GENERIC_READ or GENERIC_WRITE, 0, NIL, OPEN_EXISTING, 0, 0);
if(hFile=INVALID_HANDLE_VALUE) then
begin
	MessageBox(0,'Не удалось открыть порт', 'Îøèáêà', MB_ICONERROR);
  exit;
end
else
begin
	//MessageBox(0,'Ïîðò óñïåøíî îòêðûò', 'Ok', MB_OK);
  cmd:='AT+CMGF=0'+#13;
  Writefile(hFile,PAnsiChar(cmd)^,Length(cmd),nWrited,nil);
  WaitForSingleObject(h,500);
  cmd:='AT+CSMS=0'+#13;
  Writefile(hFile,PAnsiChar(cmd)^,Length(cmd),nWrited,nil);
  WaitForSingleObject(h,500);
  cmd:='AT+CMGS='+IntToStr(lngt)+#13;
  Writefile(hFile,PAnsiChar(cmd)^,Length(cmd),nWrited,nil);
  WaitForSingleObject(h,500);
  cmd:=nmes+#26;
  Writefile(hFile,PAnsiChar(cmd)^,Length(cmd),nWrited,nil);
  WaitForSingleObject(h,500);
  closehandle(hFile);
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;
Вот собственно вопрос - как же отправить русские буквы в смс через 3G модем? Гуглеж ничего не дал, увы.
Изображения
Тип файла: jpg uzac6VppEIc.jpg (23.4 Кб, 67 просмотров)

Последний раз редактировалось prizrak1390; 14.02.2015 в 08:20.
prizrak1390 вне форума Ответить с цитированием
Старый 14.02.2015, 11:01   #2
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Цитата:
как же отправить русские буквы
7 - битная кодировка применяется для кодировки только кириллицы. Для кодировки в юникоде применяется PDU кодировка. И по моему нужно менять в информационных битах тип кодировки. Иначе приёмник будет дешифровывать текст семибитным алгоритмом. Для полного просвещения советую почитать документацию по SMS стандартам кодировки.
Вложения
Тип файла: rar Что такое PDU и как послать по GSM.rar (202.4 Кб, 11 просмотров)

Последний раз редактировалось WinCoder; 14.02.2015 в 11:03.
WinCoder вне форума Ответить с цитированием
Старый 14.02.2015, 11:39   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тут смотрел http://habrahabr.ru/post/133085/
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.02.2015, 11:44   #4
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

А вот и тот самый переключатель кодировки
Цитата:
LMes := LMes + '00';
// Старший полубайт означает сохранять SMS у получателя или нет (Flash SMS), Младший полубайт - кодировка(0-латиница 8-кирилица).
WinCoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
русские символы в консоли С++ svkpro Помощь студентам 12 03.12.2012 20:35
Русские буквы в \u символы J-Max Общие вопросы Delphi 4 01.07.2012 19:35
Русские символы в консоле pimple2006 Общие вопросы Delphi 2 16.12.2011 10:50
Кодировка phpmyadmin (русские символы) DJ DIMON PHP 5 27.10.2011 21:13
Русские символы Akord Общие вопросы C/C++ 0 26.09.2010 11:17