Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Desktop-Applikation und Android-APP reconnect (https://www.delphipraxis.net/206975-delphi-desktop-applikation-und-android-app-reconnect.html)

Siggi 14. Feb 2021 12:16

Delphi Desktop-Applikation und Android-APP reconnect
 
Hallo zusammen,

ich erstelle mein erstes Android-Projekt und habe eine Frage zum Verbindungsaufbau/-Abbau.

Grundkonzept:
  • Eine Desktop-Applikation arbeitet als "Server" und liefert auf Anforderung aus der Android-App Daten
  • Die Verbindung wird per TetheringManager.Autoconnect aufgebaut (WLAN)
  • die Android-App sendet eine Anfrage
  • die Anfrage wird in der Server-Applikation per ResourceReceived eines TetheringAppProfiles empfangen
  • die Server-Applikation antwortet
  • Die Antwort wird in der Android-App ebenfall über ein ResourceReceived eines TetheringAppProfile empfangen

Das ganze funktioniert wunderbar, wenn ich beide Applikationen neu starte, verbinde und miteinander kommunizieren lasse.
Beende ich eine der beiden Applikationen, starte nur diese neu und baue die Verbindung neu auf, erhalte ich zwar über TetheringAppManger.PairedToRemote eine positive Rückmeldung zum Verbindungsaufbau, aber die Events ResourceReceived werden nicht mehr ausgelöst.

Beim Beenden der Android-App baue ich die Verbindung wie folgt ab:
Delphi-Quellcode:
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  I: Integer;
begin
  for I := TetheringManager1.PairedManagers.Count - 1 downto 0 do
    TetheringManager1.UnPairManager(TetheringManager1.PairedManagers[I]);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  TetheringAppProfile1.Enabled:=False;
  TetheringManager1.Enabled:=False;
end;
Bei der Desktop-Applikation habe ich vergleichbaren Code auf einem Button "Verbindung aufbauen/trennen"
Delphi-Quellcode:
procedure TfrmInventory.btnAppConnectClick(Sender: TObject);
VAR I: Integer;
begin
  if btnAppConnect.Caption='APP verbinden' then // wenn's grundsätzlich geht, anderen Weg als per Caption, aber für ersten Test OK
  begin
    TetheringAppProfile1.Enabled:=true;
    TetheringManager1.Enabled:=true;
    TetheringManager1.AutoConnect;
  end
  else
  begin
    for I := TetheringManager1.PairedManagers.Count - 1 downto 0 do
      TetheringManager1.UnPairManager(TetheringManager1.PairedManagers[I]);
    TetheringAppProfile1.Enabled:=False;
    TetheringManager1.Enabled:=False;
    btnAppConnect.Caption:='APP verbinden';
  end;
end;
Mache ich da einen grundsätzliche Denkfehler oder fehlt nur etwas in meinem Code?

Danke für Eure Tipps,
Siggi

TurboMagic 14. Feb 2021 14:43

AW: Delphi Desktop-Applikation und Android-APP reconnect
 
Weiß ich leider auch nicht, es wäre aber interessant, da ich das in einem Projekt evtl. auch nutzen will.
Noch was: die von dir im Profil angegebene Delphi Version kann eher nicht sein, da gab's das noch nicht ;-)

Siggi 14. Feb 2021 15:14

AW: Delphi Desktop-Applikation und Android-APP reconnect
 
Turbomagic: Danke für den Hinweis auf's veraltete Profil, gerade zum Jahreswechsel umgestellt und jetzt auch hier angepasst.

Siggi 14. Feb 2021 16:48

AW: Delphi Desktop-Applikation und Android-APP reconnect
 
Habe jetzt noch mal ein paar Tests gemacht.
Problem scheint auf der Seite der Android-App zu liegen. Die Dekstop-App kann ich beenden, starten, per Button die Verbindung trennen und neu aufbauen und es klappt alles.
Beende ich die Android-App (Application.Terminate und dann per Android-Task-Manager die App schließen oder "alle schließen") und starte nur die Android-App neu, kommt zwar die Verbindung zustande, aber die Events werden nicht ausgelöst.

Einen Schritt weiter (Ursache aber noch keine Lösung) hat mich folgende Test-Ausgabe gebracht:
Delphi-Quellcode:
 
  ShowMessage('AManagerInfo.ManagerIdentifier:'+AManagerInfo.ManagerIdentifier);
Beende ich die Desktop-App oder beende von dort die Verbindung und baue sie neu auf, erhalte ich immer die gleichen Daten.
Beende ich aber die Android-App, wird nach deren Neustart ein andere Wert für AManagerInfo.ManagerIdentifier zurückgeliefert. Demnach müsste ich "nur" einen Weg finden, entweder unter Android immer den gleichen ManagerIdentifier zu verwenden oder in der Desktop-App bei geändertem ManagerIdentifier auf den geänderten ManagerIdentifier zu reagieren. Vermutlich muss nur etwas mehr "aufgeräumt" werden beim Reconnect, damit dann der neue ManagerIdentifier für die Events greift - aber wie?

vielleicht hat mit dieser Zusatzinfo jemand einen Tipp für mich...

VG
Siggi

Siggi 15. Feb 2021 17:34

AW: Delphi Desktop-Applikation und Android-APP reconnect
 
Habe mir jetzt erst mal so beholfen, dass ich beiden Objekte TetheringManager und TetheringAppProfile nicht als Objekte zur DesignTime aufs Formular lege, sondern zur Laufzeit neu erzeuge und bei Reconnect komplett verwerfe und erstelle. Damit "vergisst" der TetheringManager dann auch den bisherigen ManagerIdentifier und verbindet die ResourceReceived-Methode mit dem neuen ManagerIdentifier.
Delphi-Quellcode:
procedure TmyForm.CreateTethering;
begin
  TetheringManager1 := TTetheringManager.Create(self);
  with TetheringManager1 do
  begin
    OnPairedToRemote := TetheringManager1PairedToRemote;
    Text := 'TetheringManager1';
    AllowedAdapters := 'Network';
  end;
  TetheringAppProfile1 := TTetheringAppProfile.Create(self);
  with TetheringAppProfile1 do
  begin
    Manager := TetheringManager1;
    Text := 'TetheringAppProfile1';
    Group := 'myGroup';
    OnResourceReceived := TetheringAppProfile1ResourceReceived;
  end;
end;

procedure TmyForm.FreeTethering;
begin
  if TetheringManager1 <> nil then
    TetheringManager1.Free;
  if TetheringAppProfile1 <> nil then
    TetheringAppProfile1.Free;
end;
Dann kann ich beliebig die Android-App beenden und von der Desktop-Applikation die Verbindung neu aufbauen.
Das geht vielleicht auch einfacher / besser (??), aber so funktioniert es erst mal.

Siggi

TurboMagic 15. Feb 2021 17:40

AW: Delphi Desktop-Applikation und Android-APP reconnect
 
Schön, dass du eine Lösung gefunden hast.
Gibt's keine Möglichkeit die vergebene ID anderweitig zu resetten?

Falls hier nichts mehr kommt wäre es evtl. auch gut deinen Fall als Bugreport in
https://quality.embarcadero.com/ zu
beschreiben damit, falls es nicht doch eine andere Lösung gibt, das grundelegende
Problem angegangen wird. Weil dein Szenario wird ja ganz bestimmt in der Praxis
auftreten...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz