Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Wlan connect (https://www.delphipraxis.net/191474-wlan-connect.html)

TERWI 24. Jan 2017 13:00

AW: Wlan connect
 
Danke dir für die "Anteilnahme" :-D, aber:

Zur weiteren Erläuterung:
Das Auslesen besagter ESP-Module soll hier (zwingend) auch noch mit Schläppi-Oldies erfolgen können/müssen, welche noch mit XP arbeiten (WICHTIG - kein Hardware Overkill erwünscht !)

D.h.:
Ich sitze hier grade z.B. an so einem Teil (ACER Travelmate 2450, ~ 12 Jahre alt - aber topfit, hardware upgraded mit T7200 DualCore, 4GB Ram, SSD), welches definitv mangels erhätlicher Treiber auf Win7+ NICHT mehr (richtig) läuft.
.... ich bekomme es auf diesem "Apparat" leider mit XP nicht geregelt, das interne WLAN (Atheros-Chip) mit externem Fritz!-Stick parallel zu nutzen - es geht immer nur ein Adapter aktiv.

Deswegen wichtig: Erkennen, welches WLAN aktiv ist, aktiv beenden & ESP connecten, ESP wieder dis_connecten und vorheriges WLAN wieder re-connecten.

Sehr nervig ist (nicht nur hier !?): Ein automatischer "Re-connet" seitens XP findet offensichtlich wohl nach dem stärksten Signal statt.
Das ESP-Test-Modul liegt gleich neben dem Schläppi .... und komm immer zuerst, solange das Teil noch aktiv/unter Strom ist.
.... eben mal schnell was im WWW nachlesen: .... iss nich ! Erst mal wieder zum Router manuell umschalten.

Würde mich sehr freuen, wenn ich das irgendwie geregelt beommen kann.

himitsu 24. Jan 2017 13:03

AW: Wlan connect
 
Und wenn du im Windows für die ESP das Autoconnect deaktivierst, dann sollten die doch nicht mehr Autoconnected werden? :stupid:

Winziges Problemchen beim Reconnect zum ursprünglichen WLAN, am Ende:
Wenn das nicht autoconnected war, dann weißt du natürlich den WLAN-Schlüssel/Passwort nicht mehr.

TERWI 24. Jan 2017 13:37

AW: Wlan connect
 
Autoconnect ist schon praktisch ....
Wenn ich denn wüsste, wie man das (temporär) abschaltet ? Per Delphi ? Anderer Sache.
... ich bin da nicht so wirklich der WLAN/WIFI-Held.

Das Prob zum "zurückschalten" ist nicht Auto-Connect, sondern das was verbunden war. Ob Auto oder manuell oder nix verbunden ...
Es muss also egal sein, wo ich mich befinde und welche Spots/Router grade greifbar sind, bzw. mit "was/wem" ich verbunden bin (ode zuletzt war).

"Meine" AP's" kenne ich alle beim Namen/Typ (SSID/PW) und wähle diese bei Vorhandensein (nach Scan) explizit aus. Auch diese können an allen Orten vorhanden sein. Mitten in einen Wust von Spots (auf nem Airport, mitten in Berlin oder sonstwo) oder auch mitten in der Pampa ohne jegliche (externe) WWW-Abindung/Router.
... es sind alles Access-Points .... mit eigener IP.

Ach JA:
.... es gäbe dann ggf. auch noch mehrere "Module" abzufragen - d.h. Ur-Netz merken, alle Module "durchverbinden", zurück zum eigentlichen Netz (if available ...)

TERWI 25. Jan 2017 18:26

AW: Wlan connect
 
Vorab-Info:
:-D 8-) .... und sie dreht sich doch !
Nach stundenlanger Sucherei, Leserei und Probierei rückt mir XP endich die SSID (sogar 2 unterschiedliche an 2 Adaptern) raus.
Das funktionier tadellos mit der WLAN-API. Nur gewusst wie und dieses C-Kauderwelsch richtig "gelesen" ...
D.h., nun weiß ich, mit welchem WIFI ich verbunden bin (war) - fehlt nur noch die Umsetzung zur passenden Um- und Rückschaltung mittels "WlanConnect" und fettich ist die Laube.

Um den geneigten Interressenten auch in den Genuss dieser Funktionalität, muss ich allerdings mein Code-Gerümpel etwas aufpeppen und dokumentieren - also bitte etwas Geduld.

TERWI 26. Jan 2017 17:28

AW: Wlan connect
 
.... Geduld bitte - gestaltet sich aufwendiger als gedacht.
Langsam aber sicher "formt" sich aber was.
Ich will ja was halbwegs "schick brauchbares" abliefern ....

TERWI 28. Jan 2017 12:30

AW: Wlan connect
 
Liste der Anhänge anzeigen (Anzahl: 1)
:bounce1: :witch: :hello:
GELÖST - ALLES FUNZT ... auch CONNECT.
... will nur noch "mal eben schnell" NOTIFY einbauen, dann gibbet heute noch nen DEMO-File.
:corky:

EDIT:
.... auch das Notify scheint mich ärgern zu wollen. :roll:
Deshalb hier est mal ne EXE vorab zum testen.
Hier erfolgreich unter XP.
Mal schauen ob alle geneigten Interressenten meine Logig verstehen :-D

TERWI 29. Jan 2017 13:36

AW: Wlan connect
 
.... und wieder ein Stückchen glücklicher: Auch das Notifing funzt nun !
Wo fange ch mal an ? Am besten mit der eigendlichen Frage: WLAN_CONNECT

Es ist ganz offensichtlich
A) .... ein Fehler in der WLAN-API für Delphi, die es div. im WEB (mit gleichem Inhalt zu laden gibt.
Ich habe Diese hier verwendet.
Es ist ein Fehler in der LIB "nduWlanAPI.pas" !
Falsche Parameterdefinition .... so isse's richtig und funzt:
Code:
type
  Pndu_WLAN_CONNECTION_PARAMETERS = ^Tndu_WLAN_CONNECTION_PARAMETERS;
  Tndu_WLAN_CONNECTION_PARAMETERS = record
    wlanConnectionMode: Tndu_WLAN_CONNECTION_MODE;
    strProfile: LPCWSTR;     // changed by TERWI - remind missing "W" for pointer !
//    strProfile: LPCTSTR;   // ORIGINAL declared by author
    pDot11Ssid: Pndu_DOT11_SSID;
    pDesiredBssidList: Pndu_DOT11_BSSID_LIST;
    dot11BssType: Tndu_DOT11_BSS_TYPE;
    dwFlags: DWORD;
  end;
.... ein simples "W" fehlte.

B) .... und die Frage der richtigen Initialisierung. Meine Routine sieht so aus:
Code:
function TMain.WLAN_Connect(ConLast : boolean) : HRESULT;
var
  ConPrms : Tndu_WLAN_CONNECTION_PARAMETERS;
  Name    : WideString;
begin
  if NOT Assigned(FpIFDATA) then exit;
  if NOT Assigned(FpNWDATA) then exit;
  if NOT FIsClient then exit;
  if ConLast then
    Name := WideString(FpIFDATA.actProfile)
  else
    Name := WideString(FpNWDATA.actProfile);
  ConPrms.wlanConnectionMode := wlan_connection_mode_profile;
  ConPrms.strProfile        := PWChar(Name);
  ConPrms.pDot11Ssid        := NIL;
  // Windows XP: pDesiredBssidList member must be NULL.
  ConPrms.pDesiredBssidList := NIL;
  ConPrms.dot11BssType      := dot11_BSS_type_any;
  // Windows XP: dwFlags must be set to 0
  ConPrms.dwFlags           := 0;
  result := WlanConnect(FhClient,
                        @FGuid,
                        @ConPrms,
                        nil);
  if result <> ERROR_SUCCESS then
    Memo.Lines.Add('CONNECT - FAILED: ' + IntToStr(result) + ' - ' + GetErrString(result))
  else
    Memo.Lines.Add('CONNECT - OK ... wait for notify !`');
end;
FhClient und FhClient sind globale var. Dito FpIFDATA, worin Daten aus dem aktuell connecteten Interface/Adapter gehalten werden.
Die Connection Params sind für XP-kompatiblen ausgelegt (mode_profile).

Der Parameter "ConLast" besagt hier, das ich entweder die letzte Verbindung des Adapters oder eine neu gewählte nehme. Hie wird nur ein String für den Profilnamen (der gültig sein muss !) passend zugewiesen.
Funzt nun tadellos.

Später mehr.

TERWI 29. Jan 2017 14:32

AW: Wlan connect
 
Ein Profil-XML auslesen wollte auch erst nicht klappen.
Hier war das Problem, das der Param für den zurückzugebenden String
A) grundsätzlich ein WideString
B) und dann nochmals konvertiert als PWChar (wie bei div. Aufrufen aus der WLAN-API !)
übergeben werden muss. Also so in etwa:
Code:
function TMain.WLAN_GetProfileInfo() : HRESULT;
var
  Name   : WideString;
  pXML   : pwidechar;
  Flags  : DWORD;
  GA     : DWORD;
begin
  if NOT Assigned(FpIFDATA) then exit;
  if NOT Assigned(FpNWDATA) then exit;
  if NOT FIsClient then exit;
  Name  := WideString(FpNWDATA.actProfile);
  pXML  := NIL;
  Flags := 0;
  GA    := 0;
  // -------------------------------------------------------------
  // ATTENTION: var to pstrProfileXml MUST be @pXML - NOT pXML !!!
  // -------------------------------------------------------------
  result := WlanGetProfile(FhClient,     // hClientHandle [in]
                           @FGuid,       // pInterfaceGuid [in]
                           PWChar(Name),
                           NIL,          // pReserved [in]
                           @pXML,        // pstrProfileXml [out]
                           @Flags,       // pdwFlags [in, out, optional]
                           @GA);         // pdwGrantedAccess [out, optional]
  if result <> ERROR_SUCCESS then
    Memo.Lines.Add('GETPROFILEINFO - FAILED: ' + IntToStr(result) + ' - ' + GetErrString(result))
  else
  begin
    Memo.Lines.Add('GETPROFILEINFO - XML: ' + pXML);
  end;
  if Assigned(pXML) then WlanFreeMemory(pXML);
end;
Auch hier wieder:
FhClient und FhClient sind globale var. Dito FpIFDATA (Interface) & FpNWDATA( Network), worin Daten aus dem aktuell connecteten Interface/Adapter, bzw. ausgewähltem (verfügbarem) Netzwerk gehalten werden.
Die Flags und GA sind für XP-kompatiblen ausgelegt.

TERWI 29. Jan 2017 15:03

AW: Wlan connect
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nun zum WLANNotify-ing:
Da haben sich vor gut 10 Jahren schon div. Leute in diesem Projekt den Kopf zerbrochen und mit Event's rumgedaddelt. Hat's irgendwann dann doch geklappt ?

Nach eingehendem Studium div. MSDN-Seiten zu dem Thema las ich sinngemäß:
".... WlanRegisterNotification funzt so lange, wie der übergebene Handle gültig ist ...."

Aha, also: Handle öffnen, WlanRegisterNotification aufrufen und dann entsprechend andere Funktionen hinterher ... und am Ende der selbstgemachten Routine gleich wieder den Handle (ordnungsgemäß !) freigeben.
Da wundert's nicht, wenn nie ein (zeitlich später folgendes) Ereignis NIEMALS und der Notify-Routine auftaucht. Warten auf Godot ....

Lösung: Einfach beim Programmstart global nur einen THandle (! - hier FcHandle) holen und im gesamten Programm verwenden. Funzt tadellos hier.
Code:
function TMain.GetWlanHandle(var Handle : THandle) : boolean;
var
  res    : HRESULT;
  Version : DWORD;
begin
  result := false;
  Handle := 0;
  res := WlanOpenHandle(2, nil, @Version, @Handle); // "2" for version also XP - autom. negotiation
  if res <> ERROR_SUCCESS then
  begin
    Memo.Lines.Add('GetWlanHandle - FAILED: ' + IntToStr(res) + ' - ' + GetErrString(res));
    exit;       // ... no handle ? no function ...
  end;
  Memo.Lines.Add('GetWlanHandle - negotiate Version: ' + IntToStr(Version));
  result:= true;
end;
Übergeben und gesetzt wird eine globale var FhClient.

Die Registrierug ist auch recht unspektakulär:
Code:
// -----------------------------------------------------------------------------
function TMain.Wlan_RegisterNotification(Mode : boolean) : HRESULT;
var
  Notify  : DWORD;
  pProc   : pointer;
begin
  if NOT FIsClient then exit; // for safety !
  if Mode then
  begin
    Notify := NDU_WLAN_NOTIFICATION_SOURCE_ALL; //_ACM
    pProc := @WLanNotifyProc;
  end
  else
  begin
    Notify := NDU_WLAN_NOTIFICATION_SOURCE_NONE;
    pProc := NIL;
  end;
  // check negotiatedVersion if needed
  result := WlanRegisterNotification(FhClient, // hClientHandle [in]
                                     NDU_WLAN_NOTIFICATION_SOURCE_ACM, // dwNotifSource [in]
                                     //NDU_WLAN_NOTIFICATION_SOURCE_ALL,
                                     true, // bIgnoreDuplicate [in], ignored in XP
                                     pProc, // funcCallback [in, optional]
                                     nil, // pCallbackContext [in, optional], always NIL
                                     nil, // pReserved [in], always NIL
                                     @FScanCompleteEvent //pdwPrevNotifSource [out, optional]
                                    );
  if result <> ERROR_SUCCESS then
  begin
    Memo.Lines.Add('RegisterNotification - FAILED: ' + IntToStr(result));
  end
  else
    Memo.Lines.Add('RegisterNotification - OK !');
end;
Initialisiert wird das so:
Code:
procedure TMain.FormCreate(Sender: TObject);
var
  res       : HRESULT;
  prevSource : pointer;  // Register
begin
  // SetUp Common
  Memo.Clear;
  FIF_List    := TList.Create; // remind Interfaces
  FIF_selected := -1;           // nothing selected
  FNW_List    := TList.Create; // remind Networks
  FNW_selected := -1;           // nothing selected
  FIsClient   := GetWlanHandle(FhClient);;
  if FIsClient then
    Wlan_RegisterNotification(true);
  ....
end;

procedure TMain.FormDestroy(Sender: TObject);
begin
  if FIsClient then
    Wlan_RegisterNotification(false);
  .....
end;
Und die Notify-Routine geht etwa so:
Code:
procedure WLanNotifyProc(pNotifyData : Pndu_WLAN_NOTIFICATION_DATA;
                          pContext : pointer); stdcall;
var
  s : string;
begin
  if pNotifyData^.NotificationSource = NDU_WLAN_NOTIFICATION_SOURCE_ACM then
  begin
    case Tndu_WLAN_NOTIFICATION_ACM(pNotifyData.NotificationCode) of
      ....
      wlan_notification_acm_scan_complete : s := 'scan complete';
      wlan_notification_acm_scan_fail : s := 'scan fail';
      wlan_notification_acm_connection_start : s := 'connection start';
      wlan_notification_acm_connection_complete : s := 'connection complete';
      wlan_notification_acm_connection_attempt_fail : s := 'connection attempt';
      ....
      wlan_notification_acm_disconnecting : s := 'disconnecting';
      wlan_notification_acm_disconnected : s := 'disconnected';
      ....
    end;
    Main.Memo.Lines.Add('NOTIFY: ' + IntToStr(pNotifyData^.NotificationCode) + ' - ' + s);
  end;
  if Assigned(pNotifyData) then WlanFreeMemory(pNotifyData);
end;

TERWI 31. Jan 2017 15:46

AW: Wlan connect
 
Donnerwetter: Schon 1058 Hits in ein paar Tagen !
Scheint ja wohl reges interresse da zu sein .... aber keine Kommentare, Fragen, weitere Hinweise oder gar ein kleines Danke/Lob :!:

Finde ich sehr erstaunlich - insbesondere weil ich bei meinen umfangreichen Recherchen in den letzten Tagen feststellen musste, dass es hier mit Info (insbesondere in Sachen Delphi) nicht grade reichlich beschert ist.
Ein paar "Basis-Libs" (in C, Delphi i.d.R. mit den gleichen Fehlern) gibt es und logo auch ein paar fertige VCLs - die kosten aber alle (nicht grade wenig) Knete.
Haben Delphianer nix mit WLAN am Hut ? :gruebel:

Also weiter mit Selbermachen hier :coder:
Bin aktuell dabei, das ganze "WLAN-Gerümpel" in eine Klasse zu stopfen und ein wenig hilfreiche Funktionen drumherum zu wrappen.
Elementare Dinge funzen schon prima :dancer: - es sind noch (unendlich viele ?) weitere, nützliche FUNCs to do.

Falls auch jemand anderes mal gelegentlichen (oder dringenden) Bedarf an so einer Klasse hat ... einfach mal hier posten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr.
Seite 2 von 4     12 34      

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