Escribir una etiqueta Wi-Fi en Android: el registro WSC explicado
Una etiqueta NFC Wi-Fi es un único registro NDEF MIME de tipo application/vnd.wfa.wsc. Aquí ves qué contiene, cómo lo crea Android y qué vigilar.
Introducción
Una etiqueta Wi-Fi de Android es un único registro NDEF con el tipo MIME application/vnd.wfa.wsc. Dentro van el nombre de la red, el tipo de seguridad y la contraseña, empaquetados en el formato Wi-Fi Simple Configuration (WSC). Aquí verás qué contiene ese registro, cómo lo crea Android y dónde deja de funcionar.
Qué es el registro application/vnd.wfa.wsc
El registro WSC es un registro NDEF MIME, y su contenido no es texto. Es una serie de entradas etiqueta/valor, y como lo expresó un aficionado que armó la etiqueta a mano con un lector PN532, «no es simple (es decir, hay longitudes implícitas)». Por eso la mayoría deja que una app o una biblioteca lo codifique.
La especificación describe tres formas de usar el formato: un Password Token, un Configuration Token y Connection Handover. Una etiqueta pegada en la pared es un Configuration Token. Lleva las credenciales desde el registrador de una red hasta un dispositivo que quiere unirse, así que el teléfono se conecta directamente.
Qué hay dentro de la credencial
Todo lo que el teléfono necesita vive en un solo bloque de credencial. Según la documentación de ndeflib sobre el formato WSC, estos campos son obligatorios:
| Campo | Qué contiene |
|---|---|
| Network Index | Obsoleto, siempre 1 por compatibilidad |
| SSID | El nombre de la red |
| Authentication Type | Cómo se demuestra que un dispositivo puede unirse |
| Encryption Type | El cifrado en uso |
| Network Key | La contraseña |
| MAC Address | La dirección del dispositivo o una dirección de difusión |
Un bloque de extensión del fabricante es opcional, igual que cualquier entrada WSC adicional.
Los campos de tipo son indicadores de bits, así que conviene conocer los valores si algún día lees un volcado hexadecimal:
| Ajuste | Valor |
|---|---|
| Abierta | 0x0001 |
| WPA2-Personal | 0x0020 |
| WPA y WPA2 mixto (versión 2.0 y posteriores) | 0x0022 |
| Cifrado: ninguno | 0x0001 |
| Cifrado: AES | 0x0008 |
| Cifrado: TKIP y AES mixto | 0x000C |
WEP y solo TKIP figuran como obsoletos en la misma documentación. Un Configuration Token completo del ejemplo de ndeflib se codifica en 139 octetos, así que comprueba la capacidad NDEF de tu etiqueta antes de escribir.
Cómo crea y lee Android el registro
La guía básica de NFC de Android explica que los datos NDEF viven en un mensaje que contiene uno o más registros, y que cada registro debe estar bien formado para su tipo. Desde Android 4.1 (API nivel 16), NdefRecord.createMime() existe para que no armes los registros MIME a mano. Google recomienda usar el método auxiliar siempre que sea posible para evitar errores.
El tipo MIME es lo que hace útil la etiqueta. El sistema de despacho de etiquetas de Android asigna el tipo de un registro TNF_MIME_MEDIA a un intent ACTION_NDEF_DISCOVERED, el de mayor prioridad. En una etiqueta Wi-Fi, ese tipo es application/vnd.wfa.wsc. La documentación también indica que el registro que quieres que se procese debe ser el primero del mensaje que escribes, así que deja el registro Wi-Fi primero y no lo escondas detrás de una URL.
La documentación de Android no incluye un ejemplo de Wi-Fi, así que deja el diseño de los bytes en manos del codificador que uses. Si escribes el tuyo, pruébalo con una etiqueta escrita por una app de confianza.
Antes de escribir una
El Configuration Token guarda credenciales sin cifrar. Cualquiera que acerque el teléfono a la etiqueta, o la lea con cualquier app lectora de NFC, puede ver la contraseña. Usa una red de invitados, nunca la principal, y cambia la contraseña si una etiqueta se pierde. Es también la configuración sensata para una etiqueta de bienvenida con Wi-Fi en un alquiler.
Escribe etiquetas solo para redes que sean tuyas o que administres. Así de simple.
Qué pasa cuando un iPhone la toca
Un iPhone se comporta distinto. La documentación de Apple sobre lectura de etiquetas en segundo plano dice que el sistema busca en el mensaje NDEF un registro URI, de tipo conocido U. Después enumera los esquemas de URL compatibles, como enlaces web, correo, teléfono y SMS. Los registros de credenciales Wi-Fi no aparecen en la página.
El aficionado mencionado probó su etiqueta e informó de que «no funciona en un iPhone». Lo explicamos con más detalle en por qué un iPhone no se une solo desde la misma etiqueta. Si tus invitados usan los dos tipos de teléfono, añade un código QR de Wi-Fi junto a la etiqueta, como se plantea en NFC frente a código QR.
Conclusión
Una etiqueta Wi-Fi es un único registro MIME con un bloque de credencial compacto y sin cifrar. El despacho de etiquetas de Android lo enruta por tipo MIME, y los iPhone no actúan sobre él. Para probarlo, escribe una etiqueta con NFCore en iPhone o Android y vuelve a escanearla para ver el tipo de registro y su contenido.
Preguntas frecuentes
¿Qué tipo MIME usa una etiqueta NFC Wi-Fi?
Usa application/vnd.wfa.wsc, un registro NDEF MIME que transporta datos de Wi-Fi Simple Configuration.
¿Está cifrada la contraseña Wi-Fi de la etiqueta?
No. Un Configuration Token lleva credenciales sin cifrar, así que cualquiera que pueda leer la etiqueta puede leer la contraseña. Usa una red de invitados.
¿Puedo escribir el registro WSC a mano?
Puedes, pero el contenido es un conjunto de entradas tipo-longitud-valor con longitudes implícitas. Usa una biblioteca o una app que lo construya por ti.
¿Funcionará la etiqueta en un iPhone?
No como conexión Wi-Fi. La lectura en segundo plano busca un registro URI, y se informó de que una etiqueta con registro WSC no funcionaba en un iPhone.