Après la technologie Ethernet étudiée au chapitre R3‑III , la technologie Wi‑Fi W (acronyme de wireless fidelity – étonnamment inspiré de l'acronyme Hi‑Fi du domaine audio‑phonique) apporte une excellente alternative aux liaisons filaires pour implémenter les couches liaison et physique dans les réseaux locaux à pile de protocoles TCP/IP. Basée sur les ondes électromagnétiques, elle offre des débits inférieurs et une moindre fiabilité que la technologie Ethernet, mais procure l'avantage décisif de la mobilité des hôtes.
Depuis le développement massif des terminaux mobiles (ordinateurs portables, smartphones, etc.) amorcé au début des années 2000, la technologie Wi‑Fi est maintenant très répandue, tant dans les réseaux publics (gares, centres commerciaux, cafés et restaurants…) que privés, qu'ils soient domestiques ou professionnels (et même industriels). On parle de réseaux locaux sans‑fil ou WLAN – pour wireless local area network.
Précisons toutefois que :
La technologie Wi‑Fi présente des points communs avec Ethernet. En premier lieu, elle est spécifiée par une famille de normes IEEE 802. Plus précisément, il s'agit des normes 802.11 dites normes Wi‑Fi qui, comme les normes 802.3 d'Ethernet (cf. chap. R3‑IV ), couvrent :
- la sous‑couche MAC (medium access control) où elle reprend la notion d'adresse physique dite MAC ;
- la couche physique, mais bien évidemment, avec des solutions de codage et modulation adaptées au medium de transmission qu'est le champ électromagnétique ambiant.
En revanche, du fait qu'elle repose sur un médium partagé, la technologie Wi‑Fi soulève des problématiques spécifiques, notamment en termes de sécurité et fiabilité. Et ces problématiques sont essentiellement gérées au niveau logiciel.
Objectif du chapitre : découverte de la technologie Wi‑Fi.
Technologie Wi‑Fi – Généralités
Historique et évolution
La technologie dite Wi‑Fi W est apparue à la fin des années 1990 avec les deux grandes étapes initiales suivantes .
- En 1997, l'IEEE (cf. chap. R1‑I ) publie la première version de la norme 802.11. Elle sera remplacée dès 1999 par les déclinaisons 802.11a, 802.11b, qui restent depuis, en constante évolution – ce qu'on appelle les normes Wi‑Fi x (cf. infra ).
- En 1999 se forme l'association commerciale WECA (pour Wireless Ethernet Compatibility Alliance) avec 6 entreprises pionnières (dont 3com, Cisco, Lucent et Nokia). Elle est maintenant dénommée la Wi‑Fi Alliance W.
Aujourd'hui, la Wi‑Fi Alliance W compte plusieurs centaines de membres. Elle joue un rôle déterminant :
- dans la certification des équipements opérant la technologie Wi‑Fi ;
- dans l'évolution des normes Wi‑Fi en collaboration avec l'IEEE.
Panorama des normes Wi‑Fi récentes
Depuis 1997, les normes Wi‑Fi ou IEEE 802.11 W ont beaucoup évolué pour accompagner les spécifications de cette technologie de liaison en termes de performances en débit. En particulier, on peut retenir :
- la norme 802.11g dite Wi‑Fi 3, publiée en 2003, qui autorise des débits allant théoriquement jusqu'à 54 Mbit/s ; elle est restée longtemps le standard de base ;
- la norme 802.11n dite Wi‑Fi 4, publiée en 2009, qui ajoute une technique de multiplexage (MIMO ou Multiple‑Input Multiple‑Output W) et autorise des débits allant théoriquement jusqu'à 600 Mbit/s ;
- la norme 802.11ac dite Wi‑Fi 5, publiée en 2013, qui autorise des débits allant théoriquement jusqu'à 3,4 Gbit/s ; c'est actuellement le standard adopté par la quasi‑totalité des équipements usuels (ordinateurs portables, smartphones) ;
- la norme 802.11ax dite Wi‑Fi 6, publiée en 2021, qui autorise des débits allant théoriquement jusqu'à 10,5 Gbit/s ; elle est amenée à devenir le nouveau standard dans les années à venir.
Notions de station et de point d'accès
Les normes 802.11 distinguent deux notions fondamentales indépendamment de toute technologie : la station et le point d'accès.
- On parle de station W – abrégée STA – pour désigner toute machine capable de communiquer dans un réseau Wi‑Fi.
- On parle de point d'accès W – abrégé WAP pour wireless access point, ou plus simplement AP – pour désigner un équipement qui crée un sous‑réseau à liaisons Wi‑Fi au sein d'un réseau local.
En complément de la notion d'access point, il existe également celle de software enabled access point W – abrégé softAP. Ce terme désigne une machine qui n'est pas conçue pour cela mais qui remplit le rôle d'AP grâce à un composant logiciel.
C'est typiquement le cas d'un smartphone qui partage une connexion à l'Internet (4G) avec d'autres appareils – smartphones, PC portables, etc. – en créant un réseau Wi‑Fi autour de lui.
Dans la vie courante, on parle de hotspot W pour désigner un lieu, public ou privé, où un réseau Wi‑Fi avec un accès à l'Internet est mis à disposition d'usagers – typiquement, dans une gare, un aéroport, un café, etc.
La porté des ondes Wi‑Fi étant limitée, un hotstop mis en œuvre sur une surface étendue nécessite l'installation de plusieurs points d'accès.
Modes de liaison
Pour mettre en place un WLAN, la technologie Wi‑Fi autorise différents modes de liaison W entre équipements munis d'interfaces Wi‑Fi compatibles entre elles.
En particulier, on peut mettre en œuvre les deux principaux modes suivants : le mode infrastructure et le mode ad‑hoc.
- Le mode infrastructure est de loin le plus employé et le plus connu des modes de liaison. Il nécessite un équipement constituant au moins un point d'accès. En général, le WLAN ainsi constitué est relié au reste du réseau (LAN), on dit qu'il offre aux machines qui s'y connectent un basic service set – abrégé BSS W – auquel est associé un identifiant unique BSSID (à ne pas confondre avec la notion de SSID exposée infra – ici, il s'agit de l'adresse MAC de l'interface réseau du point d'accès).
- Le mode ad hoc opère sans points d'accès, à la manière dont on peut relier deux machines par un simple câble Ethernet, sauf qu'en technologie Wi‑Fi, le nombre de machine n'est pas limité et on obtient une topologie entièrement maillée. On peut aussi parler de réseau peer‑to‑peer.
Par ailleurs, la technologie Wi‑Fi apporte des solutions pour l'extension d'un réseau.
- Deux points d'accès peuvent être associés en mode pont W (bridge) pour réunir deux LAN, quelle que soit la technologie de liaison de l'un et l'autre.
- Pour étendre un WLAN, il existe une solution plus économique que l'ajout d'un point d'accès supplémentaire : on peut aussi employer un répéteur (range extender). Un tel équipement s'associe à l'AP pour jouer un rôle d'amplificateur des signaux qu'il reçoit de part et d'autre.
Identifiant SSID
Avec la technologie Wi‑Fi, du fait que l'on utilise un médium de transmission commun et localement ubiquitaire (il est partout), on est confronté à la problématique essentielle du contrôle d'accès au réseau. En particulier, il n'est pas rare que plusieurs WLAN coexistent dans un espace donné. Il faut donc être en mesure d'identifier chaque réseau pour que les connexions et échanges de données ne s'entremêlent pas.
On appelle SSID W – qui signifie service set identifier, c'est‑à‑dire identifiant d'ensemble de services – une chaîne de caractères qui identifie :
- soit un WLAN en mode infrastructure ;
- soit une liaison entre deux équipements dans un WLAN en mode ad hoc.
La norme 802.11 impose au SSID une taille maximale de 32 octets, sans spécification d'encodage.
Le choix d'un SSID est effectué par l'administrateur réseau lorsqu'il paramètre les équipements (point d'accès ou machine paire). En principe, on peut donc employer l'encodage UTF‑8. Néanmoins, dans la chaîne de caractère constituant un SSID, il est recommandé de se limiter aux caractères alphanumériques du jeu ASCII restreint.
En règle générale, un SSID est associé à une clef de sécurité – ou mot de passe. Cet aspect sera abordé plus loin, dans le cadre des aspects logiciels .
La notion de SSID (la chaîne de caractères déterminant le nom d'un WLAN) est à ne pas confondre avec celle de BSSID (l'adresse MAC de l'interface réseau d'un point d'accès – cf. supra ).
Technologie Wi‑Fi – Aspects matériels
Rappels sur les ondes électromagnétiques
Une onde électromagnétique W est une variation périodique du champ électromagnétique ambiant – cf. la représentation vectorielle académique ci‑contre avec le champ électrique représenté en rouge et le champ magnétique en bleu, synchronisés.
Se propageant de façon transversale W et à la vitesse de la lumière – notée c – dans le milieu considéré, une onde électromagnétique est caractérisée par :
- son amplitude – en général, on retient la valeur maximale E0 du champ électrique ;
- sa longueur d'onde notée λ, sa fréquence notée f et sa période notée T, qui vérifient les relations λ = c / f = c.T.
Application à la transmission de données
La figure ci‑dessous rappelle le spectre général W des ondes électromagnétiques avec leur désignation par gammes de longueurs d'onde.
Dans le contexte de la transmission de données par ondes électromagnétiques, pour le choix de la longueur d'onde, on est confronté à dilemme :
- plus la fréquence d'un onde est élevée – donc plus la longueur d'onde est courte – meilleur est le débit (fondamentalement, un débit est une fréquence) ;
- mais inversement, plus la longueur d'onde est courte, plus l'onde est énergétique – c'est‑à‑dire capable d'interactions avec les particules qu'elle rencontre – et donc, moindre est sa portée dans un milieu matériel.
La technologie Wi‑Fi opère dans le domaine des micro‑ondes W (qui sont très en dessous du spectre visible), en particulier dans la bande S W des UHF W dites « 2,4 GHz » et « 5 GHz ».
Ce choix permet d'obtenir des débits assez satisfaisants – de l'ordre du Gbit/s – mais n'offre aux signaux qu'une capacité de franchissement modérée, c'est‑à‑dire avec des difficultés pour les murs de forte épaisseur (dès 50 cm).
Plus précisément :
- La bande dite « 2,4 GHz » couvre les fréquences allant de 2,4000 à 2,4835 GHz ; elle procure une assez bonne perméabilité des obstacles, mais elle peut être sujette à des perturbations par des applications ou phénomènes « concurrentes » (radio‑amateurs, téléphones sans fils, fours à micro‑ondes…).
- La bande dite « 5 GHz » se compose en réalité de deux sous‑bandes allant respectivement de 5,150 à 5,350 GHz et de 5,470 à 5,850 GHz. Elle procure des débits plus élevés que la bande 2,4 GHz et subit moins de perturbations (peu d'autres applications l'utilisent) ; en revanche, elle offre une moins bonne perméabilité des obstacles.
Notion de canal Wi‑Fi
Pour optimiser les débits de transmissions, les deux bandes Wi‑Fi sont chacune divisées en une série de sous‑bandes appelées canaux Wi‑Fi W, avec ou sans chevauchement selon la bande.
Tout canal Wi‑Fi est défini par sa fréquence médiane et sa largeur – laquelle est exploitée pour la modulation des signaux. Pour simplifier l'identification, ils sont numérotés.
La division en canaux sans chevauchements permet :
- soit le multiplexage fréquentiel des signaux dans un réseau qui n'a pas de concurrence dans le champ magnétique ambiant ;
- soit la superposition de plusieurs réseaux dans le champ magnétique ambiant sans risques d'interférences entre les transmissions de ces réseaux.
La bande 2,4 GHz se divise en 14 canaux chevauchants de largeur 22 MHz chacun, avec une distance de 5 MHz entre les fréquences médianes respectives de deux canaux voisins. Ils sont numérotés de 1 à 14.
Parmi ces canaux, il est possible d'en sélectionner 3 sans chevauchement – par exemple, les canaux nº 1, 6 et 11.
La bande 5 GHz se divise en 22 canaux non chevauchants de largeur 20 MHz chacun, avec une distance de 20 MHz entre les fréquences médianes respectives de deux canaux voisins. Ils sont numérotés de 4 en 4 :
- de 32 à 68 (donc 32, 36, 40…) sur la sous‑bande de 5,150 à 5,350 GHz ;
- de 96 à 140 (donc 96, 100, 104…) sur la sous‑bande de 5,470 à 5,850 GHz.
Force d'un signal Wi‑Fi
La portée d'un émetteur Wi‑Fi n'est pas de limite nette. Son signal s'atténue à mesure qu'on s'en éloigne où que des obstacles se présentent. Pour caractériser cette portée, il est donc nécessaire de quantifier son niveau de puissance en réception et de fixer une limite acceptable en dessous de laquelle le lieu peut être considéré en dehors de la portée de l'émetteur.
C'est le rôle de la notion de RSSI W – pour received signal strength indication – exprimé en dBm W (décibel milliwatt), échelle logarithmique dont la valeur 0 exprime une puissance de référence de 1 mW.
Pour mémoire, sur l'échelle des décibels, une augmentation de +3 dB exprime un doublement de la puissance du signal.
Dans le cas des réseaux Wi‑Fi, les puissances mises en jeu sont les plus faibles possibles pour ne pas rendre les signaux nocifs (à forte puissance, les micro‑ondes sont utilisées pour cuire les aliments). Les valeurs s'échelonnent de −30 dBm (excellente réception) à −90 dBm (connexion quasi‑impossible).
Interface réseau Wi‑Fi
De façon générale, on appelle interface réseau Wi‑Fi tout composant qui, raccordé ou intégré à un équipement terminal, permet de participer à des communications conformément aux normes 802.11. Il comprend nécessairement une antenne et au moins un circuit intégré de type ASSP W (application‑specific standard product).
Un tel dispositif entre dans la catégorie des interfaces réseau – NIC ou network interface controller (cf. chap. R1-I ).
Comme pour les cartes Ethernet, il existe une grande variété d'interfaces Wi‑Fi.
- Parmi les dispositifs intégrés, on trouve les circuits spécifiques ou modulaires pour appareils communiquant miniatures (smartphones, web‑cam, répéteurs, cartes de prototypage, etc.).
- Parmi les dispositifs raccordés, on trouve notamment les dongles USB W, très polyvalents (compatibles avec tout type d'ordinateur disposant d'un port USB) et les cartes PCI W pour postes fixes. On a également les modules pour routeurs stationnaires (matériel Cisco, etc.).
Chez le constructeur Cisco, on emploie le sigle WIC W – WAN interface card – pour désigner un module d'interface de routeur en général (pas forcément Wi‑Fi) – cf. chap. R3‑II . C'est l'occasion de rappeler l'avertissement à ne pas confondre les sigles WAN et WLAN en introduction de ce chapitre.
Exemple. La désignation HWIC‑AP‑AG‑B du module en photo ci‑dessus à droite s'interprète ainsi :
- HWIC pour high‑speed WAN interface card, parce que c'est une interface réseau pour routeur (cf. chap. R3‑II ) ;
- AP pour access point, parce que cette interface confère la fonction de point d'accès au routeur dans laquelle elle est montée (il devient un routeur Wi‑Fi) ;
- AG-B parce que ce point d'accès est conforme aux normes 802.11a, 802.11b et 802.11g (802.11b/g en simple bande 2,4 GHz et 802.11a/b/g en double bande 2,4 GHz et 5 GHz).
Routeurs Wi‑Fi
Un routeur Wi‑Fi est un routeur qui dispose d'une interface Wi‑Fi conçue pour assurer la fonction de point d'accès dans une WLAN.
Mais ne perdons pas de vue qu'il s'agit avant tout d'un routeur, dont la principale fonction est d'assurer la passerelle avec un autre réseau (typiquement, l'Internet).
Parmi les routeurs Wi‑Fi, on trouve les catégories suivantes.
- On a les box de FAI (fournisseur d'accès à l'Internet), qui assurent quasiment toute la fonction de point d'accès, même si l'antenne Wi‑Fi n'est pas forcément apparente. Un tel équipement n'offre le plus souvent qu'un paramétrage très limité.
- Il existe aussi toute une gamme de routeurs « grand public » (comme le Netgear AC1900 en photo ci‑contre), sachant qu'un tel équipement peut :
- être raccordé à un modem auquel il confère alors la fonction de point d'accès principal ou supplémentaire ;
- intégré dans un LAN pour déployer un sous‑réseau de petite taille, sans‑fil ou même filaire grâce à un switch intégré.
- Ensuite, on trouve des petits routeurs professionnels (comme le Cisco RV340W « small business » en photo ci‑contre), qui peuvent adopter une enveloppe similaire à celle d'un routeur grand public mais qui, en plus des caractéristiques usuelles, embarquent des fonctionnalités avancées :
- pare‑feu avec la possibilité d'imposer des règles de filtrage complexes ;
- VPN (virtual private network) avec un autre routeur compatible ;
- VLAN (virtual local area network).
- On a enfin les solutions professionnelles pour les grands réseaux d'entreprise ou de collectivité, qui doivent pouvoir gérer un trafic important et disposer de fonction d'administration avancées. Dans cette catégorie, un routeur peut être constitué d'un routeur rack polyvalent auquel on ajoute un module Wi‑Fi dans un emplacement prévu à cet effet (cf. quelques exemples en photo ci‑contre).
Comme déjà mentionné au chap. R3‑III , un routeur Wi‑Fi comporte en général (cf. la face arrière du Cisco RV215W en photo ci‑dessous) :
- une multi‑port Ethernet étiqueté « LAN » ; il constitue un switch procurant quelques connexions filaires associée au WLAN que le routeur a pour fonction principale de mettre en œuvre ;
- un port Ethernet étiqueté « WAN » qui sert à raccorder le routeur dans un LAN, avec en principe un accès vers un WAN – l'Internet.
Points d'accès Wi‑Fi (équipement)
Un point d'accès matériel est un équipement qui permet d'ajouter un point d'accès Wi‑Fi (WAP) dans un réseau filaire ou Wi‑Fi déjà existant. Il n'assure pas de fonction de routage, autrement dit il ne permet pas de raccorder deux réseaux IP différents.
D'une certaine façon, on peut considérer qu'un point d'accès dans un réseau Wi‑Fi est l'équivalent d'un switch au sein d'un réseau filaire.
Moins cher qu'un routeur, un point d'accès peut constituer une solution satisfaisante pour étendre un WLAN avec une administration centralisée. C'est la solution privilégiée dans les grands bâtiments de bureau, les espaces publics connectés, les établissements scolaires, etc.
Comme pour les routeurs, il existe une grande variété de modèles adaptés en fonction des besoins domestiques ou professionnels. L'absence d'antenne apparente diminue un peu la portée mais présente une meilleure robustesse aux dégradations dans les environnements publics (cf. quelques exemples en photo ci‑dessous).
Répéteurs et ponts Wi‑Fi
Répéteurs Wi‑Fi
Rappelons (cf. supra ) qu'un répéteur Wi‑Fi n'est pas un point d'accès mais un équipement qui permet d'étendre la portée d'un WAP déjà installé.
En termes de mise en œuvre des protocoles réseau, un répéteur doit donc être considéré comme passif, il ne constitue pas un nœud du réseau (cf. chap. R1‑II ).
Matériellement, un tel équipement dispose simplement d'une alimentation électrique, d'une ou plusieurs antennes Wi‑Fi, d'une carte électronique d'amplification et de répétition des signaux qu'il reçoit des stations Wi‑Fi qu'il dessert (les machines qui se connectent à travers lui) et du WAP dont il étend la portée.
Les différents modèles de répéteurs Wi‑Fi vendus dans le commerce se distinguent principalement par leur portée et les normes de protection qu'ils respectent en vue de leur usage pour l'intérieur, l'extérieur, les locaux publics ou privés, etc. – cf. quelques exemples en photo ci‑dessous.
Les modèles d'intérieur qualifiés dans le commerce de répéteurs Wi‑Fi présentent diverses caractéristiques qui peuvent être sujettes à des confusions.
- La prise électrique en façade sert simplement de prolongement à la prise murale sur laquelle l'appareil est branché, afin de ne pas en monopoliser l'usage.
- Un éventuel port Ethernet peut être présent permettre à des clients de se raccorder localement au réseau qu'il étend par connexion filaire plutôt que Wi‑Fi. Mais ce n'est pas un port « WAN » comme sur un équipement de type point d'accès.
- Certains modèles sont en fait polyvalents et peuvent faire fonction de point d'accès, voire même de routeur Wi‑Fi (cf. le modèle d'intérieur en photo tout à droite dans le cadre de gauche ci‑dessus).
Ponts Wi‑Fi
Techniquement, un pont Wi‑Fi est un équipement qui agit comme un puissant répéteur. Il est essentiellement constitué d'une paire d'antennes à installer en vis‑à‑vis en extérieur pour créer une liaison sans‑fil pour déployer entre deux bâtiments (cf. le modèle en photo ci‑contre).
Technologie Wi‑Fi – Aspects logiciels
Comme cela a été souligné à plusieurs reprises dans ce chapitre, la technologie Wi‑Fi repose physiquement sur un médium partagé, le champ électromagnétique ambiant. Se posent donc des problématiques de :
- fiabilité – le fait, par exemple, qu'une transmission ne soit pas perturbée par une autre ;
- sécurité – le fait que l'accès au réseau puisse être contrôlé (et non pas accessible à tous) ou qu'un tiers ne puisse pas lire les échanges de donnée entre une station et un point d'accès
Tous ces aspects sont pris en charge au niveau logiciel.
Identification des interfaces réseau Wi‑Fi
On rappelle (cf. introduction) que la technologie Wi‑Fi est spécifiée par les normes 802.11 qui couvrent notamment la sous‑couche MAC.
Protocoles sécurisés de connexion
Dans un LAN filaire, il est incontournable d'avoir physiquement accès à une prise réseau pour pouvoir y raccorder une machine (sans considérer les éventuelles possibilités de connexion distante via une passerelle). Si le réseau est déployé dans des locaux privés, il est donc a priori inaccessible à toute machine externe aux locaux.
Au contraire, dans un WLAN, n'importe quelle machine située à l'extérieur des locaux mais dans la portée d'un WAP pourrait a priori se connecter au réseau, car les murs usuels ne sont pas totalement imperméables aux ondes Wi‑Fi (ce qui est d'ailleurs un atout de cette technologie). C'est pourquoi un contrôle d'accès est vivement recommandé.
En premier lieu, pour une station Wi‑Fi, l'accès à un WLAN n'est facile que si la diffusion de son SSID est mise en œuvre (cf. supra ). Si on choisit de ne pas diffuser l'identifiant, alors le WLAN devient « invisible » pour les tiers et seuls les stations ayant connaissance du SSID peuvent s'y connecter. Cela apporte une certaine protection contre les intrusions indésirables.
Toutefois, cette solution de contrôle d'accès n'est pas totalement efficace et donc, finalement, assez peu mise en œuvre, car il existe des outils d'analyse – notamment sous forme d'applications pour smartphone – qui permettent de détecter les réseaux Wi‑Fi et de récupérer leur SSID.
Remarques.
- De tels outils d'analyse ne sont pas facilement accessibles au grand public : en particulier, les applications pour smartphone ne sont pas distribuées sur les app‑stores et il faut que l'appareil soit rooté pour procéder à l'installation.
- La récupération par un tiers du SSID caché d'un WLAN peut‑être considérée comme un acte illégal de violation de sécurité.
Que le SSID soit diffusé ou non, l'accès à un WLAN engage la responsabilité du (des) administrateur(s) du réseau dans lequel le WLAN est intégré. C'est pourquoi il est fortement recommandé de limiter son accès par un protocole d'authentification avec un mot de passe.
Pour approfondir la problématique de la sécurisation des connexions à un WLAN, on pourra consulter la note technique de l'ANSSI qui y est consacrée .
Dans les WLAN ouverts au grand public (gares, aéroports, etc.), l'accès n'est pas sécurisé par un mot de passe mais par une procédure d'identification de l'utilisateur – typiquement, via une demande de adresse électronique – et de fortes limitations de droit mises en œuvre par un serveur proxy.
Connexion par protocole chiffré
Afin de satisfaire aux exigences de confidentialité, une connexion Wi‑Fi obéit toujours à un protocole avec chiffrement des données dès le début de la connexion.
Sinon, n'importe quelle communication entre un client et un WAP peut être interceptée par une machine tierce à l'aide d'un logiciel dédié (sniffeur Wi‑Fi).
Les protocoles de connexion chiffrée ont beaucoup évolué depuis les débuts de la technologie Wi‑Fi. Se sont succédés :
- le protocole WEP W – pour wired equivalent privacy – mis en place dès 1999, qui s'est révélé rapidement beaucoup trop faible ;
- la taille de la clef était insuffisante au regard des progrès en capacité de calcul des ordinateurs ;
- l'algorithme de chiffrement RC4 W (Rivest Cipher 4 – du nom de son inventeur) était vulnérable à cause du partage de clef ;
- le protocole WPA W – pour Wi‑Fi protected access apparu en 2003 – a été complété en 2004 par une version WPA2 ;
- WPA utilise l'algorithme de chiffrement TKIP W (temporal key integrity protocol) ;
- WPA2 utilise préférentiellement l'algorithme de chiffrement CCMP W (counter‑mode/CBC‑Mac protocol) ou AES W (advanced encryption standard).
Paramétrage d'une interface Wi‑Fi
Cas d'une carte Raspberry‑Pi
Il existe plusieurs manières de configurer l'interface Wi‑Fi d'une carte Raspberry Pi. Typiquement, on procéder :
- lors de la préparation de l'image du système, avec l'utilitaire de gravage Raspberry‑Pi Imager ;
- avec un utilitaire de configuration semi‑graphique comme
raspi-configou encorenmtui(déjà évoqué au chap. R1‑III ) pour les versions du système basées sur une distribution Debian 12 au moins ; - ou directement en éditant un fichier de configuration.
L'utilitaire de gravage Raspberry‑Pi Imager a déjà été présenté dans le sujet de TP R2‑2 . Pour mémoire, on accède aux paramètres avancés lors de la phase de personnalisation du système, en choisissant l'option Modifier réglages. Dans l'onglet Général, il suffit alors de cocher la case Configurer le Wi‑Fi et renseigner :
- le SSID (cf. supra ) ;
- le mot de passe, c'est‑à‑dire la clef de sécurité ;
- le « pays » Wi‑Fi parmi les options possibles données dans un menu déroulant.
L'utilitaire de configuration semi‑graphique raspi-config se lance dans un terminal de commandes en lignes – donc, y compris via une connexion ssh – en tapant tout simplement :
sudo raspi-config
Le terminal passe alors en mode semi‑graphique avec des menus déroulants qu'on peut notamment faire défiler avec les touches « flèches » du clavier ←↑↓→, sachant que dans un menu :
- la validation du choix d'item en surbrillance peut s'effectuer :
- soit directement en tapant ENTRÉE ↵ ;
- soit en appuyant sur → pour activer
<Select>puis sur ENTRÉE ↵ ; - la sortie s'effectue sur → autant de fois que nécessaire pour activer
<Finish>puis sur ENTRÉE ↵.
À partir du menu principal, il suffit de choisir 1 System Options puis S1 Wireless LAN. On est alors invité à saisir successivement le SSID et le mot de passe (passphrase) qui est masqué, sachant qu'on peut éventuellement procéder par copier‑coller depuis un éditeur de texte externe pour éviter toute erreur sur la saisie du mot de passe.
Remarque : la commande sudo nmtui met aussi en œuvre un outil semi‑graphique tellement intuitif qu'il ne nécessite pas d'explications pour être utilisé avec succès par un débutant. De plus, cet outil est plus polyvalent que raspi-config car il permet aussi de configurer la connexion par liaison Ethernet.
Protocole de communication à évitement de collisions
En technologie Wi‑Fi, pour toute transmission de données, la problématique de l'accès au médium se pose a priori dans les mêmes termes qu'en technologie Ethernet sur une topologie en bus (cf. chap. R3‑III ) : si deux stations émettent simultanément des signaux, leurs interférences risquent de faire échouer les transmissions de l'une et l'autre – et on parle alors de collision. Toute station souhaitant émettre doit donc préalablement s'assurer que le médium est disponible.
Toutefois, la technique dite CSMA/CD (carrier sense multiple access / collision detection) employée en technologie Ethernet n'est pas adaptée à la spécificité de la technologie Wi‑Fi. Rappelons que cette technique consiste, pour une machine devant transmettre des données sur le médium, à émettre un paquet tout en écoutant le médium pour vérifier s'il est victime d'une collision. Or la technologie Wi‑Fi n'est pas opérable en full‑duplex (une station ne pas employer son ou ses antennes pour simultanément émettre et recevoir des signaux).
Dans un réseau Wi‑Fi, l'accès au médium est géré par la technique dite CSMA/CA W – pour carrier sense multiple access / collision avoidance.
Cette technique consiste, pour toute machine devant transmettre des données sur le médium à d'abord se mettre en écoute du réseau pendant une durée appelée DIFS W (distributed inter frame space, de l'ordre de 30 à 50 µs), puis :
- en l'absence de signaux détectés, à transmettre les données voulues ;
- sinon, à attendre une durée aléatoire supplémentaire avant de pouvoir reprendre l'écoute.
Trames Wi‑Fi
Les trames Wi‑Fi adoptent une structure globale similaire à celles de la technologie Ethernet W. Mais des spécificités existent, notamment en fonction des techniques de modulation et de multiplexage adoptées.
Techniques de modulation et multiplexage
Les techniques FHSS W (frequency-hopping spread spectrum) et DSSS W (direct-sequence spread spectrum) ne sont presque plus utilisées en Wi‑Fi (elles étaient employées pour les normes 802.11a et 802.11b).
Depuis la norme 802.11g (2003), c'est la technique OFDM W (orthogonal frequency‑division multiplexing) qui est presque exclusivement utilisée en Wi‑Fi.
Protocole de routage dans les réseaux maillés
OLSR W (optimized link state routing protocol)
Mise en œuvre sur carte à microcontrôleur
On présente ici uniquement le cas des cartes à microcontrôleur ESP8266 qui ont été présentées aux chapitres C1‑III C et C2‑VIII . En effet, en raison de leur excellent rapport qualité/prix, ces cartes – ainsi que celle à microcontrôleur ESP32 – sont très utilisées dans le domaine des objets connectés. La mise en œuvre des communications en Wi‑Fi sont facilitées par l'emploi des modules de bibliothèque de fonctions spécialisées.
Les modules de bibliothèque ESP8266Wifi
Pour un microcontrôleur ESP8266, on dispose des modules de bibliothèque ESP8266Wifi (qui s'inspirent initialement de ceux de la bibliothèque Arduino WiFi Link ). Ces modules s'installent par défaut dans l'application Arduino IDE lors de l'importation des cartes ESP8266 (cf. chap. C1‑III C). Il s'agit de bibliothèques tierces dont la documentation « officielle », très succincte, est référencée sur un site web indépendant . Toutefois, il existe aussi une documentation alternative très détaillée comme celle‑ci .
Quant au code source du module de bibliothèque ESP8266WiFi (plus de 30 fichiers), il est disponible ici G.
La mise en œuvre des fonctionnalités Wi‑Fi sur une carte à microcontrôleur ESP8266 requiert la directive d'inclusion du fichier d'en‑tête principal :
#include <ESP8266WiFi.h>
sachant que ce fichier :
- comporte lui‑même 12 directives d'inclusion, en particulier celle du fichier d'en‑tête Arduino
IPAddress.h(cf. chap. R1‑III ) ; - déclare l'objet
WiFipar lequel on peut appeler les méthodes publiques du module de bibliothèque ; cette instance n'a donc pas besoin d'être déclarée dans le programme utilisateur (à l'instar de l'objetSerialpour la mise en œuvre de moniteur série – cf. chap. C3‑X C).
Le module offre de très nombreuses méthodes publiques associées à l'objet WiFi, qu'il ne serait pas raisonnable de détailler en intégralité dans ce cours. On ne va donc présenter que les plus usuelles. En tout premier lieu, on trouve dans le fichier d'en‑tête ESP8266WiFiGeneric.h G diverses méthodes génériques, la plus importante étant la suivante :
-
WiFi.modecode le choix du mode de fonctionnement de la carte programmée. - Elle prend pour seul argument une valeur de type énuméré
WiFiMode_tparmi les 4 constantes déclaréesWIFI_OFF,WIFI_STA(mode station),WIFI_AP(mode access point) etWIFI_AP_STA(mode mixte). - Elle retourne une valeur booléenne qui exprime la faisabilité du mode sur la carte.
-
WiFi.channel, sans argument, retourne le canal Wi‑Fi adopté.
Une bonne partie des autres méthodes sont spécifiques aux modes respectifs station et access point.
Mise en œuvre d'une carte ESP8266 en mode station
Pour la mise en œuvre d'une station et tout particulièrement sa connexion à un WLAN préexistant, on dispose des méthodes suivantes, toutes déclarées dans le fichier d'en‑tête ESP8266WiFiSTA.h G :
-
WiFi.configcode l'attribution d'une configuration IP statique choisie pour la carte programmée en mode station. - Elle admet de 3 à 5 arguments de classe
IPAddressqui codent respectivement l'adresse IP, la passerelle par défaut, le masque de sous‑réseau et, optionnellement, les deux adresses de résolveur DNS. - Elle retourne une valeur booléenne qui exprime la compatibilité de la configuration avec le mode choisi pour la carte.
-
WiFi.begincode la commande de connexion à un WLAN avec le mode et la configuration préalablement codés. - Elle possède plusieurs variantes d'appel (surcharges), la plus usuelle étant de la forme :
WiFi.begin(SSID, password)
où SSID et password sont les identifiants de connexion au WLAN (cf. supra ) ; - Elle retourne une valeur de type énuméré
wl_status_tdéclaré dans le fichier d'en‑têtewl_definitions.hG. -
WiFi.status, sans argument, retourne le statut courant de la connexion à un WLAN, exprimé par une valeur de type énuméréwl_status_t(cf. ci‑dessus). -
WiFi.isConnectedest une alternative plus simple et lisible questatuspour déterminer si la carte est connectée à un WLAN. Elle est sans argument et retourne une valeur de typebool. -
WiFi.disconnectcode la déconnexion de la carte. - Elle admet 1 ou 2 arguments optionnels de type
boolpour provoquer respectivement : - le retour dans le mode
WIFI_OFF; - l'effacement en mémoire des identifiants de connexion (SSID et PSWD).
- Elle retourne une valeur de type
boolqui exprime le succès ou non de la déconnexion.
config dans le programme utilisateur, la carte adopte par défaut une configuration IP dynamique (ce qui requiert l'existence du service DHCP sur le réseau – cf. chap. R2‑II ). begin n'a pas besoin d'être réitérée en cas d'échec. De plus, en cas de déconnexion, le socket réseau met en œuvre une procédure automatique de reconnexion. WL_CONNECTED et WL_DISCONNECTED(les autres valeurs servent à faire du diagnostic en cas d'échec). Dans le fichier d'en‑tête ESP8266WiFiSTA.h G sont également déclarées toute une série de méthodes pour récupérer les paramètres de connexion (un fois que cette dernière est établie) :
-
WiFi.localIP,WiFi.subnetMask,WiFi.gatewayIP,WiFi.dnsIPretournent respectivement les adresses IP de la configuration de la carte (cf. chap. R1‑III ), dans la classeIPAddress. -
WiFi.macAddress, sans argument, retourne l'adresse MAC de la carte sous la forme d'un chaîne de caractère de la classeString. -
WiFi.RSSI, sans argument, retourne la force du signal Wi‑Fi reçu (cf. supra ) exprimée en dBm par une valeur de typeint32_t.
dnsIP qui admet un argument de type uint8_t pour indiquer le numéro d'ordre du résolveur DNS, avec pour seules valeurs possibles 0 pour le primaire (valeur par défaut) et 1 pour le secondaire (cf. chap. R2‑I ).
Le programme de démonstration ci‑après est codé pour connecter à volonté une carte de développement NodeMCU à microcontrôleur ESP8266 à un point d'accès dans un WLAN et afficher les éléments de connexion sur le moniteur série. Il ne nécessite aucun accessoire car il exploite le bouton intégré FLASH de la carte et la led intégrée au module ESP‑12 (cf. chap. C1‑III ).
Pour plus de confidentialité, les identifiants de connexion au point d'accès sont déportés dans un fichier d'en‑tête connectionID.h, comme ci‑dessous (valeurs ici masquées) :
/***** WLAN connection IDs *****/ const char * SSID = "xxxxx"; const char * PSWD = "???????????????????????????????????????";
Le programme est structuré avec 3 fonctions auxiliaires :
-
buttonPushedqui détecte un appui sur le bouton FLASH ; -
connectToAPqui effectue la connexion de la carte au point d'accès ; -
disconnectFromAPqui effectue la déconnexion de la carte.
Les appuis sur le bouton commandent la connexion/déconnexion de la carte. Lorsque la connexion est établie, la led intégrée brille proportionnellement à la force du signal (RSSI). Elle s'éteint en cas de déconnexion.
#include <ESP8266WiFi.h>
#include "connectionID.h" // -> Access point SSID & PSWD
const uint8_t LED_PIN = 2; // ESP-12 module builtin led (negative logic)
const uint8_t BUTTON_PIN = 0; // builtin button "flash"
void setup()
{
Serial.begin(115200);
Serial.flush();
Serial.println();
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
if (buttonPushed()) {
WiFi.isConnected() ? disconnectFromAP() : connectToAP();
}
if (WiFi.isConnected()) {
analogWrite(LED_PIN, map(WiFi.RSSI(), -80, -30, 255, 0)); // negative logic
}
else {
digitalWrite(LED_PIN, !LOW); // negative logic
}
}
void connectToAP()
{
WiFi.mode(WIFI_STA); // station mode
WiFi.begin(SSID, PSWD); // no config, DHCP mode
Serial.print("Connection in process");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.printf("Connected to WLAN %s\n", WiFi.SSID().c_str());
Serial.printf("Channel %d\tSignal strength = %d dBm\n", WiFi.channel(), WiFi.RSSI());
Serial.println("IPv4 = " + WiFi.localIP().toString());
Serial.println("Mask = " + WiFi.subnetMask().toString());
Serial.println("Gateway = " + WiFi.gatewayIP().toString());
Serial.println("DNS1 = " + WiFi.dnsIP(0).toString());
Serial.println("DNS2 = " + WiFi.dnsIP(1).toString());
Serial.flush();
}
void disconnectFromAP()
{
WiFi.disconnect(true);
Serial.print("Disconnection ");
while (WiFi.status() != WL_DISCONNECTED) {
delay(500);
}
Serial.println(" complete.");
Serial.println();
Serial.flush();
}
bool buttonPushed()
{
static bool previousButtonLevel = HIGH; // negative logic
static bool currentButtonLevel = HIGH;
previousButtonLevel = currentButtonLevel;
currentButtonLevel = digitalRead(BUTTON_PIN);
return (currentButtonLevel == LOW && previousButtonLevel == HIGH); // falling edge
}
Lors d'une exécution du programme, si par exemple l'utilisateur appuie 2 fois sur le bouton FLASH à une minute d'intervalle, on obtient sur le moniteur série typiquement un affichage comme ci‑dessous :
Connection in process........... Connected to WLAN xxxxx Channel 11 Signal strength = -50 dBm IPv4 = 192.168.1.18 Mask = 255.255.255.0 Gateway = 192.168.1.1 DNS1 = 8.8.8.8 DNS2 = 8.8.4.4 Disconnection from xxxxx complete.
Remarque. Dans la bibliothèque développée pour les cartes à microcontrôleur ESP8266, il existe une implémentation de la fonction printf pour l'objet Serial.
- Elle est déclarée dans le fichier d'en‑tête
Print.hG. - Elle adopte une syntaxe similaire à celle de la fonction
printfde la bibliothèque standard du langage C (déclarée dans le fichier d'en‑têtestdio.h).
Gestion des événements de connexion en tâche de fond
Le fichier d'en‑tête ESP8266WiFiGeneric.h déclare également une série de méthodes pour gérer les connexions au WLAN en tâches de fond . En particulier, pour le mode station, on a (entre autres) :
-
onStationModeConnectedpour détecter la connexion de la station à un WLAN ; -
onStationModeDisconnectedpour détecter la déconnexion de la station ; -
onStationModeGotIPpour détecter que la station a obtenu une configuration IP de la station ;
Basées sur la notion d'événement, toutes ces méthodes adoptent un prototype semblable :
- Elles retournent une valeur du type générique
WiFiEventHandler(défini via un pointeur intelligent de mémoire partagéestd::shared_ptrpour ne pas encombrer la mémoire avec les événements). - Elles admettent comme argument un pointeur de fonction qui, lorsque l'événement attendu par la méthode se produit, permet d'appeler une fonction de callback W codée dans le programme utilisateur.
Chaque type d'événement doit faire l'objet d'une déclaration de variable statique de gestion d'événement Wi‑Fi de la forme :
static WiFiEventHandler Wi‑Fi event handler = WiFi.method(callback function);
sachant que pour coder la callback function, le fichier ESP8266WiFiType.h G met à disposition un type struct spécifique à chaque méthode pour déclarer son événement passé en argument :
-
WiFiEventStationModeConnectedpour un événement de connexion d'une station ; -
WiFiEventStationModeDisconnectedpour un événement de déconnexion d'une station ; -
WiFiEventStationModeGotIPpour un événement de configuration IP d'une station ; - etc.
Une explication détaillée est donnée à la suite du code de l'exemple ci‑dessous.
Avec ces méthodes de gestion d'événements, le programme de démonstration précédent peut être codé comme ci‑dessous.
#include <ESP8266WiFi.h>
#include "connectionID.h" // -> Access point SSID & PSWD
const uint8_t LED_PIN = 2; // ESP-12 module builtin led (negative logic)
const uint8_t BUTTON_PIN = 0; // builtin button "flash"
void setup()
{
Serial.begin(115200);
Serial.flush();
Serial.println();
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
static WiFiEventHandler onConnectionHandler = WiFi.onStationModeConnected(onConnected);
static WiFiEventHandler onGotIPhandler = WiFi.onStationModeGotIP(onGotIP);
static WiFiEventHandler onDisconnectionHandler = WiFi.onStationModeDisconnected(onDisconnected);
}
void loop()
{
if (buttonPushed()) {
WiFi.isConnected() ? disconnectFromAP() : connectToAP();
}
if (WiFi.isConnected()) {
analogWrite(LED_PIN, map(WiFi.RSSI(), -80, -30, 255, 0)); // negative logic
}
else {
digitalWrite(LED_PIN, !LOW); // negative logic
}
delay(5);
}
void connectToAP()
{
WiFi.mode(WIFI_STA); // station mode
WiFi.begin(SSID, PSWD);
Serial.print("Connection in process...");
}
// callback on connection
void onConnected(const WiFiEventStationModeConnected & event)
{
Serial.printf("\nConnected to WLAN %s\n", event.ssid.c_str());
Serial.printf("Channel %d\tSignal strength = %d dBm\n", event.channel, WiFi.RSSI());
Serial.flush();
}
// callback on configuration
void onGotIP(const WiFiEventStationModeGotIP & event)
{
Serial.println("IPv4 = " + event.ip.toString());
Serial.println("Mask = " + event.mask.toString());
Serial.println("Gateway = " + event.gw.toString());
Serial.println("DNS1 = " + WiFi.dnsIP(0).toString());
Serial.println("DNS2 = " + WiFi.dnsIP(1).toString());
Serial.flush();
}
void disconnectFromAP()
{
WiFi.disconnect(true);
Serial.print("Disconnection ");
}
// callback on disconnection
void onDisconnected(const WiFiEventStationModeDisconnected & event)
{
Serial.printf("from %s complete\n", event.ssid.c_str());
Serial.flush();
}
bool buttonPushed()
{
static bool previousButtonLevel = HIGH; // negative logic
static bool currentButtonLevel = HIGH;
previousButtonLevel = currentButtonLevel;
currentButtonLevel = digitalRead(BUTTON_PIN);
return (currentButtonLevel == LOW && previousButtonLevel == HIGH); // falling edge
}
Ainsi, grâce à la déclaration du gestionnaire d'événement de connexion onConnectionHandler (ligne nº 16), la fonction de callback onConnected est appelée automatiquement à chaque fois que la connexion au WLAN devient effective.
Cette fonction est déclarée avec un argument event de type WiFiEventStationModeDisconnected passé par référence. Ce dernier permet de récupérer via ses attributs 3 éléments de la connexion :
- l'adresse IP obtenue par la carte (
event.ip) ; - le masque de sous‑réseau du WLAN (
event.mask) ; - l'adresse IP de la passerelle du WLAN (
event.gw).
Mise en œuvre d'une carte ESP8266 en mode access point
La bibliothèque ESP8266WiFipermet la mise en œuvre d'un point d'accès sur une carte à microcontrôleur ESP8266. Avec des potentialités limitées comparativement à celles d'un routeur, il permet la connexion de jusqu'à 8 stations avec la prise en charge d'un service DHCP.
Pour cette mise en œuvre, on dispose des méthodes suivantes, toutes déclarées dans le fichier d'en‑tête ESP8266WiFiAP.h G :
-
WiFi.softAPcode l'activation du point d'accès configuration IP statique choisie pour la carte programmée en mode station. - Elle possède plusieurs variantes d'appel (surcharges), la plus usuelle étant de la forme :
WiFi.softAP(SSID, password)où SSID et password sont les identifiants de connexion au point d'accès (cf. supra ) ; - Elle retourne une valeur de type
boolqui indique le succès de l'activation. -
WiFi.softAPConfigcode la configuration IP du sous‑réseau mis en œuvre par le point d'accès. - Elle admet de 3 arguments de classe
IPAddressqui codent respectivement l'adresse IP du point d'accès, la passerelle par défaut et le masque de sous‑réseau. - Sa valeur de retour, de type
bool, exprime le succès de la configuration. -
WiFi.softAPIP, sans argument retourne l'adresse IP du point d'accès, de classeIPAddress. -
WiFi.softAPgetStationNum, sans argument retourne le nombre de stations connectées au point d'accès. -
WiFi.softAPdisconnect, code la désactivation du point d'accès. - Elle prend un unique argument de type
boolqui, s'il est passé à la valeurtrue, désactive aussi le mode access point. - Sa valeur de retour, de type
bool, exprime le succès de la désactivation.
WiFi.softAP possède d'autres paramètres optionnels : /24 (typiquement, 192.168.x.0/24) et d'attribuer l'adresse 1 à la carte. En effet, le service DHCP sélectionne automatiquement une plage d'adresses dynamiques décalée de 99 par rapport à l'adresse de la carte – donc, commençant à l'adresse 100 si la carte a l'adresse 1, ce qui est « lisible ». WiFi.softAPConfig, alors le point d'accès adopte la configuration par défaut 192.168.4.1/24 et attribue aussi l'adresse 1 à la passerelle. La plage d'adresses dynamiques commence alors à l'adresse 2. ESP8266WiFi ne déclare pas de méthode pour récupérer les informations (hostname, adresse MAC, adresse IP) des stations connectées au point d'accès.
Le programme de démonstration ci‑après est codé pour activer à volonté un point d'accès sur une carte de développement NodeMCU à microcontrôleur ESP8266. Comme pour l'exemple de démonstration de contrôle d'une connexion à un point d'accès (cf. supra ) :
- il exploite le bouton intégré FLASH et la led intégrée au module ESP‑12 ;
- il déporte les identifiants de connexion au point d'accès dans un fichier d'en‑tête
connectionID.h; - Le programme est structuré avec 3 fonctions auxiliaires, ici :
-
buttonPushedqui détecte un appui sur le bouton FLASH ; -
enableAPqui active le point d'accès ; -
disableAPqui désactive le point d'accès.
#include <ESP8266WiFi.h>
#include "connectionID.h" // -> Access point SSID & PSWD
const uint8_t LED_PIN = 2; // ESP-12 module builtin led (negative logic)
const uint8_t BUTTON_PIN = 0; // builtin button "flash"
// AP subnet configuration
IPAddress ap_localIP (192, 168, 10, 1);
IPAddress ap_gateway (192, 168, 10, 1);
IPAddress ap_subnet (255, 255, 255,0);
void setup()
{
Serial.begin(115200);
Serial.flush();
Serial.println();
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
static int8_t previousStationNum = -1;
if (buttonPushed()) {
if (WiFi.softAPIP()) {
disableAP();
previousStationNum = -1;
}
else {
enableAP();
}
}
if (WiFi.softAPIP()) {
digitalWrite(LED_PIN, !HIGH); // LED negative logic
if (previousStationNum != WiFi.softAPgetStationNum()) {
Serial.printf("Nb. of Nb. of stations connected: %d\n", WiFi.softAPgetStationNum());
previousStationNum = WiFi.softAPgetStationNum();
}
}
else {
digitalWrite(LED_PIN, !LOW); // LED negative logic
}
}
bool buttonPushed()
{
static bool previousButtonLevel = HIGH; // negative logic
static bool currentButtonLevel = HIGH;
previousButtonLevel = currentButtonLevel;
currentButtonLevel = digitalRead(BUTTON_PIN);
return (currentButtonLevel == LOW && previousButtonLevel == HIGH); // falling edge
}
void enableAP()
{
WiFi.mode(WIFI_AP); // station mode
if (WiFi.softAPConfig(ap_localIP, ap_gateway, ap_subnet)) {
Serial.println("AP configured with:");
Serial.println("IPv4 = " + ap_localIP.toString());
Serial.println("Mask = " + ap_subnet.toString());
Serial.println("Gateway = " + ap_gateway.toString());
Serial.flush();
}
else {
Serial.println("AP configuration failed");
}
if (WiFi.softAP(SSID, PSWD, false)) {
Serial.println("AP enabled");
}
else {
Serial.println("AP enabling failed");
}
}
void disableAP()
{
if (WiFi.softAPdisconnect(true)) {
Serial.println("AP disabled");
}
else {
Serial.println("AP disabling failed");
}
}
Lors d'une exécution du programme, si par exemple l'utilisateur :
- active le point d'accès en appuyant une première fois sur le bouton FLASH de la carte,
- se connecte au point d'accès avec son smartphone,
- se déconnecte du point d'accès,
- déactive le point d'accès en appuyant une deuxième fois sur le bouton FLASH de la carte,
alors on obtient sur le moniteur série un affichage comme ci‑dessous :
AP configured with: IPv4 = 192.168.10.1 Mask = 255.255.255.0 Gateway = 192.168.10.1 AP enabled Nb. of stations connected: 0 Nb. of stations connected: 1 Nb. of stations connected: 0 AP disabled
Dans le fichier d'en‑tête ESP8266WiFiAP.h, on ne trouve malheureusement aucune méthode pour identifier une station connectée au point d'accès, par son nom d'hôte, son adresse IP ou son adresse MAC.
Gestion des événements de connexion en tâche de fond
Comme pour le mode station, le fichier d'en‑tête ESP8266WiFiGeneric.h déclare des méthodes pour gérer les connexions au point d'accès en tâches de fond . En particulier, on a :
-
onSoftAPModeStationConnectedpour détecter la connexion d'une station ; -
onSoftAPModeStationDisconnectedpour détecter la déconnexion d'une station.
Et les types struct spécifiques associés respectivement à ces deux méthodes, déclarés dans le fichier d'en‑tête ESP8266WiFiType.h G, comportent deux attributs :
-
mac, un tableau de 6 éléments, qui contient l'adresse MAC de la station connectée ou déconnectée ; -
aid, un entier positif qui identifie le numéro attribué par le point d'accès à la station connectée ou déconnectée (en anglais, association identifier).
Avec ces méthodes de gestion d'événements, le programme de démonstration précédentd'activation‑désactivation d'un point d'accès (cf. supra ) peut être codé comme ci‑dessous, en apportant les éléments d'identification des stations qui faisaient défaut.
#include <ESP8266WiFi.h>
#include "connectionID.h" // -> Access point SSID & PSWD
const uint8_t LED_PIN = 2; // ESP-12 module builtin led (negative logic)
const uint8_t BUTTON_PIN = 0; // builtin button "flash"
// AP subnet configuration
IPAddress ap_localIP (192, 168, 10, 1);
IPAddress ap_gateway (192, 168, 10, 1);
IPAddress ap_subnet (255, 255, 255, 0);
void setup()
{
Serial.begin(115200);
Serial.flush();
Serial.println();
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
static WiFiEventHandler onSoftAPConnectedHandler = WiFi.onSoftAPModeStationConnected(onStationConnected);
static WiFiEventHandler onSoftAPDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(onStationDisconnected);
}
void loop()
{
if (buttonPushed()) {
WiFi.softAPIP() ? disableAP() : enableAP();
}
digitalWrite(LED_PIN, !WiFi.softAPIP()); // LED negative logic
}
bool buttonPushed()
{
static bool previousButtonLevel = HIGH; // negative logic
static bool currentButtonLevel = HIGH;
previousButtonLevel = currentButtonLevel;
currentButtonLevel = digitalRead(BUTTON_PIN);
return (currentButtonLevel == LOW && previousButtonLevel == HIGH); // falling edge
}
void enableAP()
{
WiFi.mode(WIFI_AP); // station mode
if (WiFi.softAPConfig(ap_localIP, ap_gateway, ap_subnet)) {
Serial.println("AP configured with:");
Serial.println("IPv4 = " + ap_localIP.toString());
Serial.println("Mask = " + ap_subnet.toString());
Serial.println("Gateway = " + ap_gateway.toString());
Serial.flush();
}
else {
Serial.println("AP configuration failed");
}
if (WiFi.softAP(SSID, PSWD, false)) {
Serial.println("AP enabled");
}
else {
Serial.println("AP enabling failed");
}
}
void disableAP()
{
if (WiFi.softAPdisconnect(true)) {
Serial.println("AP disabled");
}
else {
Serial.println("AP disabling failed");
}
}
// callback on connection
void onStationConnected(const WiFiEventSoftAPModeStationConnected & event)
{
Serial.printf("New station connected: id. %d, MAC ", event.aid);
displayMACaddress(event.mac);
Serial.printf("Nb. of stations connected: %d\n", WiFi.softAPgetStationNum());
}
// callback on disconnection
void onStationDisconnected(const WiFiEventSoftAPModeStationDisconnected & event)
{
Serial.printf("Station disconnected: id. %d, MAC ", event.aid);
displayMACaddress(event.mac);
Serial.printf("Nb. of stations connected: %d\n", WiFi.softAPgetStationNum());
}
void displayMACaddress(const uint8_t * mac)
{
for (uint8_t byteRank = 0; byteRank <= 5; byteRank++) {
Serial.print(mac[byteRank], HEX);
byteRank < 5 ? Serial.print("-") : Serial.println();
}
}
En gardant le même scénario d'exécution que pour la version précédente du programme, on obtient sur le moniteur série une sortie de la forme :
AP configured with: IPv4 = 192.168.10.1 Mask = 255.255.255.0 Gateway = 192.168.10.1 AP enabled New station connected: id. 1, MAC XX-XX-XX-XX-XX-XX Nb. of stations connected: 1 Station disconnected: id. 1, MAC XX-XX-XX-XX-XX-XX Nb. of stations connected: 0 AP disabled
Autres fonctionnalités du module de bibliothèque ESP8266WiFi
Scan des réseaux Wi‑Fi environnants
Un scan de réseaux Wi‑Fi consiste à détecter et lister les réseaux Wi‑Fi environnants d'un système. Sur une carte à microcontrôleur, une telle fonctionnalité peut être utile :
- en elle‑même – si c'est précisément le rôle qu'on assigne au programme utilisateur :
- ou pour apporter une souplesse de connexion au système (pour par exemple choisir tel ou tel réseau en fonction de la force du signal).
Les méthodes de scan sont déclarées dans le fichier d'en‑tête ESP8266WiFiScan.h G.
- La plus utile est la méthode :
WiFi.scanNetworksAsync(onComplete, show_hidden)
qui lance un scan en tâche de fond avec : - mémorisation des caractéristiques des réseaux détectés ;
- appel de la fonction de callback onComplete (premier argument) lorsque le scan est achevé ;
- repérage des réseaux cachés lorsque l'argument show_hidden est passé avec la valeur
true. - On dispose également de diverses méthodes pour récupérer les caractéristiques des réseaux scannées, toutes prenant un argument numérique n qui spécifie le numéro d'ordre du réseau scanné parmi tous ceux détectés. En particulier, on a :
-
WiFi.SSID(n)retourne le SSID du réseau nº n scanné. -
WiFi.channel(n)retourne le canal Wi‑Fi exploité par le réseau nº n scanné. -
WiFi.encryptionType(n)pour retourne le chiffrement utilisé par le réseau nº n scanné. La valeur retournée est du type énuméréwl_enc_typequi est déclaré dans le fichier d'en‑têtewl_definitions.hG.
Le programme de démonstration ci‑dessous est codé pour une carte de développement NodeMCU à microcontrôleur ESP8266. À chaque appui sur le bouton intégré FLASH intégré à la carte, il opère un scan asynchrone des réseaux Wi‑Fi environnants.
Via la fonction de callback displayScan (cf. les lignes nº 24 à 33), pour chaque réseau Wi‑Fi détecté, le programme produit sur le moniteur série une ligne d'affichage, avec dans l'ordre :
- son SSID (sauf si le réseau est caché) ;
- le canal Wi‑Fi qu'il exploite ;
- la force du signal détecté, exprimé en dBm ;
- l'éventuel algorithme de chiffrement qu'il utilise ;
- si le réseau est caché ou non (ce qui permet de comprendre pourquoi, le cas échéant, le SSID du réseau ne s'affiche pas).
#include <ESP8266WiFi.h>
const int BUTTON_PIN = 0; // builtin button "flash"
const char * encryption[] = {"?", "?", "WPA - TKIP", "?", "WPA2 - CCMP", "WEP",
"?", "NONE", "AUTO"};
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(1000);
}
void loop()
{
if (buttonPushed()) {
WiFi.scanNetworksAsync(displayScan, true); // true -> hidden networks displayed
}
}
// callback function called when scan completed
void displayScan(int networksFound)
{
Serial.printf("%d networks found\n", networksFound);
for (int n = 0; n < networksFound; n++) {
Serial.printf("%2d: %30s ", n + 1, WiFi.SSID(n).c_str());
Serial.printf("Ch: %2d (%d dBm) ", WiFi.channel(n), WiFi.RSSI(n));
Serial.printf("%s %s\n", encryption[WiFi.encryptionType(n)], WiFi.isHidden(n) ? "(hidden)" : " ");
Serial.flush();
}
Serial.println();
}
bool buttonPushed()
{
static bool previousButtonLevel = HIGH; // negative logic
static bool currentButtonLevel = HIGH;
previousButtonLevel = currentButtonLevel;
currentButtonLevel = digitalRead(BUTTON_PIN);
return (currentButtonLevel == LOW && previousButtonLevel == HIGH); // falling edge
}