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

Материал из DRKB

Работа с сотовыми телефонами[править | править код]

Взаимодействие с мобильными телефонами Вы, наверное, не раз видели или даже пользовались программами, которые отображают любую информацию о вашем телефоне. Сейчас вы узнаете, как самим сделать такую программу!

Для начала положим на форму 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