Pompa di calore Rotex HPSU Compact hack: seconda parte

Pompa di calore Rotex HPSU Compact hack: seconda parte

Probabilmente avete letto il primo articolo che spiegava come interfacciare a basso livello la vostra pompa di calore Rotex HPSU Compact.

E’ venuto ora il momento di capire quali dati transitano sul bus dati della pompa di calore al fine di poterli comprendere ed utilizzare. Materia ostica e noiosa ma fondamentale per poter procedere.

La doverosa premessa e’ che tutto quanto descritto in questo articolo e’ esclusivamente frutto di zanac. Che ha passato ore “sniffando” dati e determinandone empiricamente la semantica (partendo da un semilavorato trovato in un forum tedesco). Inoltre le operazioni di scrittura sul bus non sono ancora state esplorate fino in fondo.

Se pensi di aver trovato un approccio troppo complesso, ti invito a leggere in alternativa fin dove mi sono spinto in termini di ottimizzazione del riscaldamento sulla mia pompa di calore Rotex HPSU Compact con un approccio tradizionale in Pompa di calore Rotex HPSU Compact: curva climatica inversa a 4 scorrimenti.


CAN-Bus

Il Controller Area Network, noto anche come CAN-Bus, è uno standard seriale per bus di campo (principalmente in ambiente automotive), di tipo multicast, introdotto negli anni ottanta dalla Robert Bosch GmbH.

Lo standard CAN, a differenza del procollo TCP/IP utilizzato su internet,  non prevede per i messaggi che transitano un indirizzo del nodo mittente e uno per il nodo destinatario, ma semplicemente l’identificativo del nodo CAN sorgente.

Un messaggio CAN transita infatti su tutto il bus e viene ricevuto da tutti i nodi collegati, e’ compito del singolo nodo gestire, se di interesse, il messaggio.

Questa architettura facilita di molto il lavoro di intercettazione (sniffing) dei dati che transitano: ogni periferica ha la piena visibilità di tutto quanto transita sul bus.… è per questo motivo che risulta facile sniffare comandi: ogni periferica connessa al bus ha piena visibilità di quanto transita nel bus.

diag_canbus2

Non a caso ho riportato uno schema concettuale di un’automobile che utilizza proprio il CAN Bus.

Suggerisco questa lettura: Cosa succede se un hacker prende il controllo di un’auto a distanza.

Formato dati Rotex HPSU Compact

La pompa di calore Rotex HPSU Compact implementa il CAN-bus nella variante 11 bit (base format); lo standard CAN stabilisce che i device debbano tollerare anche la variante a 29 bit (extended) senza andare in errore.

Tralasciando i campi tecnici, un base format è essenzialmente composto da un identificatore di dati (id) e un campo dati che può essere lungo sino a 8 byte (la lunghezza del campo dati è detta DLC):

can-bus-frame_in_base_format_without_stuffbits-svg

Nella pompa di calore Rotex HPSU Compact tutti i campi dati sono da 7 byte e quindi occorre tenerne assolutamente conto quando si spediscono i dati alla macchina.

Nel resto dell’articolo, utilizzeremo la rappresentazione seguente per i numeri:

  • esadecimale: 0x (es. 0xFA)
  • decimale: nessun prefisso (es. 250)
  • primo/secondo semi-byte: minuscolo/MAIUSCOLO (es. 0xfA)

Partiamo da un esempio di un messaggio CAN:

id dati
0x180 0x32 0x10 0xFA 0x01 0xD6 0x01 0x0C

Il campo dati contiene una sequenza di byte con una semantica applicativa ben precisa specifica del sistema che utilizza il bus: vediamo il caso specifico della Rotex HPSU Compact.

Primo byte

  • Il primo semi-byte contiene il nodo CAN di destinazione (da decodificare moltiplicandolo per 0x80)
  • Il secondo semi-byte indica se il messaggio e’ in lettura (1) oppure risposta / scrittura (2); la differenziazione tra risposta e scrittura viene poi fatta mediante il secondo byte

Vediamolo con un paio di esempi concreti:

  • 0x31 ⇒ comando di lettura spedito al nodo CAN 0x180 (0x3 * 0x80)
  • 0x32 ⇒ risposta o scrittura dal nodo CAN 0x180 (0x3 * 0x80)

Secondo byte

  • Lettura: è valorizzato fisso a 0x00
  • Risposta a lettura: vale 0x10 oppure 0x0a (non ancora chiara la differenza)
  • Scrittura: è valorizzato fisso a 0x00 (non ancora verificato se vale per tutti i casi)

Terzo byte

  • Valorizzato a 0xfa: se il comando è di lettura (vedi primo/secondo byte), significa che il parametro applicativo oggetto di lettura e’ codificato nei due byte successivi (4 e 5)
  • Altro valore: il parametro applicativo e’ codificato direttamente nel terzo byte stesso

Prendiamo di nuovo un paio di esempi concreti:

  • 0x31 0x00 0xFA 0x01 0xD6 0x00 0x00 ⇒ comando di lettura al nodo CAN 0x180 del parametro applicativo 0x01 0xd6 (che poi corrisponde a T-GDC)
  • 0x31 0x00 0x0E 0x00 0x00 0x00 0x00 ⇒ comando di lettura al nodo CAN 0x180 del parametro applicativo 0x0E (che poi corrisponde al parametro alla temperatura ACS)



Quarto / quinto byte

  • Lettura “non 0xFA”: 0x00 0x00 (non rilevanti)
  • Risposta “non 0xFA”: contengono il valore applicativo richiesto (con rappresentazione su due byte; sia valori positivi che negativi)
  • Lettura / Risposta / Scrittura “0xFA”: contengono il parametro applicativo oggetto di lettura / risposta (secondo un dizionario predefinito)

Sesto / settimo byte

  • Risposta / Scrittura “0xFA”: contengono il valore applicativo oggetto di risposta o di scrittura

La Stele di Rosetta

697323

Nonostante tutte le meravigliose premesse ed informazioni precedenti, siamo comunque di fronte ad un flusso di informazioni binarie la cui semantica deve essere compresa.

Penso che zanac all’inizio si sia sentito come di fronte alla Stele di Rosetta (mi piace più questa metafora che parlare di reverse engineering).

La stesura del dizionario di transcodifica tra valori binari/esadecimali ed i parametri applicativi, scolpito da qualche parte nel firmware della nostra pompa di calore Rotex HPSU Compact, non e’ comunque tutto, occorre pure scoprire:

  • codifica dei valori applicativi negativi (come la temperatura esterna ad esempio)
  • codifica dei valori applicativi multi-valore (come la modalità corrente di funzionamento)
  • assegnazione degli indirizzi dei nodi CAN che compongono il sistema (Unita’ interna, unita’ esterna, ecc.)



Esempi

Per chiudere con la speranza in una prossima puntata di questa storia, qualche esempio completo di messaggio interpretato:

  • 0x31 0x00 0x16 0x00 0x00 0x00 0x00 ⇒ lettura della temperatura di ritorno
  • 0x32 0x10 0x16 0x00 0xDF 0x00 0x00 ⇒ risposta della temperatura di ritorno con valore 22,3 ºC (“0x00 0xDF” corrispondente a 223 decimale, ovvero 22,3 ºC)
  • 0x61 0x00 0xFA 0x0A 0x0C 0x00 0x00 ⇒ lettura della temperature esterna
  • 0x62 0x10 0xFA 0x0A 0x0C 0xFF 0x69 ⇒ lettura della temperature esterna con valore -11,5 ºC (“0xFF 0x69” corrispondente a -115 decimale, ovvero -11,5 ºC)

Mi raccomando di continuare la lettura della puntata successiva Rotex HPSU Compact hack: terza parte.

Pompa di calore Rotex HPSU Compact hack: seconda parte ultima modifica: 2017-02-02T13:01:32+00:00 da La mia Casa Elettrica
Potrebbe interessarti anche

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *