Delphi-PRAXiS

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)

stefan684 20. Jan 2017 06:37

Wlan connect
 
Hallo,

ich würde gerne per Delphi Verbindungen zu Wlan-Netze herstellen.

Im Netz habe ich einen Wlan-Scanner gefunden:

Delphi-Quellcode:
procedure TFORM1.Scan();
const
WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES =$00000001;
var
  hClient             : THandle;
  dwVersion           : DWORD;
  ResultInt           : DWORD;
  pInterface          : Pndu_WLAN_INTERFACE_INFO_LIST;
  i                   : Integer;
  j                   : Integer;
  pAvailableNetworkList: Pndu_WLAN_AVAILABLE_NETWORK_LIST;
  pInterfaceGuid      : PGUID;
  SDummy              : string;
  l:tlistItem;
begin
  ResultInt:=WlanOpenHandle(1, nil, @dwVersion, @hClient);
  if ResultInt<> ERROR_SUCCESS then
  begin
     WriteLn('Error Open CLient'+IntToStr(ResultInt));
     Exit;
  end;

  ResultInt:=WlanEnumInterfaces(hClient, nil, @pInterface);
  if ResultInt<> ERROR_SUCCESS then
  begin
     WriteLn('Error Enum Interfaces '+IntToStr(ResultInt));
     exit;
  end;

  for i := 0 to pInterface^.dwNumberOfItems - 1 do
  begin
   COMBOBOX1.Items.Add('Interface      ' + pInterface^.InterfaceInfo[i].strInterfaceDescription);
   edit1.Text:=('GUID           ' + GUIDToString(pInterface^.InterfaceInfo[i].InterfaceGuid));

   pInterfaceGuid:= @pInterface^.InterfaceInfo[pInterface^.dwIndex].InterfaceGuid;

      ResultInt:=WlanGetAvailableNetworkList(hClient,pInterfaceGuid,WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,nil,pAvailableNetworkList);
      if ResultInt<> ERROR_SUCCESS then
      begin
         WriteLn('Error WlanGetAvailableNetworkList '+IntToStr(ResultInt));
         Exit;
      end;

        for j := 0 to pAvailableNetworkList^.dwNumberOfItems - 1 do
        Begin
        l:=listview1.Items.Add;

           SDummy:=PAnsiChar(@pAvailableNetworkList^.Network[j].dot11Ssid.ucSSID);
           l.Caption:=(SDummy);
           l.SubItems.Add(Format('%d ',[pAvailableNetworkList^.Network[j].wlanSignalQuality])+'%');
           //SDummy := GetEnumName(TypeInfo(Tndu_DOT11_AUTH_ALGORITHM),integer(pAvailableNetworkList^.Network[j].dot11DefaultAuthAlgorithm)) ;
           SDummy:=DOT11_AUTH_ALGORITHM_To_String(pAvailableNetworkList^.Network[j].dot11DefaultAuthAlgorithm);
           l.SubItems.Add(SDummy);
           SDummy:=DOT11_CIPHER_ALGORITHM_To_String(pAvailableNetworkList^.Network[j].dot11DefaultCipherAlgorithm);
           l.SubItems.Add(SDummy);

        End;
  end;

  WlanCloseHandle(hClient, nil);

end;
Das funktioniert soweit, es werden die vorhandenen Netzwerk angezeigt.

Meine Frage ist, wie kann ich jetzt zu einem ausgewählten Netz eine Verbindung herstellen?

In einer Unit befindet sich die Funktion WlanConnect.

Delphi-Quellcode:
function WlanConnect(hClientHandle: Handle; const pInterfaceGuid: PGUID;
     const pConnectionParameters: Pndu_WLAN_CONNECTION_PARAMETERS;
    pReserved: PVOID): DWORD; stdcall;
Weiß jemand, wie ich die Parameter in diese Funktion einsetzen muss?

Danke.

Gruß

Stefan

SProske 20. Jan 2017 07:50

AW: Wlan connect
 
Falls dir das weiterhilft - die Doku zu WlanConnect: https://msdn.microsoft.com/de-de/en-...(v=vs.85).aspx

stefan684 20. Jan 2017 08:05

AW: Wlan connect
 
Hallo,

vielen Dank erstmal.

Gibt es keine Beispiel als Delphi-Code, wie man welche Parameter übergibt?

TiGü 20. Jan 2017 09:37

AW: Wlan connect
 
Zitat:

Zitat von stefan684 (Beitrag 1359331)
Gibt es keine Beispiel als Delphi-Code, wie man welche Parameter übergibt?

Hast du denn den gefundenen Code in TFORM1.Scan() verstanden?

Alle relevanten Informationen liegen doch vor?!?
Du musst nur noch als dritten Parameter pConnectionParameters: Pndu_WLAN_CONNECTION_PARAMETERS erzeugen, ausfüllen und übergeben.

stefan684 20. Jan 2017 09:44

AW: Wlan connect
 
Hallo,

den Code habe ich nicht so richtig verstanden?!?
Mit Zeigern usw. kenne ich mich nicht so gut aus.

Wie bau ich den dritten Parameter zusammen?

Ein Beispiel-Code wäre super.

Danke.

Stefan

stefan684 20. Jan 2017 10:12

AW: Wlan connect
 
So hab ich es bis jetzt gemacht:

Delphi-Quellcode:
var PA : Pndu_WLAN_CONNECTION_PARAMETERS;
  ...
  Pa.strProfile := 'Test';
  Pa.wlanConnectionMode := Wlan_Connection_Mode_profile;
  Pa.pDot11Ssid := @pAvailableNetworkList^.Network[0].dot11Ssid;
  Pa.pDesiredBssidList := @pAvailableNetworkList^.Network[0].dot11BssType;
  Pa.dwFlags := Null;

  ResultInt:= WlanConnect(hClient, @pInterface^.InterfaceInfo[0].InterfaceGuid, PA , nil);
Funktioniert leider nicht.

TiGü 20. Jan 2017 13:50

AW: Wlan connect
 
Zitat:

Zitat von stefan684 (Beitrag 1359364)
So hab ich es bis jetzt gemacht:

Delphi-Quellcode:
var PA : Pndu_WLAN_CONNECTION_PARAMETERS;
  ...
  Pa.strProfile := 'Test';
  Pa.wlanConnectionMode := Wlan_Connection_Mode_profile;
  Pa.pDot11Ssid := @pAvailableNetworkList^.Network[0].dot11Ssid;
  Pa.pDesiredBssidList := @pAvailableNetworkList^.Network[0].dot11BssType;
  Pa.dwFlags := Null;

  ResultInt:= WlanConnect(hClient, @pInterface^.InterfaceInfo[0].InterfaceGuid, PA , nil);
Funktioniert leider nicht.

Ich weiß warum, aber du musst lernen die konkrete Fehlerbeschreibung zu liefern. Meldungen aus der IDE können per Strg+C kopiert werden.
Was genau funktioniert nicht?

himitsu 20. Jan 2017 16:34

AW: Wlan connect
 
Er hat vergessen den Speicher für den Pointer zu reservieren.
Aber das hat ihm auch der Compiler gesagt, denn diese Variable ist nicht initialisiert.

PS: Alternativ kann man auch statt des Pointer-Typs + New direkt den Record-Typen verwenden.

TERWI 24. Jan 2017 12:11

AW: Wlan connect
 
Ich klinke mich hier mal ein - weil gleiches Prob u. a.

Gleichen Code von hier ?! hab ich auch gefunden. Funzt betreff Listing gut. (XP !)
Der aus diesem Haus/Projekt irgendwie gar nicht - EXE hängt beim Scan, API fehlt (aber wohl die gleiche !?)

Problemstellung:
Ich habe hier u.a. ein(ige) ESP8266-WiFi-Module, welche als Acecess-Point laufen und nebst Daten-Fütterung auch wieder Daten von sich geben. Tempörär nach Bedarf ....
D.h., ich möchte
- erkennen, ob jeweile Module "online" sind (wiederholter Scan bei Bedarf - klappt soweit)
- mich mit dem Schläppi (vom eingeloggten WLAN) nach Wahl damit verbinden (TO DO !)
- Daten "duch die Luft" austauschen (das klappt auch wie die Wutz) und
- wenn fettich wieder automatisch mit dem vorherige "Stamm-WLAN" verbinden (TO DO !)
... damit das umständliche aus- und Einloggen (für unbedarfte User meiner APP) entfällt
(und nicht nur für mich automatisch schneller geht)

Test betreff "Connect" (& logo DisConnect) steht gleich noch aus ....
Dazu jedoch noch die Frage vorher:

- Wie erkenne ich, mit welchem WiFi ich bereits (aktuell automatisch zum Home-Router) verbunden bin ?
(und wie ich mir das merken kann/muss für spateren re-connect)
- Ich hab am Schläppi noch einen Fritz!-WLAN-Stick für alternative Verbindung
(ist schneller als der eingebaute Ahteros)
-> Kann ich die parallel nutzen ohne uzuschalten ?

Mega Dank für hilfreiche Tipps/Links.

himitsu 24. Jan 2017 12:21

AW: Wlan connect
 
Viel kann ich nich helfen, aber ja, man kann sich über mehrere WLAN-Module gleichzeitig zu mehreren WLAN-Routern/Hotspots verbinden.
Also Windows kann das probemlos.

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.

himitsu 31. Jan 2017 16:12

AW: Wlan connect
 
Geplant wäre ein Projektchen, aber das steht in meiner Liste recht weit am hinteren Ende (für die nächsten 1-2 Jahre).

TERWI 31. Jan 2017 16:51

AW: Wlan connect
 
Na fein ! .... wenigstens mal eine Antwort.
Dann könntest du (nicht nur du :roll: ) ja z.b. u.a. (schon) mal ein paar Gedanken äussern, was "man" sich so an Funktionaliät einer entsprechenden Klasse vorstell .... :cyclops:
.... bastel ich alles gerne mit rein ... wenn es [mir] keine Umstände macht. 8-)

niao 5. Feb 2017 14:12

AW: Wlan connect
 
Ich habe das ganze unter Delhi XE4 und Windows 10 getestet. Geht so nicht :(.
Hat einer einen Tipp wie das unter Delphi XE4 und Windows 10 geht?

Vorab vielen Dank!

Luckie 6. Feb 2017 02:54

AW: Wlan connect
 
Tja. "Geht so nicht", ist eine etwas magere Fehlerbeschreibung, findest du nicht auch? Oder was soll TERWI damit jetzt anfangen? :roll:

hoika 6. Feb 2017 03:38

AW: Wlan connect
 
Hallo,
mich würde unter XE4 mal die Anzahl der Compiler-Warnungen interessieren (Stichwort Unicode).

Ach, und ich lese hier nur so mit, habe aber mit WLAN-Programmierung auf Arbeit und zu Hause keine Projekte in Planung.

DualCoreCpu 7. Feb 2017 11:55

AW: Wlan connect
 
Zitat:

Zitat von TERWI (Beitrag 1360258)
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 ?

[/CODE]

Die Datei Wifi_ADMIN004.zip (nicht rar, wie hier behauptet), lässt sich nach Download nicht öffnen, die enthaltene Datei somit nicht extrahieren. Bitte sorge für Abhilfe. Bin mit Handy im Netz bereits mit gedrosselter Geschwindigkeit, da das erlaubte Datenvolumen hinten und vorne nicht ausreicht, nur um nur eine simple Webseite anzuzeigen.

Tonic1024 8. Feb 2017 15:10

AW: Wlan connect
 
Zitat:

Zitat von DualCoreCpu (Beitrag 1361014)
Bitte sorge für Abhilfe.

Hast es mal mit WinRAR versucht? Das hilft...

...zumindest bei mir


Gruß,

Toni

Tonic1024 8. Feb 2017 15:17

AW: Wlan connect
 
Zitat:

Zitat von TERWI (Beitrag 1360484)
Na fein ! .... wenigstens mal eine Antwort.
Dann könntest du (nicht nur du :roll: ) ja z.b. u.a. (schon) mal ein paar Gedanken äussern, was "man" sich so an Funktionaliät einer entsprechenden Klasse vorstell ....

Zu deinem Tool. Es startet, aber ich hab hier grad kein WLAN-Device zum Testen und kein altes Notebook mit so altem OS. Code hast du nicht dabei, kann ich nichts zu sagen. Mir aus deinen Schnipseln eine eigene Applikation zu bauen fehlt mir die Zeit. Dein fehlendes W ist genau richtig für neuere Delphis.

TERWI 10. Feb 2017 11:02

AW: Wlan connect
 
Oooh, es tut sich was !

Ich hatte kurz mal einen Break eingelegt und bin nun wieder etwas weiter.
O.g. Tool funzt(e) nur, wenn bereits ein entsprechendes Profil auf dem Rechner zum Verbinden mit dem jeweiligen Netz vorhanden war.
Aber man will/muss ja auch mal was neues connecten ...

Ich bite zu bedenken, das hier alles auf XP getestet wurde !
Hier gibts es einen Satz Funktionen, der z.T in der Funktionalität etwas eingeschränkt ist.
Wenn ich Frollein MSDN richtig verstanden habe, müssen alle diese Funktionen aber auch unter Vista/Win7 ++ laufen.

1.) Prob war immer noch:
"Temporary Profiles" funzen NICHT unter XP !!!
Man muss sich dazu selbst ein XML-Profil basteln und mit WLanSetProfile speichern, danach läuft ein WLANConnect mit dem neuen Profil einwandfrei.
Ich hatte das zunächst aber nur mit einen ESP8266-Modul als offener AP ohne Passwort (!) geprüft.

2. Prob:
.... nun mit PW, bzw. (wieder-) Einloggen in mein Heim-Netz: Permanente Meckereien, das etwas mit dem Profil nicht stimmen soll. MSDN kreuz und quer gelesen.
Angeblich soll WinnDoof ja in einem Fensterchen (wie beim Standard-Login) nach dm PW fragen - tut's aber nicht. Und wie in div Beispielen angebenen, erhalte ich immer Fehler im Reason-Code zurück.

Die Lösung:
Will man sich in ein verschlüssteltes neu einloggen, braucht man logo den KEY - den muss man (unter XP ?) vor dem connect-Versuch selbst abfragen und in's Profil einbauen.
Dieser gehört in der Section <sharedkey> in die Zeile <keyMaterial> - im Klatext, case sensitiv !
Die Zeile <protected> muss 'false' lauten.

SEHR WICHTIG ist die Zeile <keyType>. Mier muss beim Erzeugen ZWINGEND "passPhrase" stehen - NICHT "network" !
WinnDoof ändert das XML-Profil automatisch nach erfolgreichem Login um und setzt <keyType> auf network und ersetzt <keyType> durch einen gekrypteten 64-Zeichen-HEX-String.

..... und dann fluppt das auch mit verschlüsselten Netzen.
Wenn ich mit dem Code-Entrümpeln fertig bin, gibts auch wieder einige Code-Schnipsel.

PS:
Ich habe zwischenzeitlich die ganze WLAN-API durchforstet, hier und da ein paar "Käfer" rausgeworfen und auf den letzten Stand (lt. MSDN) aktualisiert. Mit Ausnahme der noch ausstehenden Funktionen für "Hosted Networks" ist so weit alles drin.
Dazu hab ich noch einen Wrapper als Klasse drumherumgebastelt, der (erst mal) die wichtigsten Funktionen kapselt und das Handling (sehr) vereinfacht.

Ein bischen Geduld noch, dann kommt was nutzliches.

PS-2: Das gepackte File ist definitiv ein "RAR", kein ZIP. Bitte WinRar zum entpacken benutzen.

DualCoreCpu 10. Feb 2017 20:20

AW: Wlan connect
 
Und wie kann ich mich dann letztendlich mit dem verschlüsselten wlan verbinden, ich kenne doch schließlich den Netzwerkschlüssel nicht. Lässt der sich denn wirklich soooo mir nix dir nix auslesen? Immerhin wird der ja abgefragt, wenn ich irgendeinen fremden Router (Accesspoint) auswähle und mich mit dem Internet verbinden will.

Das soll funktionieren????

TERWI 11. Feb 2017 07:13

AW: Wlan connect
 
:-D Scherzbold. Wie ich oben schrieb:
Zitat:

Will man sich in ein verschlüssteltes neu einloggen, braucht man logo den KEY...
Wozu wäre eine Verschlüssenung sonst gut ? Wenn das so einfach wäre, dann ....

Bedenke: Das eigentliche Passwort (hier die s. g. Pass-Phrase) wird nur einmal (quasi im Klartext) an das Netzwerk gesendet und dann von dort kommend als "KeyMaterial" im eigenen Rechner (bei TKIP oder AES Verschlüsselung) als 64-Zeichen-HEX-String gespeichert

Eine Möglichkeit gäbe es, wenn ....
man einen Rechner hat, der bereits eine Verbindung zu entsprechendem Netz aufgebaut hat(te).
Dort könnte man das entsprechende Profil auslesen, sichern und auf dem eigenen Rechner wieder mit WLANSetProfil speichern.
Vorausgesetzt man hat Zugriff auf eben den Rechner. 8-)

Allerdings sind viele (öffentliche) AP's (z.B. hier bei mir von Vodafone oder Telekom) u. a. in Hotels sind i.d.R. als "OPEN" ohne Key deklariert. Da kann man sich problemlos einloggen - allerdings erfolgt dort Systemintern eine User- und PW-Abfrage, so bald man in's WWW möchte.

t.roller 11. Feb 2017 09:32

AW: Wlan connect
 
Für das Auslesen der WLAN-Keys auf einem Computer gibt es
WirelessKeyView.exe.
http://www.nirsoft.net/utils/wireless_key.html

TERWI 11. Feb 2017 10:10

AW: Wlan connect
 
:-D .... das kann mein kleines Tool mittlerweile auch.
Wie ich zuvor schrieb: Profiles auslesen, kopieren, speichern, anwenden.
Genauso stehts auch beim Tool von NirSoft.

TERWI 20. Feb 2017 13:08

AW: Wlan connect
 
.... wieder ein paar Tage rum.
Funktioniert so weit so gut mit XP, aber bei manchen Dingen (AutoScan, Interface- & Netzwerk-Update, u.a) is das doch eher ne Krücke, im Pull-Modus per Timer zu werkeln. Und eine wichtige Dinge kann XP gar nicht ...
War doch sehr neugierig, was unter WIN7 noch so alles geht und hab mir (endlich :roll:) ne Win7 Kiste gebastelt, auf der nun auch nicht mehr Delphi 7 sondern 2007 (nicht RAD) dudelt.

Erstaunlicherweise lief der Code ohne zu meckern durch - nur ein paar Bugs in der Callback-Routine.
Nun heisst es also: Noch einige Funktionen auf- und einblasen, damit's noch praktikabler wird.

Ich werde euch zeitnah das kleine Projekt vorstellen.

TERWI 21. Feb 2017 09:32

AW: Wlan connect
 
Doch ein Prob mit WIN7 aufgetaucht:

In diesem Schleppi werkelt ein Atheros WLan-Modul.
Zusätzlich habe ich noch einen FritzWlanStick N angesteckt.

Beide Adapter werden unter XP/Win7 korrekt erkannt, frage ich jedoch die verfügbaren Netzwerke mit WlanGetAvailableNetworkList je Adapter abab, klappt das bei XP einwandfrei - nur unter WIN7 bekomme ich beim Fritz den Fehler 50 / NOT SUPPORTED (Fehler ist im MSDN nicht gelistet !). Netzwerkliste ist leer, bzw. Zeiger darauf NIL.
Es ist auch egal, ob ich als Flags 0, 1, 2 oder 3 übergebe. Richtige GUID ist es auch.

???
Ganz offenichtlich scheint der Stick jedoch zu funktionieren. Schalte ich den Atheros ab (was mein Proggie 1A erkennt), habe ich laut System eine Verbindung mit 300 MBit - die auch funktioniert.
Also keine Prob betreff Treiber oder Installation.

Hat jemand eine Idee, was da inne Uhr ist ?
Kann man das irgendwie anders auslesen ?
Irgendwelche Tricks erforderlich ?

stefan684 14. Mär 2017 09:28

AW: Wlan connect
 
Hallo Terwi,

da hast Du ja viel Arbeit reingesteckt, Respekt!

Könntest Du dein komplette Quelltext hier mal reinstellen?

Ich komm aktuell da auch nicht richtig weiter, wie hast Du die globalen Variablen definiert?
(FpIFDATA, FpNWDATA)

Danke.

Stefan

TERWI 17. Mär 2017 13:56

AW: Wlan connect
 
Räume grade noch mal den Code auf, damit es übersichtlicher / verständlicher wird und schreibe noch entsprechende Memos rein.
Wenn fertig (hoffentlich zeitig in ein paar Tagen), gibt's einen neuen Thread "WLAN-API" - hier wirds zum Thema etwas unübersichtlich.
... mit aktualisierter Demo für Vista++.
Die XP-Kompatibilität habe ich rausgeworfen, weil Funktionalität (insbesondere bei der Notification vom OS) unter XP doch extrem mager ist und alles nur verkompliziert.

Bitte ein wenig Geduld.

Zur Info zum Neugierig machen vorab:
Die Demo und API bestehen aus folgenden Units:
- WLAN_ADMIN (die Demo selbst, recht kurz & klein - aber sehr effektiv)
- WLAN_WRAP (eine Klasse als Wrapper um die API mit Hilfsfunktionen)
- WLAN_API (das Interface zur DLL mit nativen Funktionen)
- WLAN_Strings (div. "Klartexte" zur div. Funktionen, Ergebnissen, Enumerationen, usw.)
- WLAN_Password (eine interne Form zur Passwort-Abfrage)
- WLAN_Profile (eine interne Form zur Bearbeitung von Verbindungs-Profilen)
- WLAN_Info_IF (eine interne Form mit Infos zum Adapter/Interface)
- WLAN_Info_NW (eine interne Form mit Infos zur aktuellen Verbindung am aktuellen Interface)

TERWI 21. Mär 2017 14:11

AW: Wlan connect
 
Hier geht's weiter:
http://www.delphipraxis.net/192124-wlan-api-fuer-delphi-update-demo.html#WLAN-API (für DELPHI) - Update & DEMOpost1364954

t.roller 21. Mär 2017 14:14

AW: Wlan connect
 
Falscher Link.

Richtig:
http://www.delphipraxis.net/192124-w...ml#post1364954

TERWI 22. Mär 2017 13:40

AW: Wlan connect
 
THX :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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