Kod QR, po którego zeskanowaniu telefon sam podłącza się do sieci, wygląda na magię. Nie jest — to zwykły tekst zapisany w kodzie w konkretnym, dobrze udokumentowanym formacie, który systemy operacyjne rozpoznają i traktują specjalnie. Warto wiedzieć, jak to działa, bo od tego zależy, czy rozwiązanie zadziała u wszystkich gości, czy tylko u części.
Poniżej techniczne, ale przystępne rozłożenie tematu na części: format, znaki specjalne, różnice między iOS i Androidem oraz to, co realnie potrafi NFC.
Format ciągu w kodzie QR
Kod QR nie zawiera żadnych "danych Wi-Fi" w sensie systemowym. Zawiera tekst. Sztuczka polega na tym, że jeśli tekst zaczyna się od określonego przedrostka, system rozpoznaje go jako konfigurację sieci zamiast wyświetlać jako zwykły napis.
Format zdefiniowała biblioteka ZXing i to on stał się faktycznym standardem. Zgodnie z jej dokumentacją ("Barcode Contents") ciąg wygląda następująco:
WIFI:T:WPA;S:mynetwork;P:mypass;;
Poszczególne pola oznaczają:
- T — typ zabezpieczenia. Dokumentacja ZXing wymienia wartości WEP, WPA, WPA2-EAP oraz nopass dla sieci bez hasła.
- S — nazwa sieci (SSID). Pole wymagane.
- P — hasło. Ignorowane, jeśli typ ustawiono na nopass.
- H — pole opcjonalne, wartość true dla sieci z ukrytym SSID.
Pola rozdziela średnik, a całość zamykają dwa średniki. Warto zwrócić uwagę, że wartość WPA obejmuje w praktyce także sieci WPA2 — nie ma osobnego oznaczenia dla drugiej wersji.
Znaki specjalne, czyli najczęstsza przyczyna niedziałających kodów
Skoro średnik rozdziela pola, to hasło zawierające średnik rozwali cały ciąg. Dlatego dokumentacja ZXing przewiduje mechanizm ucieczki: znaki \, ;, ,, " oraz : należy poprzedzić lewym ukośnikiem.
Dokumentacja podaje przykład: jeśli nazwa sieci brzmi dosłownie "foo;bar\baz" (z cudzysłowami będącymi częścią nazwy), zostanie zakodowana jako WIFI:S:\"foo\;bar\\baz\";;.
Praktyczny wniosek dla obiektu: jeśli w haśle do sieci gościnnej występują średniki, dwukropki, przecinki, cudzysłowy albo ukośniki, generator kodu musi je poprawnie przetworzyć. Prostsze i pewniejsze jest ustawienie hasła bez tych znaków — długość i losowość dają bezpieczeństwo, a nie egzotyczna interpunkcja.
Dokumentacja ZXing dodaje jeszcze jedną subtelność: nazwy i hasła, które są ciągami ASCII, ale dałyby się zinterpretować jako liczby szesnastkowe, należy ująć w cudzysłowy. Dotyczy to na przykład hasła składającego się wyłącznie z cyfr i liter od a do f.
Android: dwa formaty zamiast jednego
Android obsługuje opisany format, ale nie tylko jego. W kodzie źródłowym aplikacji Ustawienia w Android Open Source Project (klasa WifiQrCode) widać, że parser rozpoznaje dwa przedrostki: WIFI: — czyli format ZXing — oraz DPP:, należący do mechanizmu Wi-Fi Easy Connect. Ta sama klasa akceptuje typy zabezpieczeń WPA, WEP, SAE oraz nopass, przy czym nopass obejmuje zarówno sieci otwarte, jak i te z szyfrowaniem OWE.
Obecność wartości SAE jest istotna: to mechanizm uwierzytelniania stosowany w WPA3-Personal. Dokumentacja Android Open Source Project podaje, że wsparcie dla WPA3 i Wi-Fi Enhanced Open pojawiło się w Androidzie 10, a wersja 12 dodała kolejne elementy, w tym mechanizm Transition Disable oraz uwierzytelnianie Hash-to-Element.
Android 10 wprowadził też obsługę samego Wi-Fi Easy Connect (znanego jako DPP, Device Provisioning Protocol), następcy wycofanego w Androidzie 9 mechanizmu WPS. Zgodnie z dokumentacją AOSP pozwala on dołączyć do sieci bez znajomości hasła, na podstawie identyfikatora URI odczytanego z kodu QR albo przekazanego poza pasmem — na przykład przez Bluetooth lub NFC.
iOS: format ZXing tak, reszta z zastrzeżeniami
Aparat w iPhonie rozpoznaje kody QR i obsługuje format konfiguracji sieci, wyświetlając propozycję dołączenia. W nowszych wersjach systemu Apple dodało też generowanie kodu po stronie użytkownika — dokumentacja Apple Support opisuje w ustawieniach sieci Wi-Fi opcję pokazania kodu QR sieci, który mogą zeskanować inne osoby.
Warto natomiast pamiętać, że osobny, firmowy mechanizm Apple polegający na udostępnianiu hasła między urządzeniami to co innego niż kod QR. Zgodnie z dokumentacją Apple wymaga on, aby urządzenia znajdowały się w zasięgu Bluetooth i Wi-Fi, były odblokowane, nie korzystały z Hotspotu osobistego, a użytkownicy mieli się nawzajem w kontaktach. Dla gościa hotelowego to warunki niemożliwe do spełnienia — dlatego uniwersalnym rozwiązaniem pozostaje kod QR w formacie ZXing.
NFC: co potrafi, a czego nie
Tag NFC przechowuje wiadomość w formacie NDEF. Mechanizm przekazywania parametrów sieci bezprzewodowej przez NFC opisuje specyfikacja Connection Handover organizacji NFC Forum — jak podaje NFC Forum, Wi-Fi Easy Connect umożliwia łatwe połączenia dzięki tagom NFC zawierającym wiadomość NDEF z osadzonym identyfikatorem URI używanym do zestawienia połączenia. Starszy wariant, wywodzący się ze specyfikacji WPS, przechowuje poświadczenia w rekordzie o typie MIME application/vnd.wfa.wsc, zawierającym nazwę sieci, typ uwierzytelniania i szyfrowania oraz klucz sieciowy.
I tu pojawia się kluczowa różnica praktyczna. Android obsługuje ten mechanizm natywnie. W przypadku iPhone'a jest inaczej: dokumentacja Apple dotycząca czytania tagów NFC w tle ("Adding Support for Background Tag Reading") wskazuje, że mechanizm uruchamia się dla wiadomości NDEF zawierających rekord z adresem URL, a nieobsłużone odnośniki trafiają domyślnie do Safari. Funkcja działa na iPhone'ach od modeli XS, XS Max i XR, wymaga co najmniej jednokrotnego odblokowania telefonu po uruchomieniu i włączonego ekranu; nie zadziała między innymi w trybie samolotowym ani gdy aktywny jest aparat lub Apple Pay.
Wniosek dla obiektu jest prosty: jeżeli tag NFC ma zadziałać u każdego gościa, powinien zawierać adres URL prowadzący do strony z danymi sieci, a nie surowy ładunek konfiguracyjny. Kod QR w formacie ZXing zostaje wtedy szybką ścieżką, a NFC alternatywą dla osób, które wolą przyłożyć telefon.
Praktyczne wnioski
- Generuj kod QR w formacie ZXing z jawnie podanym typem zabezpieczenia — nie polegaj na tym, że generator zgadnie.
- Unikaj w haśle znaków wymagających ucieczki: średnika, dwukropka, przecinka, cudzysłowu i ukośnika.
- Przetestuj gotowy kod na iPhonie i na telefonie z Androidem, zanim zamówisz nośniki. To pięć minut, które oszczędza późniejszej wymiany.
- Jeśli sieć gościnna ma ukryty SSID, pamiętaj o polu H — bez niego telefon nie znajdzie sieci.
- Na tagu NFC umieszczaj adres URL, jeśli zależy ci na zgodności z iPhone'ami.
- Zadbaj, żeby nośnik był trudny do podmiany — podklejony obcy kod QR to realny wektor ataku, opisany szerzej w tekście o błędach w hotelowym Wi-Fi.
Po stronie organizacyjnej zostaje pytanie, gdzie i w jakiej formie ten kod ma stać, żeby gość go zauważył — porównanie sposobów zebraliśmy w tekście o tym, jak udostępniać Wi-Fi gościom bez dyktowania hasła. Jeśli szukasz nośnika, który przetrwa codzienne używanie, stand z bazą z PETG, wypukłym nadrukiem UV, nieścieralnym kodem QR i programowalnym chipem NFC łączy obie ścieżki w jednym punkcie przy recepcji lub w pokoju; pracujemy B2B, na fakturę, z indywidualną wyceną.