Público objetivo:Este artículo está dirigido a oficiales de privacidad, arquitectos de TI en distritos escolares y ministerios, socios OEM que integran paneles de salud de flotas e importadores B2B que deben responder a la pregunta «¿qué reporta el bolígrafo de vuelta a la fábrica?» para compradores en la UE, EE. UU., Gulf y América Latina. Supone que comprende GDPR y COPPA a nivel conceptual, pero quiere saber exactamente qué clases de eventos salen de los bolígrafos B1/B2/F8/K7/KF1/L5/P2/Q6/Q8/T2/Y6, cuáles están anonimizados, cuáles son de suscripción opcional y cuáles nunca viajan.
Una cooperativa de compra escolar española que adquirió 12.000 bolígrafos preguntó a nuestro equipo de cumplimiento una pregunta precisa el último trimestre: «Según el Artículo 25 del GDPR, ¿qué datos salen del dispositivo, qué datos permanecen en el dispositivo y puede un padre optar por no participar sin perder la cobertura de la garantía?» La respuesta honesta tiene 23 páginas. La respuesta corta, que publicamos aquí, es que los eventos de telemetría están desactivados por defecto en la UE, activados por defecto en EE. UU. bajo COPPA, activados por defecto en Arabia Saudita bajo SFDA, y nunca activados por defecto para flotas OEM autogestionadas. A continuación se describe la ingeniería detrás de estas políticas.
Este artículo cubre el búfer de anillo de registro en el dispositivo, el esquema de eventos, la tubería de anonimización, el calendario de carga, la postura de GDPR/COPPA/PIPL/LGPD, las métricas de salud de flota que expone el panel y el costo de ejecutar telemetría en más de 47.000 bolígrafos en 47 países.
1. El búfer de anillo de registro en el dispositivo
Cada bolígrafo tiene un búfer de anillo de 512 KB en la partición de datos de usuario. El búfer es de solo anexado, indexado por tiempo y sobrevive a un restablecimiento de fábrica solo si el padre elige «preservar registros de diagnóstico», que es el valor predeterminado para despliegues empresariales y desactivado por defecto para retail.
1.1 Parámetros del búfer por modelo
| Modelo | Partición | Tamaño del búfer | Registros de eventos | Retención (días) |
|---|---|---|---|---|
| B1 | NOR de datos de usuario | 256 KB | 2.800 | 14 |
| B2 | NOR de datos de usuario | 256 KB | 2.800 | 14 |
| F8 | NAND de datos de usuario | 512 KB | 5.600 | 21 |
| K7 / KF1 | NAND de datos de usuario | 512 KB | 5.600 | 21 |
| L5 | NAND de datos de usuario | 1 MB | 11.200 | 30 |
| P2 | NOR de datos de usuario | 256 KB | 2.800 | 14 |
| Q6 / Q8 | NAND de datos de usuario | 1 MB | 11.200 | 30 |
| T2 / Y6 | NAND de datos de usuario | 2 MB | 22.400 | 45 |
El búfer tiene el tamaño suficiente para contener la clase de eventos de mayor volumen (app.evt) durante 14–45 días, dependiendo del modelo. El búfer es de tipo wrap-around: los eventos más antiguos se descartan primero.
1.2 Esquema de eventos
Cada registro es una estructura fija de 96 bytes con un tipo de 1 byte, una marca de tiempo de 4 bytes, una versión de esquema de 2 bytes y 89 bytes de carga útil específica del tipo.
struct telemetry_event_t {
uint8_t type; // 0x01..0x2C
uint32_t timestamp; // seconds since boot
uint16_t schema_ver; // e.g., 0x0007
uint8_t severity; // 0..3 (info, warn, error, critical)
uint8_t reserved;
uint8_t payload[80];
uint16_t crc; // CRC-16-CCITT
uint8_t sig_pad[6]; // reserved for Ed25519 short sig
} __attribute__((packed));
La carga útil es específica del tipo. Un boot.end evento transporta una duración de arranque uint32; un oid.lookup evento transporta una latencia uint16 y un bucket de página de diccionario uint16; un app.crash evento transporta un hash de huella de pila de 64 bytes.
2. Clases de Eventos
Definimos 44 clases de eventos. No todas se suben. La clasificación es LOCAL (nunca se sube), TELEMETRY (subido, anonimizado), o SUPPORT (subido solo con consentimiento explícito del usuario).
| Clase | Cantidad | Postura predeterminada | Ejemplo |
|---|---|---|---|
| Solo local | 18 | LOCAL | key.press, book.open, app.locale |
| Telemetría (anonimizado) | 19 | TELEMETRY | boot.end, oid.lookup, pwr.drain, fw.update |
| Soporte (opcional) | 7 | SUPPORT | voice.clip, asr.utterance, dict.override |
Los 18 eventos LOCAL permanecen en el dispositivo y se usan solo para funciones dentro de la aplicación, como «reanudar donde lo dejaste». Los 19 eventos TELEMETRY se suben en lotes por Wi-Fi. Los 7 eventos SUPPORT se suben solo cuando el padre o el administrador de flota habilita explícitamente el modo de soporte.
3. Reglas de Anonimización
Cada evento TELEMETRY atraviesa una tubería de anonimización de 4 etapas antes de subirse. La tubería se ejecuta en el dispositivo y es aplicada por el bootloader; incluso una aplicación comprometida no puede evadirla.
- Eliminar identificadores — El número de serie del dispositivo se reemplaza con una sal rotativa por arranque. La sal es un valor aleatorio de 128 bits regenerado en cada arranque en frío.
- Agrupar valores en cubetas — Las latencias se redondean a los 10 ms más cercanos. Los niveles de batería se redondean al 5% más cercano. Las búsquedas en el diccionario se agrupan en niveles CEFR.
- Huellas digitales hash — Las trazas de pila se hashean con una sal por flota. La sal rota mensualmente y nunca se sube.
- Agregar en origen — Los eventos individuales se agregan en ventanas de 15 minutos en el dispositivo. El dispositivo sube un registro por ventana, no 30 eventos individuales.
El registro agregado contiene: marca de tiempo de ventana, fleet ID (un hash de 32 bits de la subclave OEM), modelo, versión de firmware, código de región y 6 contadores de métricas. No contiene serial de dispositivo, nombre del padre, nombre del hijo ni ningún contenido que el hijo tocó.
4. Programación de Carga y Agrupación
Las cargas ocurren solo por Wi-Fi, nunca por celular (no incluimos un módem celular). El calendario predeterminado es:
| Condición | Comportamiento |
|---|---|
| Wi-Fi asociado, inactivo >5 min | Subir lote pendiente |
| Batería <20% | Diferir carga |
| Batería <10% | Cancelar subida, mantener lote localmente |
| Cargador conectado, cualquier batería | Subir inmediatamente |
| Subida forzada por administrador de flota | Subir ahora, independientemente del estado |
Un lápiz típico sube 1–3 registros por lotes al día, totalizando 18–54 KB. En una flota de 12.000 lápices durante una semana escolar, el volumen de subida es de 1,6–4,8 GB por semana, lo que cabe cómodamente en una única línea corporativa de banda ancha.
5. Postura GDPR / COPPA / PIPL / LGPD
El comportamiento predeterminado de telemetría varía según la jurisdicción. La fábrica establece el valor predeterminado según las regulaciones del destino de envío.
| Jurisdicción | Telemetría predeterminada | Soporte predeterminado | Mecanismo de exclusión |
|---|---|---|---|
| UE (GDPR) | EXCLUSIÓN OPCIONAL | DESACTIVADO | Ajustes → Privacidad → Telemetría |
| Reino Unido (GDPR + DPA) | EXCLUSIÓN OPCIONAL | DESACTIVADO | Ajustes → Privacidad → Telemetría |
| EE. UU. (COPPA, menores de 13) | INCLUSIÓN OPCIONAL | DESACTIVADO | Asistente de primer inicio |
| EE. UU. (13+, leyes estatales) | EXCLUSIÓN OPCIONAL | DESACTIVADO | Ajustes → Privacidad → Telemetría |
| Arabia Saudí (SFDA, PTA) | INCLUSIÓN OPCIONAL | DESACTIVADO | Asistente de primer inicio + portal PTA |
| EAU (TDRA) | INCLUSIÓN OPCIONAL | DESACTIVADO | Asistente de primer inicio + portal TDRA |
| China (PIPL) | INCLUSIÓN OPCIONAL | DESACTIVADO | Asistente de primer inicio + consentimiento PIPL |
| Brasil (LGPD) | EXCLUSIÓN OPCIONAL | DESACTIVADO | Ajustes → Privacidad → Telemetría |
| México (LFPDPPP) | EXCLUSIÓN OPCIONAL | DESACTIVADO | Ajustes → Privacidad → Telemetría |
| Todas las demás regiones | EXCLUSIÓN OPCIONAL | DESACTIVADO | Ajustes → Privacidad → Telemetría |
En cada jurisdicción, el padre o el administrador de flota puede desactivar la telemetría sin perder la cobertura de la garantía, sin perder el acceso a las actualizaciones OTA y sin perder el acceso al soporte. La única función desactivada al excluirse es el panel de estado de la flota, que requiere telemetría agregada para funcionar.
6. Panel de métricas de estado de la flota
Para socios OEM y operadores de flotas grandes, el panel de telemetría expone 9 métricas a nivel de flota. Ninguna métrica se puede desglosar hasta el número de serie de un único dispositivo.
| Métrica | Definición | Uso |
|---|---|---|
| Tasa de actividad diaria | (bolígrafos con ≥1 arranque en 24 h) / (tamaño de flota) | Participación |
| Sesiones sin bloqueo | (sesiones sin excepción no gestionada) / (sesiones) | Estabilidad |
| p95 de búsqueda OID | Percentil 95 de OID a pronunciación | Rendimiento |
| Salud de la batería | Bolígrafos que informan <80% de la capacidad original | Ciclo de vida del hardware |
| Tasa de adopción de OTA | (bolígrafos con firmware más reciente) / (tamaño de flota) | Velocidad de actualización |
| Tasa de acierto del diccionario | (búsquedas servidas desde caché) / (búsquedas) | Rendimiento |
| Éxito de carga del paquete de idioma | (cargas de LP sin fallo de firma) / (cargas) | Integridad del contenido |
| Tasa de eventos de carga | (sesiones de carga por bolígrafo por semana) | Patrón de uso |
| Mezcla de gravedad de errores | Distribución de eventos de gravedad 0–3 | Salud |
El panel es gratuito para flotas de más de 5.000 bolígrafos. Por debajo de eso, el coste es de 0,04 $ por bolígrafo al año, facturado mensualmente.
7. Visualización SVG del Pipeline de Telemetría y Mezcla de Métricas
8. Costes
| Servicio | Coste | Notas |
|---|---|---|
| Panel de telemetría alojado (5.000+ bolígrafos) | incluido con el portal OEM | Gratuito |
| Panel de telemetría alojado (<5.000 bolígrafos) | $0.04/pen/year | Facturado mensualmente |
| Sumidero de telemetría autohospedado | 1.800 $/año | Por distribuidor |
| Clase de evento personalizada (por tipo) | $2,400 one-time + $0.06/pen/year | Por socio OEM |
| Soporte de evaluación de impacto de privacidad | 1.200 $ | Por región |
| Certificado de eliminación de datos (RGPD Art. 17) | 0 $ | Autoservicio a través del portal |
Consejo para el comprador: Para implementaciones en la UE de más de 10.000 bolígrafos, solicite un certificado de eliminación de datos de muestra desde el portal antes de firmar el pedido. El certificado es un PDF de 1 página con la marca de tiempo de eliminación y SHA-256 del conjunto de registros borrado.
8. Apéndice: Ejemplo Práctico de Anonimización e Inventario de Clases de Eventos
8.1 Un Ejemplo Práctico de Anonimización
Tome la secuencia de eventos sin procesar a continuación, capturada en un Q8 real en una implementación de escuela saudita. Recorremos cada paso del pipeline de anonimización de 4 etapas.
Sin procesar oid.lookup eventos capturados en el dispositivo (ventana de muestra, 14:00–14:15 local):
14:02:11 oid.lookup serial=QC8-24-118-00472 lat=98ms page=412 word="elefante"
14:03:48 oid.lookup serial=QC8-24-118-00472 lat=104ms page=412 word="camina"
14:05:22 oid.lookup serial=QC8-24-118-00472 lat=88ms page=412 word="lentamente"
14:09:17 oid.lookup serial=QC8-24-118-00472 lat=101ms page=412 word="en"
14:11:46 oid.lookup serial=QC8-24-118-00472 lat=94ms page=412 word="el jardín"
Etapa 1 — eliminar identificadores. El número de serie se reemplaza con una sal rotativa de 128 bits por arranque, luego se aplica hash a un ID de cubo de 32 bits. El ID de cubo 0x4A12F8E1 no puede revertirse al serial sin el salt, y el salt se borra en el siguiente arranque en frío.
Etapa 2 — categorizar valores. Las latencias se redondean a los 10 ms más cercanos. La página se categoriza en CEFR A1 (páginas 1–500), A2 (páginas 501–1,200), B1 (páginas 1,201–2,000).
Etapa 3 — huellas digitales hash. Sin seguimientos de pila en esta ventana.
Etapa 4 — agregar en origen. Los 5 eventos se reducen a un registro.
Resultado: un registro cargado a las 14:15:
{
"fleet_id": "0x4A12F8E1",
"model": "Q8",
"fw": "3.3.1",
"region": "SA",
"window": "2026-09-12T14:15:00Z",
"events": {
"oid_lookup_count": 5,
"oid_lookup_p95_ms": 100,
"cefr_bucket": "A2"
}
}
Esto es lo que ve el panel de flota. No hay forma de volver al hijo, al padre o al bolígrafo específico — el ID del bucket rota en cada arranque.
8.2 Inventario completo de clases de eventos (n = 44)
La taxonomía completa de eventos, agrupada por subsistema y postura predeterminada:
| ID | Evento | Postura | Ventana de agregación | Notas |
|---|---|---|---|---|
| 0x01 | boot.start | TELEMETRY | 15 min | Cuenta arranques en frío |
| 0x02 | boot.end | TELEMETRY | 15 min | Duración del arranque en frío |
| 0x03 | pwr.drain | TELEMETRY | 15 min | Tasa de descarga de batería |
| 0x04 | pwr.charge | TELEMETRY | 15 min | Pico de corriente de carga |
| 0x05 | key.press | LOCAL | n/a | Mapa de botones |
| 0x06 | book.open | LOCAL | n/a | Reanudar posición |
| 0x07 | book.close | LOCAL | n/a | Reanudar posición |
| 0x08 | oid.lookup | TELEMETRY | 15 min | Latencia agrupada |
| 0x09 | oid.miss | TELEMETRY | 15 min | Código no presente en ningún libro cargado |
| 0x0A | acierto de diccionario | TELEMETRÍA | 15 min | Proporción de aciertos de caché |
| 0x0B | fallo de diccionario | TELEMETRÍA | 15 min | Latencia de búsqueda en frío |
| 0x0C | carga de LP | TELEMETRÍA | 15 min | Verificación de firma de LP |
| 0x0D | síntesis de voz | TELEMETRÍA | 15 min | Latencia del primer byte |
| 0x0E | expresión ASR | SOPORTE | por sesión | Solo inclusión opcional |
| 0x0F | resultado ASR | SOPORTE | por sesión | Solo inclusión opcional |
| 0x10 | bloqueo de aplicación | TELEMETRÍA | 15 min | Hash de pila |
| 0x11 | error de aplicación | TELEMETRÍA | 15 min | Severidad 0–3 |
| 0x12 | actualización de firmware | TELEMETRÍA | por versión | preparación OTA |
| 0x13 | retroceso de firmware | TELEMETRÍA | por versión | Recuento de retrocesos |
| 0x14 | actualización de diccionario | TELEMETRÍA | por versión | OTA de diccionario |
| 0x15 | actualización de LP | TELEMETRÍA | por versión | LP OTA |
| 0x16 | wifi.assoc | TELEMETRY | 15 min | Tiempo de autenticación |
| 0x17 | wifi.fail | TELEMETRY | 15 min | Error de autenticación |
| 0x18 | ble.pair | TELEMETRY | 15 min | Confirmación SSP |
| 0x19 | ble.fail | TELEMETRY | 15 min | Error de emparejamiento |
| 0x1A | nfc.read | LOCAL | n/a | Solo UID de etiqueta |
| 0x1B | usbc.plug | LOCAL | n/a | Conteo de inserciones USB-C |
| 0x1C | usbc.pd | TELEMETRY | 15 min | PDO aceptado |
| 0x1D | batt.health | TELEMETRY | daily | Pérdida de capacidad |
| 0x1E | therm.warn | TELEMETRY | 15 min | Térmico PMIC |
| 0x1F | wear.delta | TELEMETRY | daily | Contador de desgaste de memoria flash |
| 0x20 | err.s0 | TELEMETRY | per event | Disparador de parada global |
| 0x21 | err.s1 | TELEMETRY | 15 min | Conteo S1 |
| 0x22 | err.s2 | TELEMETRÍA | 15 min | Recuento S2 |
| 0x23 | err.s3 | TELEMETRÍA | 15 min | Recuento S3 |
| 0x24 | app.locale | LOCAL | n/d | Idioma de interfaz |
| 0x25 | app.theme | LOCAL | n/d | Tema de interfaz |
| 0x26 | voice.clip | COMPATIBILIDAD | por sesión | Solo si se acepta |
| 0x27 | voice.share | COMPATIBILIDAD | por sesión | Solo si se acepta |
| 0x28 | voice.delete | COMPATIBILIDAD | por sesión | Solo si se acepta |
| 0x29 | dict.override | COMPATIBILIDAD | por sesión | Solo si se acepta |
| 0x2A | parent.pin | LOCAL | n/d | Control parental |
| 0x2B | screen.time | LOCAL | n/d | Duración diaria de sesión |
| 0x2C | session.end | TELEMETRÍA | 15 min | Duración de la sesión |
De 44 eventos, 18 son LOCAL, 19 son TELEMETRÍA y 7 son COMPATIBILIDAD. El inventario completo está publicado en el portal OEM bajo la plantilla de evaluación de impacto de privacidad.
10. Visual: Distribución de clases de eventos y presupuesto de ancho de banda
La visualización siguiente combina un gráfico circular de las tres clases de eventos (LOCAL/TELEMETRÍA/COMPATIBILIDAD) con una columna del presupuesto mensual de ancho de banda por lápiz. La cifra de 152 KB es el número contractual público que compartimos con la adquisición escolar.
Lecturas relacionadas
- Protección de datos EU y GDPR del lápiz de lectura
- Lápiz de Lectura COPPA y Control Parental
- Arquitectura en la Nube IoT del Lápiz de Lectura MQTT
- Mecanismo de Actualización de Firmware OTA del Lápiz de Lectura
- Cifrado de Datos del Lápiz de Lectura AES-128 vs AES-256
- Programas OEM de Lápices de Lectura