Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 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 Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. linkinden yürüdüm.

peertopeer.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, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firemonkey WebBrowser Dosya Seçimi narkotik 0 56 14-10-2019, Saat: 00:17
Son Yorum: narkotik
  Android ile PC Arasında dosya okumak bsogulcan 3 291 22-08-2019, Saat: 16:03
Son Yorum: bsogulcan
  Delphi 10.3 FMX Android Sdk Dosya Yolu Belirtme Hatası xenginyigit 3 492 19-05-2019, Saat: 05:20
Son Yorum: xenginyigit
  virtualbox dosya paylaşımı sorunu Fahrettin 7 739 02-04-2019, Saat: 22:18
Son Yorum: barox
  Fmx Dosya ve dizin fonksiyonları CesuR 6 790 01-02-2019, Saat: 10:58
Son Yorum: CesuR



Konuyu Okuyanlar: 1 Ziyaretçi