[C++] Cherche lib + howto pour utiliser le pilote wifi (linux)

Cherche lib + howto pour utiliser le pilote wifi (linux) [C++] - C++ - Programmation

Marsh Posté le 12-08-2009 à 15:47:48    

Bonjour à tous et toutes, j'aurais besoin de votre aide, je cherche une lib qui me permettrais en C++ de lister les point d'accés existant (leur qualitée de signal mais au minimum le nom et si c'est protégé ou pas) et de pouvoir m'y authentifier.
 
J'ai bien vu la lib wireless.h ou iwlib (libiw) mais je ne trouve pas d'exemple clair facile à comprendre (c'est en général de gros pavé sans vrais commentaires en C avec des structures de partout.  :cry: )
 
Avez vous un tuto miracle ou une lib "courante" facile d'utilisation? (parce que bon tout ces struct en C ce n'est pas l'idéal tout de même).
Le tout doit être disponible sous linux. L'idéal serait en fait un exemple clair ou tutorial pour la lib iwlib car je suis sûr qu'elle est dispo sur la plateforme ou le programme va tourner, mais si vous en avez une plus facile (ou en relation avec QT).
 
Merci d'avance
 
 
EDIt: Bien sûr je pourrais faire un iwlist vers un fichier puis parcourir le résultat mais ce n'est pas vraiment l'idéal. :/ Il n'y a pas vraiment moyen de gérer les erreurs.


Message édité par burn2 le 12-08-2009 à 16:02:47

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 12-08-2009 à 15:47:48   

Reply

Marsh Posté le 12-08-2009 à 18:55:23    

Au pire, fait un popen en C et recupére le stdout de iwlist et traite les chaines de caractères retournées.

Reply

Marsh Posté le 12-08-2009 à 19:20:21    

Ouep c'est ce que je pensais aussi, mais pour le coup l'association ça serait avec un iwconfig, ça passe mais c'est pas l'idéal :/
Doit bien y avoir des libs pour faire ça. Déjà iwlib le fait, mais j'avoue ne point comprendre son utilisation. :/


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 13-08-2009 à 08:22:58    

et y a pas de doc ?
paye tes lib open sources quoi :sarcastic:

Reply

Marsh Posté le 13-08-2009 à 09:58:01    

Ben je ne trouve pas de doc non. :/ D'habitude y en a plein (contrairement à ce que tu dis sur l'openSource :o)
Mais là personnellement c'est assez flou. :/
ET les struct pommés dans un .h c'est pas vraiment parlant pour moi. :/
 
Il faut que QT nous sorte la lib magique :o


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 13-08-2009 à 15:39:46    

ça a l'air jouable quand même:

 
Code :
  1. /* --------------------- SCANNING SUBROUTINES --------------------- */
  2. int
  3. iw_process_scan(int   skfd,     /* Socket to the kernel */
  4.   char *   ifname, /* Device name */
  5.   int   we_version,
  6.   wireless_scan_head * context);
  7. int
  8. iw_scan(int   skfd, /* Socket to the kernel */
  9.  char *   ifname,  /* Device name */
  10.  int   we_version,
  11.  wireless_scan_head * context);
 

qui retourne une liste chainée vers les differents points d'accés trouvés dans (wireless_scan_head * context):

 
Code :
  1. /* Structure for storing an entry of a wireless scan.
  2. * This is only a subset of all possible information, the flexible
  3. * structure of scan results make it impossible to capture all
  4. * information in such a static structure. */
  5. typedef struct wireless_scan
  6. {
  7.   /* Linked list */
  8.   struct wireless_scan * next;
  9.   /* Cell identifiaction */
  10.   int  has_ap_addr;
  11.   sockaddr ap_addr;  /* Access point address */
  12.   /* Other information */
  13.   struct wireless_config b; /* Basic information */
  14.   iwstats stats;   /* Signal strength */
  15.   int  has_stats;
  16.   iwparam maxbitrate;  /* Max bit rate in bps */
  17.   int  has_maxbitrate;
  18. } wireless_scan;
  19. /*
  20. * Context used for non-blocking scan.
  21. */
  22. typedef struct wireless_scan_head
  23. {
  24.   wireless_scan * result;  /* Result of the scan */
  25.   int   retry;  /* Retry level */
  26. } wireless_scan_head;


Message édité par sligor le 13-08-2009 à 15:40:15
Reply

Marsh Posté le 13-08-2009 à 15:48:34    

en fait la doc des fonctions est dans le source pas dans l'en-tête :D
 

Code :
  1. /*********************** SCANNING SUBROUTINES ***********************/
  2. /*
  3. * The Wireless Extension API 14 and greater define Wireless Scanning.
  4. * The normal API is complex, this is an easy API that return
  5. * a subset of the scanning results. This should be enough for most
  6. * applications that want to use Scanning.
  7. * If you want to have use the full/normal API, check iwlist.c...
  8. *
  9. * Precaution when using scanning :
  10. * The scanning operation disable normal network traffic, and therefore
  11. * you should not abuse of scan.
  12. * The scan need to check the presence of network on other frequencies.
  13. * While you are checking those other frequencies, you can *NOT* be on
  14. * your normal frequency to listen to normal traffic in the cell.
  15. * You need typically in the order of one second to actively probe all
  16. * 802.11b channels (do the maths). Some cards may do that in background,
  17. * to reply to scan commands faster, but they still have to do it.
  18. * Leaving the cell for such an extended period of time is pretty bad.
  19. * Any kind of streaming/low latency traffic will be impacted, and the
  20. * user will perceive it (easily checked with telnet). People trying to
  21. * send traffic to you will retry packets and waste bandwidth. Some
  22. * applications may be sensitive to those packet losses in weird ways,
  23. * and tracing those weird behavior back to scanning may take time.
  24. * If you are in ad-hoc mode, if two nodes scan approx at the same
  25. * time, they won't see each other, which may create associations issues.
  26. * For those reasons, the scanning activity should be limited to
  27. * what's really needed, and continuous scanning is a bad idea.
  28. * Jean II
  29. */
  30. /*------------------------------------------------------------------*/
  31. /*
  32. * Process/store one element from the scanning results in wireless_scan
  33. */
  34. static inline struct wireless_scan *
  35. iw_process_scanning_token(struct iw_event *  event,
  36.     struct wireless_scan * wscan)
  37. /*------------------------------------------------------------------*/
  38. /*
  39. * Initiate the scan procedure, and process results.
  40. * This is a non-blocking procedure and it will return each time
  41. * it would block, returning the amount of time the caller should wait
  42. * before calling again.
  43. * Return -1 for error, delay to wait for (in ms), or 0 for success.
  44. * Error code is in errno
  45. */
  46. int
  47. iw_process_scan(int   skfd,
  48.  char *   ifname,
  49.  int   we_version,
  50.  wireless_scan_head * context)
  51. /*------------------------------------------------------------------*/
  52. /*
  53. * Perform a wireless scan on the specified interface.
  54. * This is a blocking procedure and it will when the scan is completed
  55. * or when an error occur.
  56. *
  57. * The scan results are given in a linked list of wireless_scan objects.
  58. * The caller *must* free the result himself (by walking the list).
  59. * If there is an error, -1 is returned and the error code is available
  60. * in errno.
  61. *
  62. * The parameter we_version can be extracted from the range structure
  63. * (range.we_version_compiled - see iw_get_range_info()), or using
  64. * iw_get_kernel_we_version(). For performance reason, you should
  65. * cache this parameter when possible rather than querying it every time.
  66. *
  67. * Return -1 for error and 0 for success.
  68. */
  69. int
  70. iw_scan(int   skfd,
  71. char *   ifname,
  72. int   we_version,
  73. wireless_scan_head * context)

Reply

Marsh Posté le 13-08-2009 à 16:20:20    

Oui j'avais regardé tout ça, mais si je prends  
int
iw_process_scan(int   skfd,     /* Socket to the kernel */
  char *   ifname, /* Device name */
  int   we_version,
  wireless_scan_head * context);
 
tu comprends comment t'en servir toi? Tu sais comment lui fournir le socket vers le kernel? Tu comprends comment et sous quelle structure sera fourni le résultat?  
 
Rien de tel que des exemples simples d'utilisation pour comprendre comment le faire, et ça je n'en ai trouvé aucun. :/
 
EDIT; je n'avais pas vu que tu parlais d'une liste chainée, ok c'est déjà une info et là je comprends mieux, mais avec un exemple ça serait bien plus facile à comprendre et à voir.
 
J'essaierais ce soir voir si j'arrive au moins à récupérer les infos.


Message édité par burn2 le 13-08-2009 à 16:25:04

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 13-08-2009 à 16:29:58    

en faisant une recherche dans le code source on retrouve souvent

Code :
  1. if((skfd = iw_sockets_open()) < 0)


;)

Reply

Marsh Posté le 13-08-2009 à 16:40:45    

on utilisant le fabuleux moteur de recherche qu'est google j'ai trouvé ça:
 
http://svn.pardus.org.tr/projeler/tasmanet/device.cpp

Code :
  1. QStringList Device::scanWifiNetwork( const char *dev )
  2. {
  3.     wireless_scan_head wsh;
  4.     wireless_scan *ws;
  5.     int skfd = sockets_open();
  6.     int ret = iw_scan( skfd, ( char* )dev, WIRELESS_EXT, &wsh );
  7.     if ( ( ret == -1 ) && ( errno == ENODATA ) ) {
  8.         // wait for device for one more second :).
  9.         sleep( 1 );
  10.         ret = iw_scan ( skfd, ( char* )dev, WIRELESS_EXT, &wsh );
  11.         if ( ret == -1 ) {
  12.             close ( skfd );
  13.             return QStringList();
  14.         }
  15.     }
  16.     // iterate over results
  17.     QStringList networks;
  18.     ws = wsh.result;
  19.     while( ws ) {
  20.         networks.append( ws->b.essid );
  21.         ws = ws->next;
  22.     }
  23.     free_scan_results(wsh.result);
  24.     return networks;
  25. }


 
voilà tu l'as ton exemple :)

Reply

Marsh Posté le 13-08-2009 à 16:40:45   

Reply

Marsh Posté le 13-08-2009 à 16:53:58    

Ah ben ça alors!  Merci beaucoup!
Je dois être une quiche en langage google car je n'ai pas du tout trouvé d'exemple!
T'as tapé quoi précisément?
 
Et tu aurais un exemple d'association à un point d'accés?

Message cité 1 fois
Message édité par burn2 le 13-08-2009 à 16:55:44

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 13-08-2009 à 16:55:59    

burn2 a écrit :


T'as tapé quoi précisément?


iw_scan  :D

Reply

Marsh Posté le 13-08-2009 à 17:06:52    

Ok... Moi j'avais tappé le nom de la bibliothèque et forcément ça n'avait rien donné.
 
Merci beaucoup de ton aide. :)
 
/note personnelle penser à chercher en tapant le nom d'une fonction de lib et pas le nom de la lib directement...


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 13-08-2009 à 19:14:59    

Bon forcément ça se passe mal.
Je rajoute les libs qu'il a inclu je fais juste le test avec quelques fonctions et j'ai droit à:

Citation :


build/dialogimpl.o: In function `scanWifiNetwork(char const*)':
dialogimpl.cpp:(.text+0x12a): undefined reference to `iw_scan'
dialogimpl.cpp:(.text+0x28e): undefined reference to `iw_scan

...
Je ne sais pas trop quoi penser.
 
(bien sûr j'inclue bien iwlib.h et toutes les lib qu'il a mis)


Message édité par burn2 le 13-08-2009 à 19:20:18

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 13-08-2009 à 19:17:55    

t'aurais pas oublié un -liw au link ? Et si ta lib n'est pas dans /usr/lib, il faut préciser le path avec -L

Reply

Marsh Posté le 13-08-2009 à 19:23:42    

J'utilise le compilateur par défaut, et la lib est bien dans mon /usr/include. donc logiquement il doit la trouver sans que j'ai besoin de linker non?
en mettant mon #include tout simplement?


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 13-08-2009 à 19:30:39    

BOn j'ai rien dit c'était bien ça! Pff faut que je me dérouille là. Merci.
 
EDIT: j'allais dire que ça ne marchait pas avant de me rendre compte qu'il faut que je sois en root pour que ça passe, j'arrive déjà à lister. :)


Message édité par burn2 le 13-08-2009 à 19:37:49

---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 14-08-2009 à 16:33:59    

Ca serait pas mieux de s'appuyer sur network manager ?

Reply

Marsh Posté le 14-08-2009 à 17:43:00    

Non. :o
Pour la simple est bonne raison qu'il n'est pas forcément installé partout et qu'en l'occurence sur la machine ou ça tournera, il n'y sera pas. :o
(freeruner...)


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 16-08-2009 à 09:20:58    

Par contre j'ai bien peur qu'avec cette lib on ne puisse pas faire du chiffrage wpa, je ne vois pas vraiment de connexion autre que juste s'associer à un point d'accès. (équivalent du iwconfig essid monpoint).


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 16-08-2009 à 10:08:44    

Je galère aussi pour arriver à récupérer le type de chiffrage. :/ Je me demande s'il n'y a pas mieux comme solution. :/


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le 16-08-2009 à 12:00:13    

Bon finalement je fais avec un popen + parcours ligne à ligne et recherche de string dans le résultat et c'est bon je récupère ce que je veux. ça ne sera pas parfait mais bon pour l'instant je ne vois guerre d'autres solutions.


---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed