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