Attualmente sto implementando un software che utilizza un terminale GSM per eseguire azioni. Le azioni possono inviare messaggi, controllare il saldo, ricevere messaggi di rapporto sullo stato, impostare il pin, ...
La comunicazione tra terminale e programma viene eseguita su una porta seriale. Sto inviando comandi AT (fondamentalmente stringhe) al dispositivo che li esegue e restituisce un messaggio a seconda del comando. Ho un set limitato di circa 20 comandi diversi che devono essere eseguiti e alcuni di essi hanno gli stessi messaggi di ritorno (solo OK
o ERROR
). In attesa di un valore di ritorno è possibile che venga invece restituita una notifica di messaggio in arrivo e che il valore effettivo che il programma è in attesa arrivi in seguito.
Devo considerare che in futuro il terminale GSM sarà facilmente scambiabile. Il set di comandi AT è per lo più standardizzato, ma i valori di ritorno possono differire tra produttori e persino operatori mobili ...
Sto lottando per trovare un buon concetto di design generico. Le attività da eseguire sono le seguenti:
- Controlla se la risposta appartiene al comando inviato
- Verifica se la risposta è valida (il comando ha funzionato o meno)
Il resto del sistema sta funzionando bene (invio e ricezione affidabili, timeout, ritrasmissione in caso di errori, ecc ...), si tratta solo di verificare i valori di ritorno che possono capitare di appartenere a diversi comandi inviati.
Sto usando un sistema di osservazione basato su eventi. Ogni volta che viene ricevuto un valore di ritorno, viene pubblicato su tutti gli abbonati che elaboreranno il risultato. Prima di inviare un comando all'interfaccia seriale, un componente si registra con l'osservatore e si annulla se il suo lavoro è terminato. Ma se ho due abbonati che aspettano un risultato ed entrambi aspettano OK
, diventa complicato.
Al momento sono da solo, quindi apprezzerei molto aiuto e ispirazione qui.