Работа с сотовыми телефонами

=== Работа с сотовыми телефонами ===
Взаимодействие с мобильными телефонами
Вы, наверное, не раз видели или даже пользовались программами, которые отображают любую информацию о вашем телефоне. Сейчас вы узнаете, как самим сделать такую программу!
Для начала положим на форму Memo, CheckBox "Соединиться», кнопку «Послать команду», Edit.
==== Подключение ====
Итак, в «Public declarations» объявляем 2 функции и 2 процедуры, потом объявляем 4 глобальные переменные:
 TForm1 = class(TForm)
 public
 { Public declarations }
 function OpenCOMPort: Boolean;
 function SetupCOMPort: Boolean; // для настройки порта
 procedure Connect;
 procedure Disconnect;
 end;
var
 Form1: TForm1;
 ComFile: THandle; // Хэндл создаваемого нами файла
 ComString: string; // (COM1, COM2 или COM3)
 ComSpeed: Integer; // Скорость взаимодействия с COM-портом
 Status: Boolean; // подключен или не подключен (чтобы в дальнейшем проверять статус)
Жмём Ctrl+C и записываем дальше:
procedure TForm1.Connect;
begin
 ComString := 'COM2';
 ComSpeed := 19200;
 if OpenCOMPort = true then // Открываем порт…
 if SetupCOMPort = true then // …и конфигурируем его
 Memo1.Lines.Add('Подключились...');
 Sleep(1500); // засыпаем на полторы секунды чтобы дать время на соединение
end;
procedure TForm1.Disconnect;
begin
 CloseHandle(ComFile);
 Memo1.Lines.Add('Отключились.');
end;
function TForm.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 TForm1.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;
// Теперь два раза щёлкаем по CheckBox и записываем код:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 if CheckBox1.Checked then
 Connect
 else
 Disconnect;
end;
// В событии формы OnDestroy записываем:
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 + #13 + #10;
 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;
Вот и всё! Теперь подключите телефон, запускайте программу, ставьте галку в CheckBox'е, и, после того, как вам написали в Memo, что вы подключились вводите в Edit любую AT-команду и жмите «Послать команду». Удачи!
==== Некоторые полезные команды AT ====
Этими командами вы можете воспользоваться, для посылки телефону (из поля Edit):
 AT+CGMI - производитель
 AT+CGMM - модель телефона
 AT+CPAS - состояние
 AT+COPS? - оператор
 AT+CGSN - номер IMEI
 AT+CGMR - версия прошивки
 AT+CBC - степень зарядки телефона
 AT+CREG? - статус сети
 AT^SCID - номер SIM-карты
 AT+CIMI - номер IMSI
 AT^SPIC - попыток до блокировки SIM-карты
Более подробно о командах вы сможете узнать из pdf-инструкции s35i_c35i_m35i_atc_commandset_v01.pdf (можно утащить по адресу: http://www.like.e-technik.uni-erlangen.de/...andset_v01.pdf)
Примечания: Автор: Лазуткин Алексей (alessio19@mail.ru), помощь в написании: av3nger (av3nger@hakep.com)
Author: Лазуткин Алексей
ID: 01352