Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Tethering:Projeleriniz arasında ağ ile ilişki/ortaklık,haberleşme,dosya transferi yap
#1
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 ? Huh

- 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. Idea

- Takip ettiğim "Malcolm Groves" blog linkinden yürüdüm.

tpqa8hlxnp2zuvkcx5rk.jpg
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;

ffshsfzdnojozsz1h3jl.gif
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#2
Elinize sağlık hocam.. 1998 e dönüm ve Kendimi bir ara Mirc odasında hissettim Smile
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#3
Üstadım hakikaten, aynı onun gibi.  Smile

- Bu arada sistemde veya kodlarda sorun yokmuş  Idea Android cephesinden de bağlantı için erişim alabiliyormuş. 

- Benim Android uygulama buton atamalarını yaparken CONNECT property'sini atlamışım. Sadece Identifier aldığında connect işlemi pas geçiyormuş. 


- Forum ahalisine tekrar bildireyim, kodlarda sorun yok, sorunsuz çalışıyor.  Idea
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#4
Üstat, elinize sağlık
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#5
Elinize sağlık, paylaşım için çok teşekkürler.
Cevapla
#6
Elinize sağlık.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#7
(06-01-2019, Saat: 18:46)mrmarman Adlı Kullanıcıdan Alıntı: - Benim Android uygulama buton atamalarını yaparken CONNECT property'sini atlamışım. Sadece Identifier aldığında connect işlemi pas geçiyormuş. 
@mrmarman abi hiç FMX çalışmadım ama senin bu proje kafamda bir ışık yaktı, sana zahmet olmazsa ve bir mahzuru yoksa android tarafında da böylesine basit bir örnek paylaşabilir misin?
Cevapla
#8
Bu aynı örnek android'de de çalışır.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Android’de Dosya Depolama ve Paylaşma-2: And 11 SDK 30 Scoped Storage SAF MediaStore emozgun 12 4.724 19-03-2024, Saat: 22:29
Son Yorum: nguzeller
  Rest Server'dan Android cihaza apk transferi serifaliyagci 0 229 22-08-2023, Saat: 17:31
Son Yorum: serifaliyagci
  Android *.gif Dosya Oynatma. hayalyilmaz43 15 3.470 05-05-2023, Saat: 10:11
Son Yorum: RAD Coder
  iOS’ta Dosya Depolama ve Paylaşma emozgun 7 1.194 13-12-2022, Saat: 10:03
Son Yorum: emozgun
  FMX video'nun dosya yolunu çekme skaracan 4 1.130 09-03-2022, Saat: 20:43
Son Yorum: skaracan



Konuyu Okuyanlar: 1 Ziyaretçi