Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Работа с GSM телефоном

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12

Открыть новую тему     Написать ответ в эту тему

Dim2004

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gazlan

Цитата:
Рекомендую забыть про режим ASCII и использовать PDU - полная свобода рук.

Количество гемора соответствует количеству возможностей .
 

Цитата:
Инфы в инете - как грязи.

Это точно...

Всего записей: 222 | Зарегистр. 11-05-2004 | Отправлено: 15:57 02-08-2005
Danya



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А у меня другая проблема.
Я не как не могу получить ответ от телефона. Т.е Есть программа которая подключается к телефону но до него не доходят AT команды. А может они и доходят но ответа не полыучаю. Пожалуйста помогите.

Код:
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
 
 
  end;
 
var
  Form1: TForm1;
  ComFile: THandle; //Хэндл создаваемого нами файла
  ComString: string; //(COM1, COM2 или COM3)
  ComSpeed: Integer; //Скорость взаимодействия с COM-портом
  Status: Boolean; //подключен или не подключен (чтобы в дальнейшем проверять статус
implementation
 
{$R *.dfm}
 
function OpenCOMPort: Boolean;
var DeviceName: array[0..80] of Char;  
 Device: string;
begin  
 Device := ComString;  
 StrPCopy(DeviceName, Device);  
 ComFile := CreateFile(DeviceName,  
   GENERIC_READ or GENERIC_WRITE,  
   0,  
   nil,  
   OPEN_EXISTING,  
   FILE_ATTRIBUTE_NORMAL,  
   0);  
 if ComFile = INVALID_HANDLE_VALUE then  
   begin  
     Result := False;  
     Status := Result;  
   end  
 else  
   begin  
     Result := True;  
     Status := Result;  
   end;  
 
end;  
 
function SetupCOMPort: Boolean;
const RxBufferSize = 256;  
 TxBufferSize = 256;  
var DCB: TDCB;  
 Config: string;  
 CommTimeouts: TCommTimeouts;  
begin  
 Result := True;  
 if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then  
   Result := False;  
 if not GetCommState(ComFile, DCB) then  
   Result := False;  
 
 Config := 'baud=' + IntToStr(ComSpeed) + ' parity=n data=8 stop=1'; //Устанавливаем скорость  
 if not BuildCommDCB(@Config[1], DCB) then  
   Result := False;  
 if not SetCommState(ComFile, DCB) then  
   Result := False;  
 
 with CommTimeouts do  
   begin  
     ReadIntervalTimeout := 0;  
     ReadTotalTimeoutMultiplier := 0;  
     ReadTotalTimeoutConstant := 1000;  
     WriteTotalTimeoutMultiplier := 0;  
     WriteTotalTimeoutConstant := 1000;  
   end;  
 if not SetCommTimeouts(ComFile, CommTimeouts) then  
   Result := False;  
end;
 
 
procedure Connect;
begin
 ComString := 'COM1';
 ComSpeed := 19200;
 if OpenCOMPort = true then //Открываем порт…
   if SetupCOMPort = true then //…и конфигурируем его
     Form1.Memo1.Lines.Add('Подключились...');
 Sleep(1500); //засыпаем на полторы секунды чтобы дать время на соединение
end;
 
procedure Disconnect;
begin
 CloseHandle(ComFile);
 Form1.Memo1.Lines.Add('Отключились.');
end;
 
 
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
   Connect
 else  
   Disconnect;
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
   if Status = true then //При выходе из программы отключаемся
   Disconnect;
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var BytesWritten: DWORD;
 s: string;
 d: array[1..1500] of Char;
 BytesRead: DWORD;
 i: Integer;
 Result: string;
begin
 s := Edit1.Text; //Берём команды из Edit1…
 s := s;
 WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону
 Result := '';
 if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
   begin
     MessageDlg('Ошибка чтения!', mtError, [mbOK], 0);
       exit;
   end;
 
 s := '';
 for i := 1 to BytesRead do //Считываем ответ от телефона
   s := s + d[i];
 Result := s;
 Memo1.Lines.Add(Result); //Выводим ответ от телефона в Memo
 
end;
 
end.
 

Всего записей: 130 | Зарегистр. 24-06-2004 | Отправлено: 18:37 05-08-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
 WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону  
 Result := '';  
 if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then  
   begin  
     MessageDlg('Ошибка чтения!', mtError, [mbOK], 0);  
       exit;  
   end;

А телефон те чё, реактивный? Подождать чучуть надо перед тем, как читать.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 18:59 05-08-2005
Danya



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
С этим проблем нет. К тому же я уже разобрался с моей проблемой. Всем спасибо.

Всего записей: 130 | Зарегистр. 24-06-2004 | Отправлено: 21:45 05-08-2005
RQQT



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Если есть у когонибудь компоненты поделитесь пожалуйста... у самого есть Oxygen SMS component но без лечилки...  

Набор компонентов - AsyncPro ( http://sourceforge.net/projects/tpaproclx/ ). Компонент конкретно - ApdGSMPhone.

Всего записей: 24 | Зарегистр. 07-03-2004 | Отправлено: 01:22 06-08-2005
Danya



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А кто может мне подсказать как перевести сообщения с телефона в нормальный читабельный вид. Я говорю про сообщения в кирилице. Я пытался разобратся в документации к PDU у меня нечего не вышло. Может подскажите алгоритм по которому можно переводить сообщения в unicod.

Всего записей: 130 | Зарегистр. 24-06-2004 | Отправлено: 14:25 08-08-2005
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Danya
hxxp://unicode.org/
под винду есть соответствующее API

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 16:59 08-08-2005
Dzar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Проблема продолжается.... смс отправляется вот так  
AT+CSCS="UCS2"  
AT+CMGF=1  
AT+CMGS="8916*******"  
041F044004380432043504420021
то заместо слова "привет!" приходит "      !"
может кто сталкивался?

Всего записей: 17 | Зарегистр. 22-06-2005 | Отправлено: 06:59 09-08-2005
Danya



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
под винду есть соответствующее API  

Я конечно извеняюсь, но причем здесь API. Я думаю это надо самому писать.
 
Добавлено:
Dzar
Подскажи пожалуйста как ты получил
Цитата:
041F044004380432043504420021  
?

Всего записей: 130 | Зарегистр. 24-06-2004 | Отправлено: 12:06 09-08-2005
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Danya
При том что винда позволяет переводить сообщения из win1251 в unicode
Можно и самому написать, а вот надо ли это делать ?

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 12:37 09-08-2005
Danya



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MoKC0DeR
Если я ошибаюсь то поправте меня, но в сотовом телефоне SMS хранятся в UCS2 а не в win1251. И поэтому API здесь не поможет, т.к Винь не работает с данной кодировкой.

Всего записей: 130 | Зарегистр. 24-06-2004 | Отправлено: 13:12 09-08-2005
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Danya
Для начала я не стал бы говорить что
Цитата:
в сотовом телефоне SMS хранятся в UCS2
я лучше скажу что в некоторых сотовых телефонах SMS хранятся в UCS2. Чтоб преобразовать текстовую строку в unicode есть функция MultiByteToWideChar.
И скажу больше для NT систем UNICODE является основной кодировкой

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 15:38 09-08-2005
Dzar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Dzar  
Подскажи пожалуйста как ты получил  
Цитата:041F044004380432043504420021    
 

все просто a..я = 0430..044F А..Я=0410..042А
а вообще послал чебе смс на русском прочитал и посмотрел что приходит....

Всего записей: 17 | Зарегистр. 22-06-2005 | Отправлено: 06:58 10-08-2005
MoKC0DeR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Dzar
hxxp://www.unicode.org/versions/Unicode4.0.0/ch07.pdf - раздел 7.3

Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 08:14 10-08-2005
Danya



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MoKC0DeR
Спасибо.

Всего записей: 130 | Зарегистр. 24-06-2004 | Отправлено: 09:37 10-08-2005
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Проблема продолжается.... смс отправляется вот так  
AT+CSCS="UCS2"  
AT+CMGF=1  
AT+CMGS="8916*******"  
041F044004380432043504420021  
то заместо слова "привет!" приходит "      !"  
может кто сталкивался?

Установи командой AT+CSMP параметры текстового режима.
Например, так
AT+CSMP=17,167,0,8
Последняя цифра - схема кодирования:
8 - UCS2,
0 - 7битное кодирование
240 - флэш смс в 7битном кодировании
и т.д.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 23:52 16-08-2005
Dzar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FireZone
 Cпасибо тебе большое!!!! получилось... остался последний вопрос ...
Как отправить длинную СМС...(когда текст не влазит в одну SMS-ку)
Если текст сообщения не влазиет в одну SMS -ку то возвращается ошибка и смс не уходит....
жедательно сделать так как это сам телефон делает... при отправке длиную смску разбивает по 160 символов (латиницей), но при получении собирает в одну СМС....
было бы здорово.......
заранее спасибо

Всего записей: 17 | Зарегистр. 22-06-2005 | Отправлено: 05:26 17-08-2005
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Как отправить длинную СМС...(когда текст не влазит в одну SMS-ку)

Такая СМС отправляется двумя (и более) раздельными СМС. Доку на эту тему я пока не курил. Как это делается в текстовом режиме - не знаю (подозреваю, что никак). Беглый разбор PDU формата склеенной СМС показал следующее:
Во-первых, в каждой из частей склеенной смс установлен бит UDHI в байте PDU-type, что означает, что тело смс содержит заголовок. Заголовок сей был успешно обнаружен. В моем случае он состоял из шести байт:
050003C70201 - заголовок первой части
050003C70202 - заголовок второй части
Т.е., тело каждой части начинается с 6-байтного заголовка, а оставшиеся 134 байта - собственно само сообщение.
Предполагаю, что 050003C7 - это некий идентификатор, одинаковый для всех частей одной склеенной смс, а 0201 и 0202 - количество частей + номер части.
Во-вторых, все в том же байте PDU-type установлен так же бит MMS, означающий, что будут отправляться еще смс. Если я не ошибаюсь, временной интервал между отправкой частей не должен превышать 5 секунд.
В-третьих, бит запроса подтверждения установлен только в последней части.
Когда разберусь до конца - отпишусь. Но видимо не скоро: сильно занят.
Если разберешься с PDU, думаю, сам все поймешь.
P.S. Телефон выдает заголовок и в текстовом режиме. Попробуй считать с телефона все смс. Если найдутся сообщения с одинаковыми первыми пятью байтами - то это части одного склеенного сообщения. А шестой байт - номер части. Вроде так.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 18:08 18-08-2005
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прочитал доку. Первый байт заголовка - это длина заголовка, все остальное - это блоки вида "тип-длина-данные". Если в заголовке есть блок с типом 00, то это сообщение есть часть склеенной СМС.
Т.е., в нашем случае 050003C70201 разбирается так:
05 - длина заголовка
00 - означает, что это часть склеенного сообщения
03 - длина сопутствующих данных
C7 - первый байт сопутствующих данных, выбирается случайным образом, одинаков для всех частей склеенной СМС.
02 - второй байт сопутствующих данных, количество частей
01 - третий байт сопутствующих данных, порядковый номер части
 
Чтобы послать склеенную СМС, нужно во-первых в байте PDU-Type каждой части установить бит UDHI, который будет означать, что сообщение содержит заголовок, во-вторых, соорудить заголовок для каждой из частей согласно приведенному формату.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 22:41 21-08-2005
Dzar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FireZone
 
 Спасибо! БОЛЬШОЕ!! все работает

Всего записей: 17 | Зарегистр. 22-06-2005 | Отправлено: 12:42 26-08-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Работа с GSM телефоном


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru