Главная » Файлы » Delphi » Статьи

Tethering. Часть 1. Обновление списков, отправка сообщения.
[ Скачать проект (65.9 Kb) ] 03.05.2015, 14:10
Технология App Tethering (далее Tethering) появилась в Rad Studio XE6. Tethering работает как в VCL так и в FM.
Цель всего курса статей по Tethering написание собственной информационной системы позволяющей:
  1. передавать данные с одного устройства на другое;
  2. управлять компьютером(-ами) с мобильного устройства.
Проект будет иметь часть функционала похожего на функционал умного дома.
Для основы проекта воспользуемся готовым примером от разработчиков, а именно проектом PhotoWall.
Информационная система будет состоять из двух проектов:
  1. передатчик;
  2. приёмник.

Рассмотрим передачу сообщения от передатчика (Android)  приёмнику (Windows). Сама передача текста выглядит просто:

TAP.SendString(TM.RemoteProfiles[LbWalls.ItemIndex], 'String', Memo1.Text);

Где:
  1. TAP - компонент TTetheringAppProfile;
  2. SendString - процедура отправки сообщения;
  3. TM - компонент TTetheringManager;
  4. RemoteProfiles - список удаленных приёмников;
  5. LbWalls - компонент TListBox. Отображает список удаленных приёмников;
  6. ItemIndex - порядковый номер приёмника;
  7. 'String' - описание передаваемых данных (не обязательно 'String', это поле служит для распознавания того, что получает приемник, там может быть любое описание);
  8. Memo1.Text - текстовая часть компонента TMemo, которая будет отправлена приёмнику.
Прием сообщения аналогично прост:

Memo.Lines.Add(AResource.Value.AsString);

Где:
  1. Memo.Lines.Add - процедура добавления новой строки компонента TMemo;
  2. AResourse - полученные данные;
  3. Value - значение полученных данных;
  4. AsString - указывает на строковый тип полученных данных.
Теперь более подробно о передатчике и приёмнике:
Приемник:
На форме имеется три компонента: TMemo, TTetheringManager, TTetheringAppProfile:


а также две процедуры:
процедура OnRequestManagerPassword компонента TTetheringManager (RTM), отвечающая за получение пароля (для своего проекта заменить на другой):

procedure TRecieveForm.RTMRequestManagerPassword(const Sender: TObject; const RemoteIdentifier: string; var Password: string);
begin
  Password := '1234';
end;

процедура OnResourceReceived компонента TTetheringAppProfile(RTAP), вызываемая при получении данных:

procedure TRecieveForm.RTAPResourceReceived(const Sender: TObject; const AResource: TRemoteResource);
begin
  Memo.Lines.Add(AResource.Value.AsString);
end;


Передатчик устроен несколько сложнее:
На форме: TTaskBar, TButton/TSpeedButton, TText, TListBox, TMemo, TTetheringManager, TTetheringAppProfile:

Процедуры:
Для удобства созданы дополнительно две процедуры, процедура FindWalls отвечает за разъединение соединений между устройствами, процедура RefreshList отвечает за обновление списка удаленных устройств, а также автоматически подключается к первому удаленному профилю:

procedure TSendForm.FindWalls;
var I: Integer;
begin
  LbWalls.Clear;
  for I := TM.PairedManagers.Count - 1 downto 0 do
    TM.UnPairManager(TM.PairedManagers[I]);
  TM.DiscoverManagers;
end;

 

procedure TSendForm.RefreshList;
var I: Integer;
begin
  LbWalls.Clear;
  for I := 0 to TM.RemoteProfiles.Count - 1 do
      LbWalls.Items.Add(TM.RemoteProfiles[I].ProfileText);
 
  if LbWalls.Count > 0 then
    begin
      LbWalls.ItemIndex := 0;
      Connected := TAP.Connect(TM.RemoteProfiles[0]);
    end;
end;

а также процедуры обращающиеся к ним:
OnShow формы:

procedure TSendForm.FormShow(Sender: TObject);
begin
  FindWalls;
end;

OnEndManagersDiscovery компонента TTetheringManager(TM), вызывается при завершении поиска удаленных TTetheringManager:

procedure TSendForm.TMEndManagersDiscovery(const Sender: TObject; const RemoteManagers: TTetheringManagerInfoList);
var I: Integer;
begin
  for I := 0 to RemoteManagers.Count - 1 do TM.PairManager(RemoteManagers[I]);
end;

OnEndProfilesDiscovery компонента TTetheringManager(TM), вызывается при завершении поиска удаленных TTetheringAppProfile:

procedure TSendForm.TMEndProfilesDiscovery(const Sender: TObject; const RemoteProfiles: TTetheringProfileInfoList);
begin
  RefreshList;
end;

OnRemoteManagerShutdown компонента TTetheringManager(TM), вызывается при разъединении связи с удаленным TTetheringManager:

procedure TSendForm.TMRemoteManagerShutdown(const Sender: TObject; const ManagerIdentifier: string);
begin
  RefreshList;
end;

OnRequestManagerPassword компонента TTetheringManager(TM):

procedure TSendForm.TMRequestManagerPassword(const Sender: TObject; const RemoteIdentifier: string; var Password: string);
begin
  Password := '1234';
end;

OnClick компонента TSpeedButton, с помощью которой отправляется сообщение:

procedure TSendForm.SendButtonClick(Sender: TObject);
begin
  TAP.SendString(TM.RemoteProfiles[LbWalls.ItemIndex], 'String', Memo1.Text);

end;

Проверяем работоспособность приложений:
в списке приёмников отображены два найденных приемника, отправим на один из них сообщение:


Как видно сообщение доставлено.

В следующий раз более подробно рассмотрим свойства и процедуры компонентов TTetheringManager и TTetheringAppProfile.
Передача файлов рассматриваться не будет, т.к. она отлична показана в оригинальном проекте PhotoWall.
Категория: Статьи | Добавил: TAdm | Теги: Studio, chat, Rad, Delphi, tethering, чат
Просмотров: 1849 | Загрузок: 341 | Рейтинг: 0.0/0
Всего комментариев: 0
ComForm">
avatar