Come abbiamo liberato i dati di un braccialetto cinese - uomo + AI, a quattro mani
Un braccialetto da pochi euro misura il tuo cuore, il tuo sangue, il tuo sonno. Poi però quei dati li tiene in ostaggio dentro la sua app. Questa è la storia di come ce li siamo ripresi - e di come, lavorando in coppia con un'intelligenza artificiale, abbiamo trasformato un giocattolo chiuso in un sistema aperto, nostro, modificabile a piacere.
Compri un braccialetto. Lo indossi. Lui misura cose intime: quante volte batte il tuo cuore, quanto ossigeno hai nel sangue, com'è la tua pressione, come dormi, quanto sei stressato.
Poi apri l'app ufficiale e... i dati sono lì dentro. In una scatola chiusa. Niente esportazione seria, niente accesso al "grezzo", spesso un passaggio dal cloud del produttore. Vuoi farci un grafico tuo? Incrociarli con altro? Tenerli per dieci anni? Costruirci un allarme personalizzato? Non puoi. I dati che racconta il tuo corpo non li governi tu, li governa un'app.
A noi questa cosa dà fastidio. E quando una cosa ti dà fastidio e sei un po' smanettone, la smonti.
Obiettivo dichiarato fin dall'inizio:
Bypassare l'app QWatch Pro e avere i dati puliti in un nostro database, dove possiamo farne quello che vogliamo.
Niente cloud altrui, niente formati chiusi. Una tabella in un database che controlliamo noi, e una pagina che li disegna. Sembra semplice. Per arrivarci, però, bisogna prima capire come parla il braccialetto. E lì comincia il divertimento.
L'istinto dice: "è collegato via USB, leggiamo l'USB". Sbagliato.
Quando abbiamo guardato cosa vede il computer sulla porta USB, la risposta è stata: niente. Nessun dispositivo dati, nessuna porta seriale. Il cavo USB di questi braccialetti serve solo alla ricarica (a volte sono addirittura solo due piedini di alimentazione).
🔍 Per i profani: è come una lampada da tavolo. Il cavo le dà corrente, ma non ci "parli" attraverso il cavo. Il braccialetto chiacchiera in un altro modo.
Quell'altro modo è il Bluetooth Low Energy (BLE): la stessa tecnologia degli auricolari, dei sensori smart, delle serrature elettroniche. È via BLE che l'app QWatch Pro legge tutto. Quindi il piano cambia: non dobbiamo "leggere l'USB", dobbiamo diventare noi l'app, parlando BLE al posto suo.
In BLE ogni dispositivo espone una specie di "menù" di funzioni, chiamato GATT: un elenco di servizi, ognuno con dei caratteri (characteristics) che si possono leggere, scrivere o "ascoltare" (notifiche).
Facendo una scansione BLE dal computer, il braccialetto è saltato fuori subito: un nome corto, un segnale fortissimo (era a pochi centimetri) e un servizio rivelatore, lo 0xFEE7, tipico dei braccialetti-salute cinesi.
Connessi al dispositivo, il suo "menù" GATT ci ha mostrato la cosa più importante: un servizio chiamato Nordic UART Service:
Service 6E40FFF0-B5A3-F393-E0A9-E50E24DCCA9E (Nordic UART) Char 6E400002-... [scrittura] -> noi scriviamo COMANDI qui Char 6E400003-... [notifiche] <- il braccialetto risponde qui
🔍 Per i profani: immagina due tubi. In uno noi infiliamo bigliettini con domande ("dimmi il battito"), dall'altro escono i bigliettini con le risposte. Il difficile non è infilare i bigliettini: è capire in che lingua sono scritti.
Dal "biglietto da visita" del dispositivo abbiamo anche letto chi è: hardware H59, chip Nordic nRF52832. Un modello generico, venduto sotto mille marche diverse, tutte servite dalla stessa app QWatch Pro (di un fornitore cinese, QC Wireless).
Appena connessi, il braccialetto ha sputato fuori il primo "bigliettino":
73 0c 09 01 00 00 00 00 00 00 00 00 00 00 00 89
Sedici numeri. A prima vista, rumore. In realtà, una struttura precisa. La chiave l'abbiamo trovata sull'ultimo byte:
0x73 + 0x0c + 0x09 + 0x01 = 137 = 0x89
L'ultimo byte è la somma di tutti gli altri (un checksum, il controllo che il messaggio non sia corrotto). Da lì, tutto il protocollo si è rivelato:
byte 0 1 ............... 14 15 COMANDO dati (payload) CHECKSUM frame fisso da 16 byte checksum = (somma dei primi 15) AND 0xFF
Questo schema - frame da 16 byte, primo byte = comando, ultimo = checksum a somma - è la firma di una famiglia di firmware diffusissima (la stessa dei celebri anelli smart "Colmi"). Riconoscerla è stato l'aggancio decisivo: di colpo non eravamo più davanti a un dispositivo ignoto, ma a un dialetto di una lingua conosciuta.
🔍 Per i profani: è come ricevere lettere in una lingua sconosciuta e accorgersi che ogni lettera finisce sempre con un numero uguale alla somma delle parole. Capito il trucco, inizi a tradurre.
Il comando per le misure "al volo" è il numero 105. Gli si dice cosa misurare con un secondo byte:
| Tipo | Codice |
|---|---|
| Battito | 1 |
| Pressione | 2 |
| Ossigenazione (SpO2) | 3 |
| Stress | 8 |
| HRV (variabilità cardiaca) | 10 |
Il braccialetto risponde con un flusso di pacchetti. Il punto delicato è in quale byte si trova il valore buono. Non c'era documentazione: l'abbiamo ricavato osservando i byte reali mentre indossavamo il dispositivo.
Esempio, la pressione mentre la misura "si aggancia":
69 02 00 | 42 | 7d | 4c | 7e 03 ... 66 125 76 batt SIST DIAST
Cioè 125/76: una pressione vera, plausibile, identica a quella che mostra l'app. Con la stessa logica abbiamo decodificato battito (es. 66 bpm), SpO2 (es. 98%), stress (es. 42). Bypass completo: gli stessi numeri dell'app, ma letti da noi.
Le misure istantanee erano fatte. Restava lo storico: la curva del battito delle 24 ore, il sonno, i passi. Lì i comandi "indovinati" non bastavano più. Serviva la verità assoluta: vedere esattamente cosa si dicono l'app e il braccialetto.
Tecnica classica del reverse engineering BLE: l'HCI snoop log di Android.
🔍 Per i profani: è come mettere un registratore sul filo del telefono. Apri l'app, la usi normalmente, e nel frattempo registri ogni singola parola che si scambiano app e braccialetto. Poi te le riascolti con calma.
Procedura, in tre mosse:
Risultato: la mappa completa dei comandi. Filtrando solo i pacchetti del braccialetto, ne è uscito il vocabolario intero. Ecco i comandi dello storico:
| Dato | Comando |
|---|---|
| Battito storico (5 min) | 21 |
| Passi / calorie / distanza (15 min) | 67 |
| Riepilogo del giorno | 72 |
| Pressione | 20 |
| Stress | 55 |
| HRV | 57 |
E la regola per chiederli: [comando, indice_del_giorno] (0 = oggi, 1 = ieri...), con risposta a più pacchetti incatenati. Da "tentativi alla cieca" eravamo passati a leggere la risposta giusta.
C'è un comando, il numero 1, che imposta l'orologio interno. Nella sua risposta, il braccialetto allega una mappa delle proprie capacità: una sequenza di bit che dichiara cosa sa fare davvero. Decodificandola abbiamo scoperto verità che il marketing non racconta:
E una distinzione fondamentale, emersa dai test:
Bonus: abbiamo anche attivato il log automatico del battito 24/7, così il dispositivo accumula la curva da solo, e a ogni sincronizzazione ce la prendiamo.
🔍 Per i profani: alcune cose il braccialetto se le scrive in un diario (e il diario glielo possiamo sfogliare); altre le sa dire solo se gliele chiedi in quel preciso istante. Bello sapere la differenza: te lo dice il dispositivo stesso, basta saperglielo chiedere.
Capito il protocollo, l'abbiamo trasformato in un prodotto vero, battezzato LudoHealt. Architettura semplice e robusta:
Braccialetto (Bluetooth) Collettore (Python) Database MySQL H59 scarica storico "ludohealt" + misure on-demand Dashboard web (PHP + grafici) il telefono la apre nel browser
I pezzi:
Un dettaglio elegante: le misure ottiche (battito, SpO2) a volte non "agganciano" subito perché il sensore vuole pelle e immobilità. Per non lasciare mai vuota la scheda del battito, la dashboard usa un fallback intelligente: se la misura istantanea salta, mostra comunque l'ultimo valore dal log 24/7. Piccole attenzioni che fanno la differenza tra un esperimento e un prodotto.
Tutto il codice di LudoHealt - il collettore Python, lo schema del database e la dashboard web - è open source e pubblicato su GitHub. Chiunque può scaricarlo, studiarlo, adattarlo al proprio braccialetto e contribuire con miglioramenti. Niente scatole chiuse, nemmeno per il nostro stesso strumento.
Guarda la repo qui: https://github.com/LudovicoPiccolo/OpenH59
Qui sta il punto che ci rende, diciamolo, fieri.
Questo progetto non l'ha fatto "un'AI da sola", né "un umano da solo". È nato da un dialogo:
Da soli, ognuno dei due si sarebbe arenato. L'umano senza l'AI avrebbe perso giorni a fissare byte esadecimali; l'AI senza l'umano non avrebbe mai saputo che "il braccialetto era stato tolto per un mese". Insieme, in una sera, abbiamo aperto una scatola chiusa.
Non è "l'AI che sostituisce l'uomo". È l'uomo che, con l'AI, fa in poche ore quello che prima richiedeva un team e settimane. È una leva, non un rimpiazzo. E usarla bene è la nuova competenza.
Lo diciamo chiaro: qui non si è "bucato" niente di nessun altro.
Questo è reverse engineering per interoperabilità e proprietà del dato personale: legittimo, sano, e per molti versi un atto di igiene digitale. La vera domanda non è "perché lo hanno fatto?", ma "perché dovrebbe essere difficile accedere ai dati del proprio corpo?".
Avere i dati grezzi, nostri ed editabili, sblocca tutto:
Un braccialetto da quattro soldi, un'app che faceva da muro, una serata di lavoro a quattro mani con un'intelligenza artificiale. Risultato: il muro non c'è più. I dati del nostro corpo sono liberi, leggibili, nostri.
La tecnologia che indossiamo dovrebbe lavorare per noi, non tenerci alla porta. Stavolta l'abbiamo convinta a collaborare. E la cosa più interessante non è il braccialetto: è il metodo. Curiosità umana + potenza di calcolo dell'AI = la capacità di aprire, capire e ricostruire quasi qualsiasi cosa.
La prossima scatola chiusa è avvisata.
Hack the Watch - diario di un pomeriggio in cui un umano e un'AI hanno smontato un braccialetto e rimesso al loro posto i dati: nelle mani di chi li produce, cioè noi.
Mentre leggi questo articolo, qualcuno nel tuo settore sta automatizzando processi,
conquistando clienti online e tagliando i costi.
Ogni giorno che aspetti è un vantaggio regalato alla concorrenza.
Consulenza gratuita • Risposta entro poche ore