Newsgroup: it.comp.os.linux.iniziare
Titolo: Script Chat e operazioni condizionali

Ho già postato un post simililesu icols, ma forse non era il ng
più adatto, fatto sta che non avendo ancora ottenuto risposte
provo a mettere qui questo post.
Per connettermi ad internet col cell uso uno script chat molto
semplice:
'' \d
'' 'atz'
OK ' 'at+cgatt=1'
OK 'at+cgdcont=1,"IP","
ibox.tim.it
"'
OK 'atd*99***1#'
CONNECT ''
A prescindere dal fatto che stia partlando di un cellulare o
meno, mi interesserebbe capire come poter introdurre delle
operazioni condizionali in una sessione di comunicazione col
modem.
Mi piacerebbe chiarire il tutto con un esempio semplice,
considerando le seguenti istruzioni:
invia AT+CGATT?
Se la risposta è 1
   invia AT+CGATT=0
 altrimenti
   invia AT+CGATT=1
fine operazione condizionale
Un commento:
sul nokia6230, il comando at+cgatt restituisce (o setta) lo stato
di "registrazione" del cellulare alla rete gprs. Vi mostro una
sessione di comunicazione con minicom (in minuscolo vedete quello
che ho digitato io, in maiuscolo le risposte del modem):
---
at+cgatt?
+CGATT: 0 
OK
at+cgatt=1
OK
at+cgatt?
+CGATT: 1
OK
---
In pratica ho eseguito a mano (quindi valutando con la mia testa
le rispste del modem) le istruzioni descritte prima.
L'obiettivo sarebbe quello di scrivere uno script (di chat, o
anche no, non so..con altri mezzi) in modo da eseguire la serie
di istruzioni sopra descritte, o comunque in generale come
affrontare costrutti condizionali all'interno di una sessione di
comunicazione col modem. Spero di essermi spiegato.
Vi ringrazio in anticipo e spero nelle vostre risposte:
nonostante abbia cercato in rete ecc, non ho trovato risposta
soddisfacente a questo quesito.
A presto

 CONNECT ''
probabilmente dovrò usare kwrite.
Di opensuse 11 non mi privero' comunque.
Grazie ed a presto
Mario

 da te citato:
Certo questo thread non c'entra quasi per nulla con la tua
domanda, si tratta di qualcosa di più tecnico, che tra parentesi
non rieasce a riscuotere risposte "utili" per i miei fini.
Comunque, visto che non ho sonno... e che insisti così... ;-)
Allora, intanto kppp, buon programma, ma non ricordo più come
funziona nello specifico, anche se anni fa su fedora 4, l'avevo
configurato proprio per il cellulare e aveva funzionato.
Detto questo visto che chiedi, ti posso spiegare come configurare
la connessione sotto una distribuzione linux. Dovrebbe funzionare
praticamentecon tutte.
Serve il programma chat per inizializzare il modem attraverso uno
script chat appunto.
Poi serve il demone pppd per stabilire la sessione PPP col server
remoto del tuo ISP.
Entrambi dovrebbero essere nel pacchetto ppp, in ogni caso
un'installazione "normale" della tua distribuzione ti dovrebbe
garantire la loro presenza.
Devi scrivere in pratica dei file di testo (degli scripts).
Quindi ti serve un editor di testo, non importa quale sia, va
bene il notepad, kwrite, gedit, emacs o vim. Usa un po' quello
che ti pare. Io mi trovo bene con vim, ma non importa.
Devi lavorare come sperutente "root".
Questo significa che devi lanciare i tool che utilizzi come root:
quindi apri un terminale, fai il login come root, per esempio
su -
password <immetti password di root e dai invio>
Adesso in quel terminale sei root e lanci il tuo editor
preferito, in questo modo puoi editare e salvare files di testo
anche in directory in cui il comune utente non potrebbe.
Veniamo ai files. Il primo chiamalo per esempio "gprs.chat" e
salvalo in /etc/ppp/
È quello sopra:
'' \d
'' 'atz'
OK 'at+cgatt=1'
OK 'at+cgdcont=1,"IP","
ibox.tim.it
"'
OK 'atd*99***1#'
CONNECT ''
Allora, vuoi la spiegazione pedante?
Dunque, si tratta si uno script "send/expect" che in soldoni
significa che aspetta qualcosa dal modem e quando lo riceve invia
al modem qualcos'altro.
Lo script su ciascuna riga ha una coppia di stringhe del tipo
expect send
ovvero
aspetta invia
funziona così:
aspetta niente e invia \d (un secondo di pausa, man chat per i
dettagli)
aspetta niente e invia atz (comando di reset del modem)
aspetta l'OK (ovver l'invio precedente ha avuto successo) e invia
ay+cgatt=1 (comando di regisstrazione alla rete gprs: funxiona
per il mio nokia, dovrebbe funzionare anche per glialtri device
ma la certezza non la ho, in ogni caso non è detto che sia
necessario, potrebbe essere sufficente attivare dal telefono la
connettività alla rete gprs/umts).
Aspetta nuovamente l'OK e invia la stringa di inizializzazione
modem per definire l'apn (punto d'accesso) fornito dal tuo ISP.
Quello sopra va bene per Tim (dipende comunque dalla offerta che
hai sottoscritto), sul sito Tim dovrebbe essere spiegato.
Aspetta OK e invia atd*99***1# (è la stringa di chiamata: il
modem lo abbiamo inizializzato, ora non resta che comporre il
numero dell'isp, ovviamente nel caso di gprs non si tratta di un
numero, ma di un comando penso, comunque è quello sopra).
Infine aspetta il responso del isp CONNECT e invia "niente".
Ok il primo script è andato.
Ora vediamo il secondo: chiamalo per esempio gprs e salvalo in
/etc/ppp/peers/
Anche questo va editato come root.
/dev/ttyACM0 57600
connect '/usr/sbin/chat -v -f /etc/ppp/gprs.chat'
noauth
defaultroute
debug
Lo script viene dato in pasto al demone pppd e la sintassi è
reperibile dal man pppd. Riga per riga:
1. definisci il filespeciale da utilizzare ovvero il nostro modem
cosìcome viene riconosciuto dai driver che vengono usati, nel mio
caso sto usando i cdc-acm che creano all'inserimento del cavo usb
del cell un file speciale chiamato appunto /dev/ttyACM0. Potrebbe
non essere così, dipende dal telefono o da configurazioni ad hoc
dei moduli (cioè potresti foezare altri driver a controllare il
device invece dei cdc-acm, tipo usbserial o airprime, questi
creano un file dispositivo che avrà un nome differente per
esempio /dev/tts/USB0 va bè, se non ricordo male anche a te
veniva riconosciuto come /dev//ttyACM0, quindi lascia perdere e
copia pure).
Poi sulla stessa riga viene definita la velocità di comunicazione
PC-cell, non è la velocità di connessione alla rete, si chiama
"baud" (cerca con google per maggiori dettagli), puoi mettere il
valore che più ti aggrada tra i seguenti:
57600
115200
230400
460800
921600
Spero di non averne sbagliato, non sono sicurissimo del'ultimo,
ma sono dettagli questi, irrilevanti al fine della riuscita della
connessione.
2. la seconda riga dice a pppd di instaurare la connessione
all'isp, servendosi di uno script da iterpretare con un
particolare programma (nel nostro caso "chat"). Nota che questo
script, deve essere esattamente lo script di chat che abbiamo
creato prima quindi il nome e il percorso di quello script
devono essere coincidenticol nome e percorso dello script di
peima:
se lo avessi chiamato /etc/ppp/pippo.chat ka seconda riga di
questo file sarebbe:
connect '/usr/sbin/chat -v -f /etc/ppp/pippo.chat'
Penso di essere stato chiaro.
3. noauth non è indispensabile funziona anche senza
4. defaultroute invece è importante: senza questo potresti avere
problemi, nel senso che riusviresti a connetterti, ma non a
navigare e neanche ad eseguire neanche un ping ad un ip numerico.
in pratica i pacchetti di comunicazione, non saprebbero
attraverso che cosa essere sparati in rete, invece questo comando
dice a pppd di creare un instradamento predefinito dei pacchetti
attraverso l'interfaccia ppp0 che verrà messa in piedi da pppd
stesso. Non è precisamente così, ma il succo è quello
5. la quinta riga, serve per avere più info in caso qualcosa
andasse storto, non è indispensabile.
Ok ora salva.
.......
Bene. E ora come ci si connette?
Facile.
Dal solito terminale, sempre loggato come root lancia:
pppd call gprs
essendo "gprs" il nome dello script di pppd presente in
/etc/ppp/peers.
.......
Verifica:
sempre dal terminale lancia (questo anche come semplice utente):
ping -c 5 88.149.128.3
ovvero eseguiamo un ping verso l'indirizzo ip numerico del server
maya.ngi.it
 (usato solitamente per avere un'idea della latenza
della propria connessione, ma questa è un'altra storia).
Ecco cosa dovresti ottenere:
PING 88.149.128.3 (88.149.128.3) 56(84) bytes of data.
64 bytes from 
88.149.128.3
: icmp_seq=1 ttl=52 time=485 ms
64 bytes from 
88.149.128.3
: icmp_seq=2 ttl=52 time=521 ms
64 bytes from 
88.149.128.3
: icmp_seq=3 ttl=52 time=465 ms
64 bytes from 
88.149.128.3
: icmp_seq=4 ttl=52 time=484 ms
64 bytes from 
88.149.128.3
: icmp_seq=5 ttl=52 time=504 ms
........
Ora sei connesso correttamente in rete. Acnora due osservazioni:
1. Se qualcosa va storto, dove guardare gli errori (eventualmente
da postare in una discussione più consona di questa)???
il file /var/log/messages riporta la sessione pppd/chat di
connessione. È un file accessibile da root, puoi
visualizzarlo anche dal solito terminale loggato sempre come
root con less per esempio:
less /var/log/messages
ogni riga del file inizia con data e ora per cui non ti ci
dovresti perdere e se ci fai attenzione dovressti riconoscere la
sessione di pppd/chat indagata.
2. Se la varifica riesce ma non navighi, la connessione non
centra, dovrebbe invece trattarsi di un problema ai dns.
In tal caso devi mettere nel file /etc/resolv.conf l'indirizzi
numerici dei server dns che preferisci. Qualli di opendns sono
una buona scelta. Eventualmente apri un topic ad hoc non prima di
aver cercato in google o letto il:
man resolv.conf
.......
Direi che questo è quanto.
La lunghezza del post è rilevante, pernso d'esserestato
abbastanza pedante e spero che chi avrà a che fare con gingilli
del genere per connettersi, si prenderò la briga di usare la
funzione cerca di google gruppi prima di chiedere nuovamente.
Se hai problemi particolari non rispondere in questo thread, che
non c'entra. Aprine uno nuovo ad hoc con un titolo appropriato e
vedrai che arriveranno preziosi suggerimenti.
Saluti  :-)

 comunicazione col modem. Spero di essermi spiegato.
Ho adottato una potenziale soluzione creando un file accessorio
in cui viene riversata la comunicazione modem-sistema.
Su quel file opero con strumenti come grep, per verificare ciò
che risponde il modem.
La comunicazione modem sistema la faccio però attraverso chat,
direttamente, senza pppd.
Quindi le "decisioni" vengono affidate ad uno script chat, ve ne
posto alcune righe cruciali:
===
LOG=/home/johnnynewbiw/chat.prove/log
cat /dev/ttyACM0 > $LOG 2>&1&
===
Queste due righe definiscono un file di log in cui scrivere e da
cui leggere ciò che viene inviato e ricevuto al/dal modem.
Il device in questione viene associato a /dev/ttyACM0. Eseguendo
cat au quest'ultimo, abbiamo un terminale capace di farci vedere
cosa riceve il modem e cosa risponde. L'idea è stata
semplicemente quella di riversare tutto ciò su un file di testo e
quindi valutare con grep il responso di alcuni comandi, per poi
svolgere un operazione piuttosto che un'altra...
===
echo > $LOG
chat -v -t 10 "" 'AT+CGATT?' > /dev/ttyACM0 < /dev/ttyACM0
sleep 2
while ! grep '+CGATT: 1' $LOG; do
   sleep 5
   echo > $LOG
   chat -v -t 10 "" 'AT+CGATT=1' > /dev/ttyACM0 < /dev/ttyACM0
   sleep 2
   echo > $LOG
   chat -v -t 10 "" 'AT+CGATT?' > /dev/ttyACM0 < /dev/ttyACM0
   sleep 2
done
===
In pratica i comandi al modem li do con "chat -v -t 10 $expect
$send > /dev/ttyACM0 < /dev/tty/ACM0
Come si vede viene anche ricevuto oltre che inviato sempre dallo
stesso device attraverso gli operatori di redirezione "<" e ">".
La parte sopra, descrive il seguente ragionamento.
.verifica com'è lo stato di registrazione alla rete gprs
(at+cgatt?)
.finchè non riscontri che il device è registrato alla rete gprs
- registralo (at+cgatt=1)
Ad ogni comando eseguito verso il modem, il file di $LOG viene
ripulito con "echo > $LOG" dopo averne valutato il contenuto con
un "semplice" grep.
Questo per assicurarci che in $LOG vi sia solo il contenuto
dell'ultimo comando dato. Per il resto il tutto è condito con
qualche sleep cautelativo niente di complesso insomma...  ;-)
Volendo ho notato che si riesce anche a connettersi, basta che
prima del comando di chiamata ci si "stacchi" dal device
eseguendo il kill del comando cat cui è agganciato /dev/ttyACM0.
Una volta inviato il comando di chiamata, si passa la palla a
pppd:
=====
echo > $LOG
killall cat
sleep 5
chat -v -t 10 "" ATD*99***1# > /dev/ttyACM0 < /dev/ttyACM0
sleep 2
pppd /dev/ttyACM0 57600 defaultroute
=====
Questo è un'altro modo per stabilire la connessione ad internet,
senza ricorrere ad uno script specifico per pppd.
Note: chiaramente la comuicazione pc-cell deve essere apposto
altrimenti, non ci si capisce più nulla. Per assicurarsene ho
notato che può essere conveniente scaricare e ricaricare il
modulo che controlla il device e anche quello che ha in mano il
controller usb, nel mio caso ohci_hcd.
Infine, una cosa curiosa:
i comandi AT inviati attraverso chat mi funzionano solo con una
sola coppia alla volta di "EXPECT SEND".
se per esempio mettessi
chat -v -t 10 "expect1" "send1" "expect2" "send2" > device < device
la seconda coppia non mi compare sul terminale che sto tenedo
agganciato con cat. Non so se mi sono spiegato.
Non è un problema, anche perchè ad ogni invio preferisco
verificare dallo script bash cosa accade, ma avendo seguito come
guida il "ppp over minicom howto":
http://www.docmirror.net/it/linux/howto/misc/PPP-over-Minicom/
asd un certo punto dice:
if (chat -v -t 5 "" ATZ "" \\d "" ATZ OK "" > /dev/ttyS$i <
/dev/ttyS$i)
Da lì m'è "venuta" l'idea, ma quelle tre coppie send expect, non
c'è stato verso che venissero regolarmente scritte nel mio file
di log.