![]() |
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. |
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. |
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 ...) |
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. |
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 .... |
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 |
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 ![]() Es ist ein Fehler in der LIB "nduWlanAPI.pas" ! Falsche Parameterdefinition .... so isse's richtig und funzt:
Code:
.... ein simples "W" fehlte.
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; B) .... und die Frage der richtigen Initialisierung. Meine Routine sieht so aus:
Code:
FhClient und FhClient sind globale var. Dito FpIFDATA, worin Daten aus dem aktuell connecteten Interface/Adapter gehalten werden.
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; 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. |
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:
Auch hier wieder:
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; 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. |
AW: Wlan connect
Liste der Anhänge anzeigen (Anzahl: 1)
Nun zum WLANNotify-ing:
Da haben sich vor gut 10 Jahren schon div. Leute ![]() 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:
Übergeben und gesetzt wird eine globale var FhClient.
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; Die Registrierug ist auch recht unspektakulär:
Code:
Initialisiert wird das so:
// -----------------------------------------------------------------------------
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;
Code:
Und die Notify-Routine geht etwa so:
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;
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; |
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:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz