Newsgroup: it.comp.os.linux.iniziare
Titolo: comando CHAT e piu' modem collegati al PC

Ciao a tutti,
spero di non aver sbagliato NG, ï¿œ una vita (o 2) che non posto piu' e 
all'epoca esisteva 1 solo gruppo.
Ho un problema credo banale al quale perï¿œ non riesco a trovare una 
soluzione.
Ho la necessitï¿œ di dialogare tramite CHAT con un modem seriale per 
inviare dei caratteri AT speciali. e fin qui nessun problema.
Ma sulla box dove devo lavorare ho piu' di un modem collegato. come 
posso settare su quale /dev/ttyS* voglio connettermi? ha chat un file di 
configurazione? usa quello di ppp (e in questo caso dovrei invocare pppd 
pssandogli poi il comando chat con riferimento allo script di comandi)?
grazie
-- 
Sei Niubbo? non sai cosa ï¿œ un Niubbo? Leggi le FAQ!
+ ISP FAQ, KB e articoli: 
http://www.dc-workout.com/kb
+ LOG: 
http://davidec-workout.blogspot.com
 
http://www.dc-workout.com

 come posso settare su quale /dev/ttyS* voglio connettermi?
Se lo scopo � connettersi poi ad internet o comunque instaurare
una sessione PPP, allora segui la via sopraindicata.
Altrimenti se buoi solamente inviare comandi singoli al modem
puoi provare qualcosa del genere:
cat /dev/ttS* 1>&2 & chat -v -t 20 "" $1 \
           </dev/ttS* >/dev/ttS* && read && killall cat
Tempo fa avevo fatto un accrocchio cos�:
#!/bin/bash
#set -x
#       sendexpect.sh
#
# send an AT command to modem,
# expect an answare string or
# exit after timeout seconds
SND=$1
EXP=$2
TMT=$3
LOG=/var/log/sendexpect.sh.log
MODEM=/dev/rfcomm0
IFACE=$(tempfile)
cat $MODEM > $IFACE 1>&2 &
chat -v -t 20 "" $SND <$MODEM >$MODEM
i=0
while ! grep "$EXP" $IFACE; do
   sleep 0.5
	i=$[$i+1]
	[ $i -eq $TMT ] && echo "`date`: timeout $TMT seconds
	reached" >> $LOG && break
done
killall cat > /dev/null 2>&1
rm $IFACE

 
sono un cretino :P
grande, non ci avevo proprio pensato che potevo semplicemente 
ridirezionare xon < >
grazie mille!
-- 
Sei Niubbo? non sai cosa � un Niubbo? Leggi le FAQ!
+ ISP FAQ, KB e articoli: 
http://www.dc-workout.com/kb
+ LOG: 
http://www.dc-workout.com

Il Wed, 13 May 2009 10:05:20 +0000, JohnnyNewbie ha scritto:
ehi, ti � arrivata la mia mail?

 ehi, ti � arrivata la mia mail?
E chi lo s�...spetta v�:
...
yep!  :-D

            </dev/ttS* >/dev/ttS* && read && killall cat
ho provato questo script e qualcosa non mi quadra, credo per ignoranza 
mia nel tradurre la sequenza del comando.
mi puoi dare una mano a capire cosa fa?
allora, cat concatena i file.
prende i dati che arrivano da /dev/ttyS0 (esempio)  sullo standard 
output (1>) poi lo gira allo standard error (1>&2)
la & commerciale prima di chat significa che il cat va fatto in background.
Ora viene lanciato chat (che con le opzioni -v � in modo verbose ma 
lavora nel syslog e non a console) che scrive la variabile $1 
ridirezionandosi sulla ttys e mandando alla ttys stessa il flusso di 
dati (/ < /dev/ttyS > /dev/ttyS.
non so se fino a qui ho capito oppure ho fatto casino. per� quelloc he 
segue && read && killall cat mi � oscuro.
&& � l'AND logico? come nell'if?
read dovrebbe leggere dati e scriverli in un buffer ma senza opzioni che fa?
e poi killall cat dovrebbe uccidere il processo cat lanciato in 
background... ma perch� il doppio && prima e dopo read?
altra cosa, l'output di chat(le stringhe inviate al modem e le risposte 
dello stesso) dovrebbe essere nel syslog giusto?
grazie mille
-- 
Sei Niubbo? non sai cosa � un Niubbo? Leggi le FAQ!


 
Premetto: sarebbe su una riga sola, ma sono andato a capo con la
backslash "\".
Inoltre era uno script bash:
======================= modcom.sh =========================
#!/bin/bash
cat /dev/ttS0 1>&2 & chat -v -t 20 "" $1 \
               </dev/ttS0 >/dev/ttS0 && read && killall cat
===========================================================
Come primo argomento metti il comando che vuoi inviare e lo usi
cos�, per esempio:
modcom.sh ATZ
lui dovrebbe inviare ATZ al modem /dev/ttS0 e mostrarti anche la
risposta...se non ricordo male.
il cat iniziale visualizza ci� che il modem riceve e risponde:
se avessi un file pippo.txt per visualizzarne il contenuto
potresti dare
cat pippo.txt
usandolo sul file speciale del modem ha quell'effetto.
Ma ti bloccherebbe la console, allora o lavori con due terminali
(in uno guardi e nell'altro scrivi), oppure lanci in background
cat.
1>&2 manda lo standard output sullo standard error quindi ci� che
visualizza cat viene spedito in stderr....non ricordo pi� bene,
ma cos� alla fine veniva visualizzato tutto sullo stesso
terminale anche se il cat era in background.
ilflag -v di chat forse pu� essere anche ommesso mentre il -t
serve per il timeout di 20secondi nell'esempio.
la coppia send expect dice: non aspettare nulla ed invia il
comando $1 --> ATZ.
l'expect anche se nullo lo ricevi dal modem "</dev/ttS0" e il
send lo invii al modem ">/Dev/ttS0.
A questo punto se tutto non ha dato errori, "read" cio� aspetta
che l'utente dia invio, quindi sgancia il file speciale del modem
dal cat che lo sta tenendo occupato e fine della storia.
Ora lo provo un attimo....

 dal cat che lo sta tenendo occupato e fine della storia.
fammi capire, read legge l'input dell'utente.
quindi se io non volessi nessun input utente basterebbe rimuovere il 
read e trasformare in:
cat /dev/ttS0 1>&2 & chat -v -t 20 "" $1 \
                </dev/ttS0 >/dev/ttS0 &&  killall cat
?
il cat verrebbe killato appena chat ha finito?
quale � il significato di &&?


 Ora lo provo un attimo....
Ecco a me dice cos�:
===============================================
# modcom.sh ATZ
ATZ
OK
modcom.sh: line 3: 32416 Terminated \
                           cat /dev/rfcomm0 1>&2
================================================
sono andato a capo con la "\"
Per il resto � ci� che mi comare a terminale.
Io uso un cellulare via bluetooth cui viene associato come file
speciale /dev/rfcomm0.
Sembra funzionare a dovere. Infatti mi mostra la stringa inviata
ATZ e quella che mi restituisce: OK.
Omettendo la -v al comando chat ottengo un output leggermente
diverso, ma comunque valido:
============================================================
# cat /dev/rfcomm0 1>&2 & chat -t 20 "" ATZ </dev/rfcomm0  \
                       >/dev/rfcomm0 && read && killall cat
[1] 7029
ATZ
OK
[1]+  Terminated              cat /dev/rfcomm0 1>&2
=============================================================
Probabilmente puoi modificare lo script/comando in modo da
ottenere meglio l'output pi� pulito, che nei miei scopi sarebbe
solo:
ATZ
OK
senza processi in background che vanno a sporcare il terminale.
Poi dipende cosa ti serve.
Saluti  e buon divertimento  :-)

 Saluti  e buon divertimento  :-)
la cosa mi tira scemo :)
uso il tuo stesso identico comando ma nisba il modem non mi risponde.
se provo a usare tip o minicom tutto ok invece...
che tu sappia chat si appoggia a qualche file di configurazione?
che os usi? io sono su una ubuntu 9.04 a fare i test...
grazie mille dell'aiuto ;)
un'altra cosa (un p� fuori dal tema del post, spero non vi incazziate 
troppo :P)
io devo "chattare" con il modem per scaricare dei dati della sim.
quindi dar� gli opportuni comandi poi devo "leggere" l'output.
volevo evitare di fare andare chat su file di report quindi pensavo di 
lavorare a video.
come posso leggere quello che il comando cat+chat mi manda a video?
grep?
oppure ci sono altri metodi piu' semplici?
diciamo che io do un comando come:
AT+GSN
e il modem risponde con:
345958279400279947
(che � l'IMEI)
come faccio a mettere la risposta del modem in una variabile (ovviamente 
sono dentro a uno script)?
mi vengono in mente metodi molto "contorti" (usare l'opzione report di 
chat e poi fare un tail del file e mettere l'output di tail nella 
variabile...)
ma magari ci sono strade piu' "semplici"...


 ma magari ci sono strade piu' "semplici"...
Io uso questo, che ho messo a punto dopo una vecchia discussione 
con JohnnyNewbie (copia fino alla firma esclusa). Nota che se lo 
usi all'interno di uno script, ogni tanto viene fatto un killall 
cat, quindi cat e' da usare con cautela.
Prova e vedi cosa succede.
Se vuoi vedere que pasa, decommenta le righe marchiate con
"#  debug"
---------------------------
#!/bin/bash
#Initialize global vars
tmpfile=.temporaryfile
timeout=10
deviceID=/dev/ttyACM0   # da cambiare al bisogno
function ATcommand
{
#clear output file
echo -n '' > $tmpfile
i=$timeout
out=" "
#prepare command
cmd='AT'$1'\r'
   #redirect all output from modem to tmpfile
   cat  $deviceID > $tmpfile  &
   sleep 0.5
   # echo  -E $cmd >&2 # debug
#send command
chat "" $cmd <$deviceID >$deviceID
#wait answer
cnt=$[$timeout*2]
sleep 0.5 # da tempo alla risposta completa
while [ $cnt -gt 0 ]
   do
   out=`tr -s '\r' '\n' < $tmpfile | tail -n 1 `
#    hexdump -C $tmpfile  >&2 # debug
#    tr -s '\r' '\n' < $tmpfile | hexdump -C  >&2 # debug
   if [ $out ]
     then
     if [ `expr substr $out 1 2` == "OK" ]
       then
       #echo`tr -s '\r' '\n' < $tmpfile | hexdump -C >&2 ` # debug
       echo  `tr -s '\r' '\n' < $tmpfile | tail -n 2 `
       killall cat
       return
       else
         echo $out
         killall cat
	return
       fi
     fi
   sleep 0.5
   cnt=$[$cnt-1]
   done
echo TIMEOUT
killall cat
}
   echo "Reset modem" `ATcommand "Z"`
   echo "Rete: "`ATcommand +COPS?`
   echo "IMEI=     "`ATcommand "+cgsn"`
--
TRu-TS

 quale � il significato di &&?
Capisco i tuoi dubbi, il read forse lo avevo messo per fare i
primi tentativi e assicurarmi che non mi sparisse tutto davanti
al naso, cos� aveva solo la funzione di congelare la mini
sessione chat sul terminale e aspettare un mio <invio> per
concludere il resto delle operazioni.
l'&& � un AND logico: se tutto ci� che mi precede ha ritornato "0",
ovvero nessun problema uccidi il cat liberando il modem e tanti
saluti.
In effetti quel read puoi anche provare a toglierlo, e volendo al
posto del && potresti mettere ";". Non ho provato ma dovrebe
funzionare anche cos�.

 sono dentro a uno script)?
Non saprei neanche io se c'� un modo furbo per farlo, forse un
modo che funziona � questo:
# cat /dev/rfcomm0 2>/dev/null & chat -v -t 20 "" atz \
             </dev/rfcomm0 >/dev/rfcomm0; sleep 5; killall cat
[1] 15358
atz
OK
[1]+  Terminated              cat /dev/rfcomm0 2>/dev/null
stringi stringi l'output a video � questo...
Provando a buttareo lo stdout su un file temporaneo d'appoggio
out.chat daremmo:
# cat /dev/rfcomm0 1>out.chat 2>/dev/null & chat -v -t 20 "" atz  \
                    </dev/rfcomm0 >/dev/rfcomm0; sleep 5; killall cat
[1] 20160
[1]+  Terminated              cat /dev/rfcomm0 >out.chat2>/dev/null
# cat out.chat
atz
OK
Come vedi in out.chat abbiamo la sessione di chatbella pulita,
anche se i comandi inviati e le risposte sono mescolati...
ma mescolati con criterio:
la prima riga corrisponde al comando inviato e non ci interessa.
Quindi se filtriamo cat.out. tagliando la prima riga, otteniamo
solo la risposta del modem. E questo comando lo possiamo dare
come valore ad una variable, del tipo:
# PIPPO=$(cat out.chat | sed 1d)
# echo $PIPPO
OK
Come vedi restituisce in pratica la risposta del modem.
Poi cancelli il file di appoggio e tirando le somme hai nella
variabile PIPPO la rispsota del modem.
Quindi in sintesi facendo tutto dal prompt, poi tu metterai in
uno script...come hai accennato (vado a capo coi "\" come al
solito)
# TEMP=$(tempfile); cat /dev/rfcomm0 1>$TEMP 2>/dev/null & chat  \
   -v -t 20 "" atz </dev/rfcomm0 >/dev/rfcomm0; sleep 5; killall \
   cat; PIPPO=$(sed 1d $TEMP); rm $TEMP; echo $PIPPO
[1] 20979
[1]+  Terminated              cat /dev/rfcomm0 >$TEMP 2>/dev/null
OK
Come gi� hai detto ci saranno metodi pi� furbi, questo �
piuttosto semplice e in certi casi non escludo che potrebbe
essere insufficente magari dando risultati imprevisti.

 essere insufficente magari dando risultati imprevisti.
ti ringrazio :)
-- 
Sei Niubbo? non sai cosa � un Niubbo? Leggi le FAQ!
+ ISP FAQ, KB e articoli: 
http://www.dc-workout.com/kb
+ LOG: 
http://www.dc-workout.com

 pensavo di usare tail no?
Ah... fai te, l'obiettivo � tagliare la prima riga, l'importante
� quello...non sono stato a pensarci troppo su. Ampi quindi sono
i margini di moiglioramento  ;-)

 i margini di moiglioramento  ;-)
ho notato una cosa.
ho un sacco di righe "vuote" nel file di output.
esiste qualche comando con cui posso eliminarle?
e a volte ho come un "eco" (ovvero la risposta compare 2 o + volte). 
Ovviamente faccio il rm del file come prima cosa nel mio script.


 nel mio script.
Potrebbe non essere banalissimo mettere tutto in uno script che
restituisca ci� che ti aspetti. Potrebbero esserci casi molto
diversi tra loro da gestire in modo diverso. Dovresti valutare con
attenzione le risposte del modem e lavorare sul file di output di
conseguenza prima di rimuoverlo...Poi una volta inizializzata la
variabile PIPPO (per far riferimento all'esempio di qualche post
addietro), allora rimuovi il file temporaneo.
Se vuoi postare degli esempi pratici specificando ci� che vuoi
ottenere fai pure.
Saluti  :-)

 addietro), allora rimuovi il file temporaneo.
ovvio si si.
il mio problema non � di tipo "logico" ma di tipo implementativo.
conoscendo poco linux e lo shell scripting mi areno su cose che con un 
p� di c risolverei al volo. solo che, come dicevo prima, per vari motivi 
vorrei fare tutto con scripts.


 vorrei fare tutto con scripts.
Lo scripting bash � un linguaggio penso completo, almeno come
programmazione strutturata, secondo m� � puttosto semplice
soprattutto se si �abituati ad usare la shell per le operazioni
quotidiane....se invece usi di pi� il mouse ti ritrovi con meno
confidenza coi comnandi, che poi sono gli stessi che usi negli
script.
Per cose del genere penso sia conveniente rispetto al c.
Ma parlo uno che ha visto di sfuggita quel linguaggio.