AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wlan connect

Ein Thema von stefan684 · begonnen am 20. Jan 2017 · letzter Beitrag vom 22. Mär 2017
Antwort Antwort
Seite 2 von 4     12 34   
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Wlan connect

  Alt 24. Jan 2017, 13:00
Danke dir für die "Anteilnahme" , 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.

Geändert von TERWI (24. Jan 2017 um 13:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#12

AW: Wlan connect

  Alt 24. Jan 2017, 13:03
Und wenn du im Windows für die ESP das Autoconnect deaktivierst, dann sollten die doch nicht mehr Autoconnected werden?

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Wlan connect

  Alt 24. Jan 2017, 13:37
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 ...)

Geändert von TERWI (24. Jan 2017 um 13:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Wlan connect

  Alt 25. Jan 2017, 18:26
Vorab-Info:
.... 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.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Wlan connect

  Alt 26. Jan 2017, 17:28
.... Geduld bitte - gestaltet sich aufwendiger als gedacht.
Langsam aber sicher "formt" sich aber was.
Ich will ja was halbwegs "schick brauchbares" abliefern ....
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Wlan connect

  Alt 28. Jan 2017, 12:30

GELÖST - ALLES FUNZT ... auch CONNECT.
... will nur noch "mal eben schnell" NOTIFY einbauen, dann gibbet heute noch nen DEMO-File.


EDIT:
.... auch das Notify scheint mich ärgern zu wollen.
Deshalb hier est mal ne EXE vorab zum testen.
Hier erfolgreich unter XP.
Mal schauen ob alle geneigten Interressenten meine Logig verstehen
Angehängte Dateien
Dateityp: rar WIFI_ADMIN_003.rar (201,4 KB, 72x aufgerufen)

Geändert von TERWI (28. Jan 2017 um 19:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Wlan connect

  Alt 29. Jan 2017, 13:36
.... 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.

Geändert von TERWI (29. Jan 2017 um 14:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Wlan connect

  Alt 29. Jan 2017, 14:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Wlan connect

  Alt 29. Jan 2017, 15:03
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;
Angehängte Dateien
Dateityp: rar WIFI_ADMIN.004.rar (198,2 KB, 66x aufgerufen)

Geändert von TERWI (29. Jan 2017 um 15:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Wlan connect

  Alt 31. Jan 2017, 15:46
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 ?

Also weiter mit Selbermachen hier
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 - 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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 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