Målgrupp: Den här artikeln vänder sig till integritetsansvariga, IT-arkitekter på skoldistrikt och departement, OEM-partners som integrerar hälsoinstrumentpaneler för flottor samt B2B-importörer som måste kunna besvara frågan "vad rapporterar pennan tillbaka till fabriken?" för köpare i EU, USA, Gulfen och Latinamerika. Den utgår från att du förstår GDPR och COPPA på konceptuell nivå, men vill veta exakt vilka händelseklasser som lämnar B1/B2/F8/K7/KF1/L5/P2/Q6/Q8/T2/Y6-pennorna, vilka som anonymiseras, vilka som är valfria, och vilka som aldrig skickas.
Ett spanskt skolkonsortium som köpte 12 000 pennor frågade vårt compliance-team en mycket precis fråga förra kvartalet: "Enligt GDPR artikel 25 – vilken data lämnar enheten, vilken data stannar kvar på enheten, och kan en förälder välja bort det utan att förlora garantin?" Det ärliga svaret är 23 sidor långt. Det korta svaret, som vi publicerar här, är att telemetrikhändelser är opt-out som standard i EU, opt-in som standard i USA enligt COPPA, opt-in som standard i Saudiarabien enligt SFDA, och alltid av som standard för OEM-självhostade flottor. Nedan följer tekniken bakom dessa policyer.
Den här artikeln behandlar den lokala loggringbufferten, händelseschemat, anonymiseringsflödet, uppladdningsschemat, GDPR/COPPA/PIPL/LGPD-hållningen, de hälsoindikatorer för flottan som instrumentpanelen visar, samt kostnaden för att köra telemetri på 47 000+ pennor i 47 länder.
1. Lokal loggringbuffert på enheten
Varje penna har en 512 KB ringbuffert på användardatapartitionen. Bufferten är endast tilläggsskrivbar, tidsindexerad och överlever en fabriksåterställning endast om föräldern väljer "behåll diagnostikloggar" – vilket är standard vid Enterprise-distributioner och avstängt som standard för butiksförsäljning.
1.1 Buffertparametrar per modell
| Modell | Partition | Buffertstorlek | Händelseposter | Lagringstid (dagar) |
|---|---|---|---|---|
| B1 | User-data NOR | 256 KB | 2 800 | 14 |
| B2 | User-data NOR | 256 KB | 2 800 | 14 |
| F8 | User-data NAND | 512 KB | 5 600 | 21 |
| K7 / KF1 | User-data NAND | 512 KB | 5 600 | 21 |
| L5 | User-data NAND | 1 MB | 11 200 | 30 |
| P2 | User-data NOR | 256 KB | 2 800 | 14 |
| Q6 / Q8 | User-data NAND | 1 MB | 11 200 | 30 |
| T2 / Y6 | User-data NAND | 2 MB | 22 400 | 45 |
Bufferten är dimensionerad för att rymma den mest högvolymshändelseklassen (app.evt) i 14–45 dagar, beroende på modell. Bufferten är ringformad: äldsta händelser skrivs över först.
1.2 Händelseschema
Varje post är en fast 96-byte-struktur med 1 byte typ, 4 byte tidsstämpel, 2 byte schemaversion och 89 byte typspecifik nyttolast.
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]; // reserverat för Ed25519 kort signatur
} __attribute__((packed));
Nyttolasten är typspecifik. En boot.end-händelse bär på en uint32-startduration; en oid.lookup-händelse bär på en uint16-latens och en uint16-ordboksidesbucket; en app.crash-händelse bär på ett 64 byte stort stackfingeravtryck.
2. Händelseklasser
Vi definierar 44 händelseklasser. Inte alla laddas upp. Klassificeringen är LOCAL (laddas aldrig upp), TELEMETRY (laddas upp, anonymiserad) eller SUPPORT (laddas upp endast med uttryckligt samtycke från användaren).
| Klass | Antal | Standardläge | Exempel |
|---|---|---|---|
| Endast lokalt | 18 | LOCAL | key.press, book.open, app.locale |
| Telemetri (anonymiserad) | 19 | TELEMETRY | boot.end, oid.lookup, pwr.drain, fw.update |
| Support (opt-in) | 7 | SUPPORT | voice.clip, asr.utterance, dict.override |
De 18 LOCAL-händelserna finns kvar på enheten och används endast för funktioner i appen, till exempel "återuppta där du slutade." De 19 TELEMETRY-händelserna laddas upp i batcher över Wi-Fi. De 7 SUPPORT-händelserna laddas endast upp när föräldern eller fleet-administratören uttryckligen aktiverar supportläget.
3. Anonymiseringsregler
Varje TELEMETRY-händelse passerar genom en 4-stegs anonymiseringspipeline före uppladdning. Pipelines körs på enheten och verkställs av bootloadern; även en komprometterad applikation kan inte kringgå den.
- Strippa identifierare — Enhetens serienummer ersätts med ett roterande salt per uppstart. Saltet är ett 128-bitars slumpmässigt värde som genereras om vid varje kallstart.
- Bucketsera värden — Latenser avrundas till närmaste 10 ms. Batterinivåer avrundas till närmaste 5%. Ordboksökningar bucketseras in i CEFR-nivåer.
- Hasha fingeravtryck — Stackspår hashas med ett salt per fleet. Saltet roteras varje månad och laddas aldrig upp.
- Aggregera vid källan — Enskilda händelser aggregeras till 15-minutersfönster på enheten. Enheten laddar upp en post per fönster, inte 30 enskilda händelser.
Den aggregerade posten innehåller: fönstrets tidsstämpel, fleet-ID (en 32-bitars hash av OEM-undernyckeln), modell, firmware-version, regionskod samt 6 mätvärdesräknare. Den innehåller inte enhetens serienummer, förälderns namn, barnets namn eller något innehåll som barnet tryckte på.
4. Uppladdningsschema och batchning
Uppladdningar sker endast över Wi-Fi, aldrig över mobilnät (vi inkluderar inget cellulärt modem). Standardschemat är:
| Villkor | Beteende |
|---|---|
| Wi-Fi anslutet, viloläge >5 min | Ladda upp väntande batch |
| Batteri <20% | Skjut upp uppladdning |
| Batteri <10 % | Avbryt uppladdning, behåll batch lokalt |
| Laddare ansluten, valfritt batteri | Ladda upp omedelbart |
| Flottadministratör tvingar uppladdning | Ladda upp nu, oavsett status |
En typisk penna laddar upp 1–3 batchade poster per dag, totalt 18–54 KB. För en flotta på 12 000 pennor under en skolvecka blir uppladdningsvolymen 1,6–4,8 GB per vecka, vilket ryms bekvämt inom en enda företagsbredbandslinje.
5. GDPR / COPPA / PIPL / LGPD-policy
Standardbeteendet för telemetri varierar beroende på jurisdiktion. Fabriken ställer in standarden baserat på bestämmelserna i leveransdestinationen.
| Jurisdiktion | Standardtelemetri | Standardsupport | Opt-out-mekanism |
|---|---|---|---|
| EU (GDPR) | OPT-OUT | AV | Inställningar → Integritet → Telemetri |
| Storbritannien (GDPR + DPA) | OPT-OUT | AV | Inställningar → Integritet → Telemetri |
| USA (COPPA, under 13 år) | OPT-IN | AV | Startguide vid första uppstart |
| USA (13+, delstatliga lagar) | OPT-OUT | AV | Inställningar → Integritet → Telemetri |
| Saudiarabien (SFDA, PTA) | OPT-IN | AV | Startguide vid första uppstart + PTA-portal |
| Förenade Arabemiraten (TDRA) | OPT-IN | AV | Startguide vid första uppstart + TDRA-portal |
| Kina (PIPL) | OPT-IN | AV | Startguide vid första uppstart + PIPL-samtycke |
| Brasilien (LGPD) | OPT-OUT | AV | Inställningar → Integritet → Telemetri |
| Mexiko (LFPDPPP) | OPT-OUT | AV | Inställningar → Integritet → Telemetri |
| Alla andra regioner | OPT-OUT | AV | Inställningar → Integritet → Telemetri |
I varje jurisdiktion kan föräldern eller flottadministratören inaktivera telemetri utan att förlora garantitäckning, utan att förlora tillgång till OTA-uppdateringar och utan att förlora tillgång till support. Den enda funktion som inaktiveras vid opt-out är flottans hälsodashboard, som kräver aggregerad telemetri för att fungera.
6. Dashboard för flottans hälsovetemang
För OEM-partners och stora flottoperatörer exponerar telemetri-dashboarden 9 mätvärden på flottnivå. Inget mätvärde kan brytas ned till en enskild enhets serienummer.
| Mätvärde | Definition | Användning |
|---|---|---|
| Daglig aktivitetstakt | (pennor med ≥1 omstart under 24 h) / ( flottans storlek) | Engagemang |
| Kraschfria sessioner | (sessioner utan ohanterat undantag) / (sessioner) | Stabilitet |
| OID-uppslagning p95 | 95:e percentilen för OID-till-uttal | Prestanda |
| Batterihälsa | Pennor som rapporterar <80 % av ursprunglig kapacitet | Hårdvarans livscykel |
| OTA-antagningsgrad | (pennor med senaste firmware) / (flottans storlek) | Uppdateringstakt |
| Träffkvot för ordbok | (uppslagningar från cache) / (uppslagningar) | Prestanda |
| Lyckad inläsning av språkpaket | (LP-inläsningar utan signaturfel) / (inläsningar) | Innehållsintegritet |
| Laddningshändelsefrekvens | (laddningssessioner per penna per vecka) | Användningsmönster |
| Fördelning av felallvarlighetsgrad | Fördelning av händelser med allvarlighetsgrad 0–3 | Hälsa |
Instrumentpanelen är kostnadsfri för flottor över 5 000 pennor. Under detta är kostnaden 0,04 USD per penna per år, med månadsvis fakturering.
7. SVG-visualisering av telemetripipeline och metrikmix
8. Kostnader
| Tjänst | Kostnad | Anteckningar |
|---|---|---|
| Hostad telemetriinstrumentpanel (5 000+ pennor) | ingår i OEM-portalen | Gratis |
| Hostad telemetriinstrumentpanel (<5 000 pennor) | 0,04 USD/penna/år | Faktureras månadsvis |
| Självhostad telemetrimottagare | 1 800 USD/år | Per distributör |
| Anpassad händelseklass (per typ) | 2 400 USD engångskostnad + 0,06 USD/penna/år | Per OEM-partner |
| Stöd vid konsekvensbedömning avseende integritet | 1 200 USD | Per region |
| Dataderverifieringsintyg (GDPR art. 17) | 0 USD | Självbetjäning via portalen |
Köpartips: För EU-distributioner över 10 000 pennor, begär ett exempel på dataderverifieringsintyg från portalen innan du undertecknar inköpsordern. Intyget är en 1-sidig PDF med raderingstidsstämpeln och SHA-256 för den raderade postmängden.
8. Bilaga: Anonymiseringsexempel och inventering av händelseklasser
8.1 Ett genomgående anonymiseringsexempel
Ta händelsesekvensen nedan, insamlad på en verklig Q8 i en saudisk skoldistribution. Vi följer varje steg i den 4-stegs anonymiseringspipelinen.
Råa oid.lookup händelser insamlade på enheten (exempelfönster, 14:00–14:15 lokal tid):
14:02:11 oid.lookup serial=QC8-24-118-00472 lat=98ms page=412 word="الفيل"
14:03:48 oid.lookup serial=QC8-24-118-00472 lat=104ms page=412 word="يمشي"
14:05:22 oid.lookup serial=QC8-24-118-00472 lat=88ms page=412 word="ببطء"
14:09:17 oid.lookup serial=QC8-24-118-00472 lat=101ms page=412 word="في"
14:11:46 oid.lookup serial=QC8-24-118-00472 lat=94ms page=412 word="الحديقة"
Steg 1 — ta bort identifierare. Serienumret ersätts med ett per uppstart roterande 128-bitars salt, som sedan hashas till ett 32-bitars bucket-ID. Bucket-ID:t 0x4A12F8E1 kan inte härledas tillbaka till serienummer utan salt, och saltet raderas vid nästa kalla uppstart.
Steg 2 — gruppera värden i buckets. Svarstider avrundas till närmaste 10 ms. Sida bucketsätts till CEFR A1 (sidorna 1–500), A2 (sidorna 501–1 200), B1 (sidorna 1 201–2 000).
Steg 3 — hash-fingeravtryck. Inga stackspår i detta fönster.
Steg 4 — aggregera vid källan. De 5 händelserna slås ihop till en post.
Resultat: en post skickas upp klockan 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"
}
}
Detta är vad flottans instrumentpanel ser. Det finns ingen väg tillbaka till barnet, föräldern eller den specifika pennan — bucket-ID:t roterar vid varje uppstart.
8.2 Fullständigt händelseklassregister (n = 44)
Den fullständiga händelsetaxonomin, grupperad efter subsystem och standardläge:
| ID | Händelse | Läge | Aggregeringsfönster | Anteckningar |
|---|---|---|---|---|
| 0x01 | boot.start | TELEMETRY | 15 min | Räknar kalla uppstarter |
| 0x02 | boot.end | TELEMETRY | 15 min | Varaktighet för kall uppstart |
| 0x03 | pwr.drain | TELEMETRY | 15 min | Batteriets urladdningshastighet |
| 0x04 | pwr.charge | TELEMETRY | 15 min | Topp för laddningsström |
| 0x05 | key.press | LOCAL | n/a | Knappkarta |
| 0x06 | book.open | LOCAL | n/a | Återöppningsposition |
| 0x07 | book.close | LOCAL | n/a | Återöppningsposition |
| 0x08 | oid.lookup | TELEMETRY | 15 min | Bucketssatt svarstid |
| 0x09 | oid.miss | TELEMETRY | 15 min | Kod finns inte i någon inläst bok |
| 0x0A | dict.hit | TELEMETRY | 15 min | Cache-träffkvot |
| 0x0B | dict.miss | TELEMETRY | 15 min | Latens för kall uppslagning |
| 0x0C | lp.load | TELEMETRY | 15 min | Verifiering av LP-signatur |
| 0x0D | tts.speak | TELEMETRY | 15 min | Latens för första byte |
| 0x0E | asr.utterance | SUPPORT | per session | Endast opt-in |
| 0x0F | asr.result | SUPPORT | per session | Endast opt-in |
| 0x10 | app.crash | TELEMETRI | 15 min | Stackhash |
| 0x11 | app.err | TELEMETRI | 15 min | Allvarlighetsgrad 0–3 |
| 0x12 | fw.update | TELEMETRI | per release | OTA-mellanlagring |
| 0x13 | fw.rollback | TELEMETRI | per release | Antal återställningar |
| 0x14 | dict.update | TELEMETRI | per release | Dictionary OTA |
| 0x15 | lp.update | TELEMETRI | per release | LP OTA |
| 0x16 | wifi.assoc | TELEMETRY | 15 min | Autentiseringstid |
| 0x17 | wifi.fail | TELEMETRY | 15 min | Autentiseringsfel |
| 0x18 | ble.pair | TELEMETRY | 15 min | SSP-bekräftelse |
| 0x19 | ble.fail | TELEMETRY | 15 min | Parningsfel |
| 0x1A | nfc.read | LOKAL | n/a | Endast tagg-UID |
| 0x1B | usbc.plug | LOKAL | n/a | Antal USB-C-anslutningar |
| 0x1C | usbc.pd | TELEMETRY | 15 min | PDO accepterad |
| 0x1D | batt.health | TELEMETRY | dagligen | Kapacitetsförsämring |
| 0x1E | therm.warn | TELEMETRY | 15 min | PMIC-termisk |
| 0x1F | wear.delta | TELEMETRY | dagligen | Flash-slitageräknare |
| 0x20 | err.s0 | TELEMETRY | per händelse | Global stopp-utlösare |
| 0x21 | err.s1 | TELEMETRY | 15 min | S1-räknare |
| 0x22 | err.s2 | TELEMETRY | 15 min | S2 count |
| 0x23 | err.s3 | TELEMETRY | 15 min | S3 count |
| 0x24 | app.locale | LOCAL | n/a | UI language |
| 0x25 | app.theme | LOCAL | n/a | UI theme |
| 0x26 | voice.clip | SUPPORT | per session | Opt-in only |
| 0x27 | voice.share | SUPPORT | per session | Opt-in only |
| 0x28 | voice.delete | SUPPORT | per session | Opt-in only |
| 0x29 | dict.override | SUPPORT | per session | Opt-in only |
| 0x2A | parent.pin | LOCAL | n/a | Parental control |
| 0x2B | screen.time | LOCAL | n/a | Daily session length |
| 0x2C | session.end | TELEMETRY | 15 min | Session duration |
Av 44 händelser är 18 LOCAL, 19 TELEMETRY och 7 SUPPORT. Hela förteckningen finns publicerad i OEM-portalen under mallen för konsekvensbedömning avseende integritet.
10. Visual: Event Class Distribution and Bandwidth Budget
Visualiseringen nedan kombinerar en cirkeldiagram över de tre händelseklasserna (LOCAL/TELEMETRY/SUPPORT) med ett stapeldiagram över den månatliga bandbreddsbudgeten per penna. Siffran 152 KB är det offentliga avtalsnummer vi delar med skolupphandling.