Native Wifi - bezdrôtové siete vo Windows - diel 1
V tomto článku sa nebudem venovať jadru Windows, písanie ovládačov, procesu bootovania či iné nízkoúrovňové záležitosti. Dnešným témou je knižnica wlanpai.dll, ktoré implementuje klientskú časť rozhrania Native Wifi, ktoré programátorovi dovoľuje pomerne pohodlne pracovať s bezdrôtovými sieťami. Začneme ale úplne od počiatku všetkého ...
Motivačný príbeh
Na rozhraní Native Wifi som narazil pred 2,5 rokmi v období prázdnin medzi (úspešným) ukončením bakalárskeho a začiatkom nadväzujúceho magisterského štúdia na MFF UK. Už vtedy sme sa rozhodli začať s prácou na splnenia predmetu Softvérový projekt, ktorého cieľom je v rámci malej skupiny, čítajúce zvyčajne 4-6 ľudí, vytvoriť softvérové dielo trochu väčšieho rozsahu. Na tento účel bolo potrebné nájsť vhodnú neutrálnu pôdu, kde by sa tím mohol stretávať a pracovať, teda príjemné prostredie disponujúci najmä dobrým pripojením k internetu. Budovy MFF UK napodiv nespĺňali internetovú podmienku, pretože sme ako nestudující nemali prístup k sietí eduroam.
Rozhodli sme sa vyskúšať Národnej technickú knižnicu (NTK), najmä jej tímovej študovne. Prenájom týchto miestností majú študenti zdarma a registračný poplatok do knižnice tiež nepatrí do kategórie "len pre bohatých". Celá budova je navyše pokrytá ako vyššie zmienenú sietí eduroam, tak i sietí NTK-Simple, ktorý umožňuje registrovaným návštevníkom prístup k internetu. Voľba sa teda zdala jasná.
Pripojenie cez NTK-Simple sa vzápätí ukázalo ako veľmi nestabilná. Hlavnou príčinou, ako nám ju oznámila technická podpora, je snaha pokryť celú budovu NTK, čo viedlo k inštalácii prílišného množstva prístupových bodov (AP). Wifi karty tak pri komunikácii neustále prechádzajú medzi jednotlivými AP, čo vraj vedie k celkovej nestabilite pripojenie. Štandardné riešenie, ktoré v našom prípade ale nezafungovalo, spočíva v znížení výkonu Wifi karty, čo vedie k tomu, že počet viditeľných AP klesne na rozumnú hranicu.
Nechcel som sa NTK len tak ľahko vzdať a preto som sa rozhodol preskúmať, či ak Windows neexportujú nejaké rozhranie pre prácu s bezdrôtovými sieťami a najmä pre pripájanie cez konkrétny (ideálne však jeden) prístupové body. V prípade Windows Vista a novších verzií hľadanie skončilo stopercentným úspechom. Áno, spásne rozhranie sa volá Native Wifi.
A tým celá rozprávka v podstate končí. Za cca poldruha dňa vznikla jednoduchá GUI aplikácia s názvom WlanClient dovoľujúci pripojenie k bezdrôtovej sieti cez konkrétne AP, pričom slušné množstvo programovacieho času zabralo importovanie potrebných funkcií rozhrania Native Wifi do Delphi, pretože v inom jazyku som sa grafické rozhrania ešte tvoriť nenaučil. Aplikácia je súčasťou tohto článku, nechýba ani (nekomentované) zdrojové kódy.
Poznámka: po vyriešení problému došlo k výmene niekoľkých mailov s technickou podporou (odpoveď na otázku, či sa podarilo problém vyriešiť, v štýle "áno, napísali sme si na to aplikáciu" asi Neprogramátori zvyčajne udiví) a zdalo sa, že naše aplikácie bude k dispozícii aj oficiálne. Tieto rokovania nakoniec vyšla do stratena.
Poznámka: Je pravda, že tiež dokážem tvoriť grafické rozhranie vo Windows Forms, teda na platforme .NET. Rozhranie Native Wifi je síce dostupné aj pre .NET, no je nutné ho explicitne doinštalovať. Preto som sa rozhodol použiť Delphi. Tým tiež odpadli prípadné problémy s chýbajúcim .NET Framework.Príprava na akciu
Ako už bolo povedané vyššie, klientskú časť rozhrania Native Wifi implementuje knižnica wlanapi.dll, pre linkovanie je dostupná statická knižnica wlanapi.lib. V článku sa nebudeme zaoberať všetku funkčnosťou, ktorú rozhranie ponúka, ale pozrieme sa len na prostriedky, ktorý nám dovolí vyriešiť problém popísaný v rozprávke. Konkrétne sa jedná o nájdenie odpovedí na nasledujúce otázky:
- Ako získať zoznam Wifi kariet pripojených (či už interne (PCI) alebo externe (USB)) k počítaču?
- Ako zistiť bezdrôtovej siete detekovanej určitú kartou?
- Ako zistiť zoznam AP pre určitú sieť?
- Ako sa pripojiť ku konkrétnej sieti a ako sa od nej opäť odpojiť?
Nutné priznať, že oproti štandardnému Windows API sa funkcia exportované knižnicou wlanapi.dll používajú veľmi dobre, najmä tie, ktoré budeme potrebovať. Hlavný rozdiel spočíva v tom, že ak vám má funkcie vrátiť výsledok netriviálne veľkosti, alokuje si pre jeho uloženie pamäť sama a vašou zodpovednosťou je príslušný buffer uvoľniť až ho nebudete ďalej potrebovať. Pri klasickom Windows API musíte buffer poskytnúť sami a keďže dopredu obvykle neviete, aký veľký bude výsledok, voláte príslušnú rutinu minimálne dvakrát; prvýkrát, aby ste sa dozvedeli, aký veľký výstupný buffer potrebujete, druhýkrát, aby ste do neho uložili výsledok (ktorého veľkosť sa s trochou šťastia medzi dvoma volaniami nezväčšila a teda sa do vami alokovaného bloku vojde).
Rozhranie Native Wifi je prítomné aj na Windows XP SP3 alebo SP2 s balíčkom Wireless LAN API, nedovoľuje však pripájanie k bezdrôtovej sieti len cez určité prístupové body.
Pred samotným začatím práce je nutné rozhranie Native Wifi inicializovať pre vašu aplikáciu, k čomu slúži funkcia WlanOpenHandle definovaná nasledovne:
DWORD WINAPI WlanOpenHandle( _In_ DWORD dwClientVersion, _Reserved_ PVOID pReserved, _Out_ PDWORD pdwNegotiatedVersion, _Out_ PHANDLE phClientHandle );
V prvom parametri špecifikujete akú verziu Native Wifi si prajete používať (hodnota 1 znamená Windows XP, pre Windows Vista a novšie zadajte dvojku). V treťom parametra sa v prípade úspešnej inicializácia dozviete akú verziu nakoniec budete naozaj používať. Keďže je verzia pre Windows Vista spätne kompatibilné s verziou pre XP (iba rozširuje jej možnosti), ani situácia, kedy vaše aplikácia požaduje staršiu verziu a nakoniec inicializuje novší by nemala predstavovať problém.
V prípade úspechu vám funkcie vo štvrtom parametri vráti tzv. Handle, čo je odkaz na dátové štruktúry vami používané inštancie knižnice wlanapi.dll. Budete ho musieť odovzdávať ako parameter pri volaní ďalších rutín rozhranie. Fakt, že inicializácia skončila úspechom, spoznáte z návratové hodnoty, ktorá bude ERROR_SUCCESS (číselná hodnota 0).
Upozornenie: Vždy testujte úspech či neúspech volanie funkcie podľa jej návratovej hodnoty, pokiaľ dokumentácia nepovie inak. Nikdy neskúmajte obsah výstupných parametrov predtým, než skontrolujete návratovú hodnotu. U rozhrania Windows API sa vyskytujú prevažne dva typy funkcií:
- Funkcia vracajúci BOOL (logická hodnota TRUE alebo FALSE). Hodnota TRUE znamená, že funkcia splnila svoju úlohu a teda naplnila výstupné parametre validnými dátami. Hodnota FALSE značí, že volanie zlyhalo. Kód chyby zvyčajne získate volaním rutiny GetLastError.
- Funkcia vracajúci celé číslo (DWORD, NTSTATUS, int ...). Takéto rutiny vracia priamo kód chyby. Hodnota ERROR_SUCCESS udáva, že volanie uspelo (mimochodom, číselne je ERROR_SUCCESS rovná logické hodnote FALSE). Iný chybový kód indikuje neúspech. Konštanty chybových kódov sa môžu líšiť u rôznych funkcií, ale 0 obvykle znamená úspech.
Pokiaľ si už s bezdrôtovými sieťami cez rozhranie Native Wifi pracovať neželáte, mali by ste tento fakt oznámiť knižnici wlanapi.dll. Za týmto účelom exportuje funkciu WlanCloseHandle. V prvom parametru ju predáte handle získané pri úspešnej inicializácii knižnice.
DWORD WINAPI WlanCloseHandle( _In_ HANDLE hClientHandle, _Reserved_ PVOID pReserved );
Poznámka: Pravdepodobne ste si v deklaráciách funkcií všimli parametra preserved. Jeho hodnotu vždy nastavujte na NULL (alebo nulu) a to nielen pri volaní funkcií rozhraní Native Wifi. Tieto parametre môžu byť využité v neskoršej verzii Windows k rozšíreniu funkčnosti danej rutiny.Teraz už teda viete, ako knižnicu wlanapi.dll pripraviť a ako vykonať upratovanie po prípadnom "vyčíňanie". Nastal čas si ukázať, že Native Wifi je skutočne na niečo dobré, k čomu sa dostaneme v druhom dieli.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 87x (1.65 MB)
Aplikácia je vrátane zdrojových kódov