Software per accedere al terminale GSM, inviare e ricevere comandi AT, convalidare i risultati

1

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.

    
posta xmashallax 06.11.2014 - 09:43
fonte

1 risposta

1

I comandi AT generalmente non sono progettati per essere multiplexati su un singolo canale, quindi se hai inviato più richieste senza attendere le risposte, è molto probabile che riceverai le risposte nello stesso ordine con cui hai inviato le richieste (anche se è meglio aspettare semplicemente una risposta finale prima di inviare la richiesta successiva).

Se è possibile che i messaggi non richiesti vengano mescolati con i messaggi di richiesta / risposta, è possibile concatenare i gestori dei messaggi.
In tal caso, per prima cosa si presenta un messaggio ricevuto al gestore della risposta della richiesta non terminata più vecchia. Se il gestore indica che non può elaborare il messaggio, si passa al gestore successivo nella catena (la successiva richiesta non completata più vecchia). Se si è raggiunta la fine della catena di richieste non completate, si presenta il messaggio al / ai gestore / i per i messaggi non richiesti.
Una volta che un gestore indica che ha elaborato il messaggio, interrompi la catena e nessun altro gestore potrà vederlo. Questo impedisce risposte come OK per completare più richieste.
Questo può essere implementato utilizzando il modello Chain of Responsibility , o semplicemente come un ciclo su un elenco ordinato di messaggi gestori.

    
risposta data 06.11.2014 - 12:23
fonte