Ir al contenido


Foto

Jugando con las conexiones Wifi


  • Por favor identifícate para responder
12 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 septiembre 2015 - 10:56

He estado jugando un poco con las interfaces y conexiones wifi y el resultado es una pequeña aplicación que muestra las redes wifi disponibles y nos conecta a una si tenemos configurada su autentificación.
 
La base del ejercicio es la API  Native Wifi Functions. En delphi 7 habrá que definir unas cuantas estructuras tomadas de la documentación de M$ y adaptadas para simplificar las cosas, no se si en las últimas versiones de delphi están incluidas estas definiciones.
 
El programita hace una lista de las redes disponibles escaneando los adaptadores wifi presentes en el PC, luego, conociendo el nombre de la Wifi a conectarnos, nos conecta. He incluido una desconexión rápida de todos los adaptadores.
 
El corazón del código es este:

delphi
  1. type
  2. TWifiData = record
  3. InterfaceInfo: String;
  4. Profile: String;
  5. SSID: String;
  6. Signal: integer;
  7. Auth: String;
  8. Conected: BOOL;
  9. end;
  10.  
  11.  
  12. function WifiScan(var List: array of TWifiData): integer;
  13. const
  14. AuthStr: array [1..9]of String = ('Open','Shared Key','WPA','WPA-PSK','WPA NONE','RSNA','RSNA-PSK','IHV Start','IHV End');
  15. var
  16. hClient: THandle;
  17. dwVersion: DWORD;
  18. pInterfaceInfoList: PWLAN_INTERFACE_INFO_LIST;
  19. pInterfaceGuid: PGUID;
  20. pNetworkList: PWLAN_AVAILABLE_NETWORK_LIST;
  21. i, j: integer;
  22. begin
  23. Result:= 0;
  24. if ERROR_SUCCESS = WlanOpenHandle(1, nil, @dwVersion, @hClient) then
  25. begin
  26. if ERROR_SUCCESS = WlanEnumInterfaces(hClient, nil, @pInterfaceInfoList) then
  27. begin
  28. for i := 0 to pInterfaceInfoList^.dwNumberOfItems - 1 do
  29. begin
  30. pInterfaceGuid:= @pInterfaceInfoList^.InterfaceInfo[pInterfaceInfoList^.dwIndex].InterfaceGuid;
  31. if ERROR_SUCCESS = WlanGetAvailableNetworkList(hClient, pInterfaceGuid, 1, nil, pNetworkList) then
  32. begin
  33. for j := 0 to pNetworkList^.dwNumberOfItems - 1 do
  34. begin
  35. Result:= pNetworkList^.dwNumberOfItems;
  36. with List[j] do
  37. begin
  38. InterfaceInfo:= pInterfaceInfoList^.InterfaceInfo[0].strInterfaceDescription;
  39. Profile:= WideCharToString(pNetworkList^.Network[j].strProfileName);
  40. SSID:= PChar(@pNetworkList^.Network[j].dot11Ssid.ucSSID);
  41. Signal:= pNetworkList^.Network[j].wlanSignalQuality;
  42. Auth:= AuthStr[pNetworkList^.Network[j].dot11DefaultAuthAlgorithm];
  43. Conected:= (pNetworkList^.Network[j].dwFlags and WLAN_AVAILABLE_NETWORK_CONNECTED) <> 0;
  44. end;
  45. end;
  46. WlanFreeMemory(pNetworkList);
  47. end;
  48. end;
  49. WlanFreeMemory(pInterfaceInfoList);
  50. end;
  51. WlanCloseHandle(hClient, nil);
  52. end;
  53. end;
  54.  
  55. function WifiConect(SSID: WideString): BOOL;
  56. var
  57. hClient: THandle;
  58. dwVersion: DWORD;
  59. pInterfaceInfoList: PWLAN_INTERFACE_INFO_LIST;
  60. pInterfaceGuid: PGUID;
  61. i: integer;
  62. pWLCP: PWLAN_CONNECTION_PARAMETERS;
  63. begin
  64. Result:= false;
  65. if ERROR_SUCCESS = WlanOpenHandle(1, nil, @dwVersion, @hClient) then
  66. begin
  67. if ERROR_SUCCESS = WlanEnumInterfaces(hClient, nil, @pInterfaceInfoList) then
  68. begin
  69. for i:= 0 to pInterfaceInfoList^.dwNumberOfItems - 1 do
  70. begin
  71. pInterfaceGuid:= @pInterfaceInfoList^.InterfaceInfo[pInterfaceInfoList^.dwIndex].InterfaceGuid;
  72. pWLCP:= WlanAllocateMemory(sizeof(TWLAN_CONNECTION_PARAMETERS));
  73. pWLCP.strProfile:= PWCHAR(SSID);
  74. pWLCP.wlanConnectionMode:= 0;
  75. pWLCP.pDot11Ssid:= nil; //pDot11_DDSI;
  76. pWLCP.pDesiredBssidList:= nil;
  77. pWLCP.dot11BssType:= 1;
  78. pWLCP.dwFlags:= 0;//$F;
  79. Result:= (ERROR_SUCCESS = WlanConnect(hClient, pInterfaceGuid, pWLCP, nil));
  80. WlanFreeMemory(pWLCP);
  81. end;
  82. WlanFreeMemory(pInterfaceInfoList);
  83. end;
  84. WlanCloseHandle(hClient, nil);
  85. end;
  86. end;
  87.  
  88. function WifiDisConect: BOOL;
  89. var
  90. hClient: THandle;
  91. dwVersion: DWORD;
  92. pInterfaceInfoList: PWLAN_INTERFACE_INFO_LIST;
  93. pInterfaceGuid: PGUID;
  94. i: integer;
  95. begin
  96. Result:= false;
  97. if ERROR_SUCCESS = WlanOpenHandle(1, nil, @dwVersion, @hClient) then
  98. begin
  99. if ERROR_SUCCESS = WlanEnumInterfaces(hClient, nil, @pInterfaceInfoList) then
  100. begin
  101. for i:= 0 to pInterfaceInfoList^.dwNumberOfItems - 1 do
  102. begin
  103. pInterfaceGuid:= @pInterfaceInfoList^.InterfaceInfo[pInterfaceInfoList^.dwIndex].InterfaceGuid;
  104. WlanDisconnect(hClient, pInterfaceGuid, nil);
  105. end;
  106. WlanFreeMemory(pInterfaceInfoList);
  107. end;
  108. WlanCloseHandle(hClient, nil);
  109. end;
  110. end;


Subo el código.


Saludos.


PD/ Existe una actualización aquí.

Archivos adjuntos


  • 6

#2 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 06 septiembre 2015 - 06:40

Me sorprende ...

La verdad que hace mucho tiempo se me ocurría explorar ciertas áreas de la programación. Ahora estoy "enfrascado" en trabajo y no investigo nada.

Muchas gracias amigo Escafandra.

 

Saludos


  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 07 septiembre 2015 - 07:32

Gracias maestro, como siempre excelente. 


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 septiembre 2015 - 11:09

Excelente!!  :shocked:


  • 0

#5 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 08 septiembre 2015 - 11:47

Gracias por ser una fuente inagotable de aportes

Enviado desde mi D5803 mediante Tapatalk
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 09 septiembre 2015 - 12:22

Como plus valdría la pena que se validará la seguridad de la red. :D


  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 septiembre 2015 - 12:36

Como plus valdría la pena que se validará la seguridad de la red. :D

 

Si, y algunas otras cosas como registrar notificaciones. Cuando disponga de tiempo le doy un empujoncito. 27.gif

 

Saludos.


  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 14 septiembre 2015 - 12:04

Prometí ampliar este tema, en esta ocasión añado varias funcionalidades nuevas:

1- Notificaciones de lo que sucede con la WIFI con apoyo de función callback: API WlanRegisterNotification

2- Información del cifrado de clave y de red.

3- Posibilidad de conectarse a una red Wifi no añadida en el PC identificándonos con su SSID y Clave.

4- Posibilidad de conectarse a una red abierta.

5. Extracción de la clave de una SSID específica.

6- Extracción de todas las claves de la lista de redes wifi memorizada en el PC.

7- Funciones extra,

8- Notificaciones en el SysTray.

9- Aumento definiciones de la API Native Wifi Functions en una unit por separado.

 

Como el código es largo, lo incluyo en un nuevo adjunto.

 

 

Saludos.

Archivos adjuntos


  • 6

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 14 septiembre 2015 - 06:16

Descargado, muchas gracias Escafandra, muy buen trabajo. :ap:


  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 septiembre 2015 - 11:17

:dlaug:


  • 0

#11 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 24 septiembre 2016 - 10:34

Buenas con todos, en especial y felicitando al amigo Escafandra por compartir un buen aporte a la comunidad, agradeciendole también por la ayuda recibida en el post:  :)

http://delphiaccess....jadas-en-el-pc/

 

Ahora he tratado de pasar este proyecto para lazarus, les comento que me ha ido bien :), aunque unos codes me indicaba error al compilar estos los pude solucionar siguiendo las mismos consejos que me dío el maestro Escafranda en el post mencionado, paso a compartirles el proyecto para lazarus.

 

http://www.mediafire...Escafranda).zip

(disculpen por usar mediafire es que por este medio no me deja)

 

Por favor les pido que me corrijan si algo estoy haciendo mal.

 

Quisiera agradecer a Escafranda quien es el autor del código por siempre estar dispuesto a brindarnos grandes aportes.

también aprovecho la oportunidad para pedirle una consulta, el software funciona genial pero porque mi red wifi lo detecta dos veces como lo adjunto en la imagen dentro del proyecto que he subido a mediafie.

 

Esperando sus consejos me despido. :)

 

 


  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 03 octubre 2016 - 08:10

No sé si aprovechar el hilo o abrir otro, pero.., amigo escafandra, habrá alguna API para el inicio y detención de un HostedNetwork?, no encuentro información al respecto.

 

Saludos.


  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 octubre 2016 - 10:47

Wireless Hosted Network Sample

No he jugado con eso pero no creo que sea muy complejo.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.