Come supportare più versioni del firmware?

0

Sto lavorando a un'app che parla con un dispositivo bluetooth a basso consumo energetico (BLE) e scambia dati personalizzati con esso. Il nostro team ha definito i modelli di dati e c'è un metodo che analizzerà il carico utile dei dati e assegnerà i valori alle caratteristiche corrispondenti. Funziona perfettamente finché non abbiamo introdotto un nuovo firmware.

In questo nuovo firmware alcuni valori nel payload dei dati sono stati ridefiniti o l'offset di un valore specifico è stato modificato. Quindi il metodo di analisi dovrà essere aggiornato / riscritto in base alla nuova definizione del payload. Poi arriva il problema: entrambe le versioni del firmware devono essere supportate! Naturalmente potrei scrivere un sacco di if / else nel metodo di analisi in questo momento, ma cosa accadrebbe se altri 3 aggiornamenti del firmware arrivassero uno dopo l'altro? Posso immaginare che il codice diventerà difficile da leggere e perdere la sua semplicità.

Mi chiedo se esiste un modo elegante per gestire la coesistenza delle versioni del firmware. Forse uno schema di progettazione che può essere adottato qui?

Per renderlo più specifico:

Nella mia classe modello Temperature ho le seguenti proprietà:

@property (nonatomic, readonly) float temp_outside;
@property (nonatomic, readonly) float temp_inside;

La libreria deve supportare 3 diverse versioni del firmware:

  • V1 supporta solo temp_outside
  • V2 supporta temp_outside e temp_inside
  • V3 supporta temp_outside e temp_inside , ma temp_inside deve essere ottenuto in modo diverso rispetto a V1 & V2

Supponendo che il firmware fornisca le proprie informazioni entro manufacturer data delle inserzioni come dati non elaborati:

  • Firmware V1: 00 42 0a
    • (byte 1: sw id, byte 2: id del protocollo, byte 3: temp_outside)
  • Firmware V2: 00 43 0a 10
    • (byte 1: id id, byte 2: id protocollo, byte 3: temp_outside, byte 4: temp_inside)
  • firmware V3: 00 44 10 0a
    • (byte 1: sw id, byte 2: id del protocollo, byte 3: temp_inside, byte 4: temp_outside)

Qual è il modo migliore per implementarlo? Ci sono diversi aspetti da considerare:

  1. Il modello ha valori che potrebbero non essere riempiti da un firmware specifico; dovrei avere modelli separati per firmware o come posso assicurarmi che solo le proprietà supportate saranno accessibili?

  2. Il metodo responsabile per analizzare i byte nel modello deve supportare tutti i firmware. Dovrebbe esserci un metodo / parser con diverse condizioni basate sull'ID del protocollo o su più classi di parser?

  3. L'uso della libreria all'interno dei controller di visualizzazione dovrebbe essere il più comodo possibile.

posta cweinberger 28.06.2014 - 14:07
fonte

1 risposta

1

Il tuo problema non è tanto che devi supportare diverse versioni del firmware, ma piuttosto che tutte queste versioni firmware utilizzano protocolli leggermente diversi per comunicare.

Se hai qualche influenza sul protocollo usato dal firmware del dispositivo, dovresti mirare a un protocollo che sia compatibile sia con le versioni precedenti sia con quelle successive, in modo che un nuovo mittente possa comunicare con un ricevitore più vecchio e viceversa.

Per le versioni di protocollo che già possiedi, puoi utilizzare il modello di strategia , in cui hai un parser per ogni versione del protocollo come strategia e si seleziona il parser corretto in base ai campi di identificazione in ciascun messaggio (o nel primo messaggio).

All'interno delle classi del modello (e delle tue viste), devi pianificare la possibilità che non tutte le proprietà siano garantite come disponibili. I due modi per gestire questo è di avere una proprietà / metodo booleano secondario per ogni proprietà per indicare se il valore è disponibile, o per usare un valore di indicatore speciale, fuori dai limiti per indicare che il valore non è disponibile.

    
risposta data 28.06.2014 - 17:42
fonte

Leggi altre domande sui tag