Merhaba.
- Bugün Tethering konusunda biraz tecrübe edineyim istedim. Yakında kendi çalıştığım kurumdaki stok işlemleri için Barcode cihazı dışında mobil telefondan da veri kabul etmek üzerine bir çalışmam olacak deneme yapıyorum.
- Bir Helper sınıf da hazırlıyorum. Android de olsa Desktop projesi de; sadece bu helper uniti eklemek ile hiç bir başka unsura gerek kalmaksızın projeyi donatmayı, dolayısıyla mevcut herhangi bir projeye bu uniti ekleyice kendiliğinden özelliği ek bir ayar yapmaksızın kazandırmayı amaçladım.
- Şu an başardım ancak anlam veremediğim, kaynak da bulamadığım bir durum söz konusu...
- Aşağıdaki şekilde her şey kusursuz çalışıyor.
- Anlam veremediğim husus Android cephesine geçince "Gruba Bağlan" işlemi etkisiz kalıyor. Hata vermiyor ancak grubu tetiklemiyor. Ancak diğer yandan Desktop'dan "Gruba Bağlan" deyince Android sorunsuz tetikleniyor ve her iki yönde de ( Android'den gönderilen Text Desktop'a, ya da tersi Desktop'dan giden text ) Android'e hemen ulaşıyor.
- Sorunun Özeti : Desktop ve Android projeleri aynı ağ altında çalışıyorlar. Android proje çalışmadan önce oluşan gruba sonradan Android üzerinden dahil olmak istersem tepkisiz kalıyor. Android proje çalışıyorken Desktop(lar) dan birinden veya hangisi bağlanma talebi gönderirse Android bunu görüyor ve sisteme dahil oluyor. Neden olabilir ?
- Lütfen Desktop projelerde timer ile ardışık / periyodik "Gruba Ekle" butonuna bassın gibi palyatif çözümler önermeyiniz. Bu düşünülmeyecek bir çözüm değil ondan yazmak zorunda kalıyorum.
- Burada bir problemin kaynağını arıyorum. Teşekkürler.
- Takip ettiğim "Malcolm Groves" blog linkinden yürüdüm.
modülleri bu şekilde birbiri ile haberleşecek şekilde kendiliğinden yapılanıyor. BU güzel bir şey.
Şimdi hazırladığım Helper Uniti paylaşayım.
Proje ise basit, üzerinde iki button ve bir Memo olan basit bir form.
- Bugün Tethering konusunda biraz tecrübe edineyim istedim. Yakında kendi çalıştığım kurumdaki stok işlemleri için Barcode cihazı dışında mobil telefondan da veri kabul etmek üzerine bir çalışmam olacak deneme yapıyorum.
- Bir Helper sınıf da hazırlıyorum. Android de olsa Desktop projesi de; sadece bu helper uniti eklemek ile hiç bir başka unsura gerek kalmaksızın projeyi donatmayı, dolayısıyla mevcut herhangi bir projeye bu uniti ekleyice kendiliğinden özelliği ek bir ayar yapmaksızın kazandırmayı amaçladım.
- Şu an başardım ancak anlam veremediğim, kaynak da bulamadığım bir durum söz konusu...
- Aşağıdaki şekilde her şey kusursuz çalışıyor.
- Anlam veremediğim husus Android cephesine geçince "Gruba Bağlan" işlemi etkisiz kalıyor. Hata vermiyor ancak grubu tetiklemiyor. Ancak diğer yandan Desktop'dan "Gruba Bağlan" deyince Android sorunsuz tetikleniyor ve her iki yönde de ( Android'den gönderilen Text Desktop'a, ya da tersi Desktop'dan giden text ) Android'e hemen ulaşıyor.
- Takip ettiğim "Malcolm Groves" blog linkinden yürüdüm.
modülleri bu şekilde birbiri ile haberleşecek şekilde kendiliğinden yapılanıyor. BU güzel bir şey.
Şimdi hazırladığım Helper Uniti paylaşayım.
unit TetheringHelper;
interface
Uses
Classes, SysUtils,
System.Tether.Manager,
System.Tether.AppProfile,
IPPeerClient,
IPPeerServer;
Type
TOnNotification = procedure(Sender: TObject; aMsg: String) of object;
TOnConnectPeer = procedure(Sender: TObject; aIdentifier: String) of object;
TOnDisConnectPeer = procedure(Sender: TObject; aIdentifier: String) of object;
Type
TTethering_Helper = Class(TObject)
private
FOnNotification : TOnNotification;
FOnConnectPeer : TOnConnectPeer;
FOnDisconnectPeer : TOnDisConnectPeer;
Var
FTetheringAppProfile : TTetheringAppProfile;
FTetheringManager : TTetheringManager;
FLog : TStrings;
function TetheringAltyapisiHazirla: boolean;
procedure TetheringBaglantilariKes;
procedure OnPairedFromLocal(const Sender: TObject; const AManagerInfo: TTetheringManagerInfo);
procedure OnPairedToRemote (const Sender: TObject; const AManagerInfo: TTetheringManagerInfo);
procedure OnTetAppProfOnResReceived (const Sender: TObject; const AResource: TRemoteResource);
procedure OnTetAppProfOnDisconnect(const Sender: TObject; const AProfileInfo: TTetheringProfileInfo);
public
property OnNotification : TOnNotification read FOnNotification write FOnNotification;
property OnConnectPeer : TOnConnectPeer read FOnConnectPeer write FOnConnectPeer;
property OnDisconnectPeer : TOnDisConnectPeer read FOnDisconnectPeer write FOnDisconnectPeer;
constructor Create;
destructor Destroy; Override;
property Log : TStrings read FLog Write FLog;
function Identifier : String;
procedure Connect;
procedure SendString( aStr: String );
procedure GrupListesi( aListe : TStrings );
end;
Var
xTethering_Helper : TTethering_Helper;
implementation
{ TTethering_Helper }
procedure TTethering_Helper.Connect;
begin
FTetheringManager.AutoConnect();
end;
constructor TTethering_Helper.Create;
begin
Inherited; // Create'de daima başta call edicez...
//...
if TetheringAltyapisiHazirla then
begin
FTetheringAppProfile.Enabled := True;
FTetheringManager.Enabled := True;
end;
end;
destructor TTethering_Helper.Destroy;
begin
TetheringBaglantilariKes();
inherited;
end;
procedure TTethering_Helper.GrupListesi( aListe : TStrings );
var
i : Integer;
begin
if (FTetheringManager.PairedManagers.Count > 0) then
for i := 0 to FTetheringManager.PairedManagers.Count-1
do aliste.Add( FTetheringManager.RemoteProfiles.Items[i].ManagerIdentifier );
end;
function TTethering_Helper.Identifier: String;
begin
Result := FTetheringManager.Identifier;
end;
function TTethering_Helper.TetheringAltyapisiHazirla: boolean;
begin
if NOT Assigned(FTetheringAppProfile) then
begin
FTetheringAppProfile := TTetheringAppProfile.Create(nil);
FTetheringManager := TTetheringManager.Create(nil);
end;
try
FTetheringAppProfile.Enabled := False;
FTetheringManager.Enabled := False;
FTetheringManager.AllowedAdapters := 'Network';
FTetheringManager.OnPairedFromLocal := OnPairedFromLocal;
FTetheringManager.OnPairedToRemote := OnPairedToRemote;
FTetheringAppProfile.Group := 'ARMAN_Group_11806'; //Diğer projeler de aynı grup olmalı...
FTetheringAppProfile.Text := 'ARMAN_Group_11806_Text';
FTetheringAppProfile.Manager := FTetheringManager;
FTetheringAppProfile.OnResourceReceived := OnTetAppProfOnResReceived;
FTetheringAppProfile.OnDisconnect := OnTetAppProfOnDisconnect;
Result := True;
finally
;
end;
end;
procedure TTethering_Helper.TetheringBaglantilariKes;
var
i: Integer;
begin
for i := FTetheringManager.PairedManagers.Count - 1 downto 0 do
FTetheringManager.UnPairManager( FTetheringManager.PairedManagers[i] );
for i := FTetheringAppProfile.Resources.Count - 1 downto 0 do
FTetheringAppProfile.Resources.Items[i].Free;
FTetheringAppProfile.Enabled := False;
FTetheringManager.Enabled := False;
FTetheringAppProfile.Free;
FTetheringManager.Free;
end;
procedure TTethering_Helper.OnPairedFromLocal(const Sender: TObject;
const AManagerInfo: TTetheringManagerInfo);
begin
TThread.Synchronize(nil, procedure
begin
if Assigned( Log ) then Log.Add( Format('Connected : %s %s',[
AManagerInfo.ManagerIdentifier,
AManagerInfo.ManagerName ]) );
if Assigned( OnConnectPeer ) then
OnConnectPeer( nil, AManagerInfo.ManagerIdentifier );
end);
end;
procedure TTethering_Helper.OnTetAppProfOnDisconnect(const Sender: TObject;
const AProfileInfo: TTetheringProfileInfo);
begin
if xTethering_Helper <> nil then // Bunu yazmazsak RunTimeError...
// çünkü bizde de bu evente düşüyor..
TThread.Synchronize(nil, procedure
begin
if Assigned( Log ) then Log.Add( Format('DisConnected : %s',[
AProfileInfo.ManagerIdentifier
]) );
if Assigned( OnDisconnectPeer ) then
OnDisconnectPeer( nil, AProfileInfo.ManagerIdentifier );
end);
end;
procedure TTethering_Helper.OnPairedToRemote(const Sender: TObject;
const AManagerInfo: TTetheringManagerInfo);
begin
TThread.Synchronize(nil, procedure
begin
if Assigned( Log ) then Log.Add( Format('Connected : %s %s',[
AManagerInfo.ManagerIdentifier,
AManagerInfo.ManagerName ]) );
end);
end;
procedure TTethering_Helper.OnTetAppProfOnResReceived(const Sender: TObject;
const AResource: TRemoteResource);
begin
if Assigned( OnNotification ) then // event assign edilmiş mi kontrolü
begin
OnNotification( nil, AResource.Value.AsString );// event. çağırdık.
end;
if AResource.Hint = 'Hint:Edit1Text' then
begin
TThread.Synchronize(nil, procedure
begin
if Assigned( Log )
then Log.Add( Format('Data ''Hint:Edit1Text'' Geldi : %s',[ AResource.Value.AsString ] ) );
end);
end;
end;
procedure TTethering_Helper.SendString(aStr: String);
var
i : Integer;
begin
if FTetheringManager.PairedManagers.Count > 0 then
for i := 0 to FTetheringManager.PairedManagers.Count-1 do begin
FTetheringAppProfile.SendString( FTetheringManager.RemoteProfiles.Items[i],
'Hint:Edit1Text',
aStr)
end
else if Assigned(Log)
then Log.Add('Herhangi bir PAIR bulunamadı...' );
end;
initialization
xTethering_Helper := TTethering_Helper.Create;
finalization
FreeAndNil(xTethering_Helper);
end.
Proje ise basit, üzerinde iki button ve bir Memo olan basit bir form.
uses TetheringHelper;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
xTethering_Helper.Connect();
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
xTethering_Helper.SendString( Edit1.Text );
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
xTethering_Helper.GrupListesi( Memo1.Lines );
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := 'Host';
//xTethering_Helper.Log := Memo1.Lines;
xTethering_Helper.OnNotification := MesajGeldi;
xTethering_Helper.OnConnectPeer := OnPeerConnect;
xTethering_Helper.OnDisconnectPeer := OnPeerDisconnect;
Label2.Caption := Caption + ': ' + xTethering_Helper.Identifier();
end;
procedure TForm1.MesajGeldi(Sender: TObject; aMsg: String);
begin
Memo1.Lines.Add(' Gelen Mesaj : ' + aMsg );
end;
procedure TForm1.OnPeerConnect(Sender: TObject; aIdentifier: String);
begin
Memo1.Lines.Add(' Yeni Bağlantı : ' + aIdentifier );
end;
procedure TForm1.OnPeerDisconnect(Sender: TObject; aIdentifier: String);
begin
Memo1.Lines.Add(' Bağlantısı Kopan : ' + aIdentifier );
end;
Saygılarımla
Muharrem ARMAN

Muharrem ARMAN



