Nell’albergo della mia ragazza, mi trovo a dover far comunicare un vecchio centralino con il pc della reception (attrezzato con Ubuntu), per poter stampare a video il log delle telefonate e di conseguenza mandare in pensione la vecchia stampante ad aghi.
La connessione avviene tramite /dev/ttyS0, tutti i parametri sono impostati secondo le specifiche fornite dal produttore del centralino (baudrate: 1200, databits: 8, stopbits: 2, parità: none, controllo flusso: hardware) e lanciando la stampa dal centralino, i dati vengono visualizzati regolarmente.
Il problema è che ogni tentativo di loggare in un file quei dati, porta ad un file illeggibile dai normali editor di testo (ho provato con cutecom, minicom, kermit ed anche con “cat /dev/ttyS0 > file.log”).
L’unico modo per visualizzare il contenuto è fare un bel “cat” nel terminale, soluzione non praticabile dal personale di reception.
Credo di essere risalito alla sorgente del problema: ogni riga trasmessa comincia con un carattere 0×18, che corrisponde in ASCII al comando “CANCEL”; le cose che non capisco sono:
- perchè ogni linea comincia con un CANCEL?
- è realmente questo che impedisce a Gedit di aprire il mio log?
- come faccio a “strippare” quel carattere dall’output e mettere solo il testo in un file di testo ?
Ogni consiglio è gradito, anche se prevede l’uso del terminale: al limite faccio uno script automatizzato per i centralinisti, basta che poi possano aprire il log con un editor di testo.
Come premio anticipato, fornisco un bel cartello “area videosorvegliata” in formato SVG rifatto da me sopra a quello ministeriale, dato che quest’ultimo è una .gif troppo piccola per ottenere una stampa decente.


Prova
al max credo che il comando vada modificato con un /g alla fine perche con il sed l’estensione /g permette di effettuare la modifica in ogni occorrenza del file.
dovrebbe andare bene..
la strada è buona, nel senso che mi ha rimosso tutti i ^X, ma se lo apro con vim ci sono ancora in giro dei ^M ed un ^@ proprio all’inizio… ragazzi, non ci capisco nulla di queste cose!
posto una snippet del file in questione per spiegare meglio, più di così non posso perchè ci sono i numeri telefonici:
^@^X ^M
^X
^XADDEBITI TELEFONICI AL 17/02/08 ORE 14:58 CAMERA: 9 ^M
^X
^XDATA ORA NUMERO CHIAMATO DURATA SCATTI IMPORTO^M
questo è più o meno quello che si vede con vim.
sed -e ’s/^.//’ -e ’s/.$//’ | grep -v ‘^$’
Questa dovrebbe rimuovere il primo e l’ultimo carattere e poi le righe rimaste vuote.
macchè, con quel grep alla fine mi restituisce “Il file binario (standard input) corrisponde”, se tolgo il grep spariscono anche i ^M, ma resta sempre quel ^@^X all’inizio che a questo punto dichiaro colpevole a tutti gli effetti!
sed -e ‘1d’ -e ’s/^.//’ -e ’s/.$//’ | grep -v ‘^$’
cancelliamo la prima riga
stefantalpalaru, ti posso solo ringrazia re per la pazienza, ma ancora non ci siamo…
togliendo la parte “grep” da quest’ultimo comando, ottengo che vim non mostra più nessun carattere “strano”, ma gedit continua a rifiutarsi di aprire il file, dicendo che probabilmente è binario.
Se apro il file con Geany, mi dice che probabilmente contiene un byte NULL e lo apre in sola lettura.
Perché non ci fornisci un file con numeri fittizi? Così ci possiamo lavorare liberamente senza irrompere nella privacy di nessuno…
Provare cosi’?
luca@cavalli:~$ hexdump -Cv test.txt
00000000 18 66 69 6c 65 20 64 69 20 70 72 6f 76 61 0d 0a |.file di prova..|
00000010
luca@cavalli:~$ sed -e “s/\x18//g” -e “s/\r//g” test.txt | hexdump -Cv
00000000 66 69 6c 65 20 64 69 20 70 72 6f 76 61 0a |file di prova.|
0000000e
fai un programmino java che riceve la tua stringa e la memorizza in una variabile, chiamiamola “ingresso”. Dopodichè, in java,
int nrCodeUnit=ingresso.length();
int nrCodePoint=ingresso.codePointCount(0, nrCodeUnit);
int contatore=0;
bool flag=false;
while (contatore<nrCodePoint && !flag)
{
if(ingresso.codePointAt(contatore)<32)
{
contatore++;
}
else
{
flag=true;
}
}
ingresso=ingresso.substring(contatore);
adesso salva la stringa “ingresso” risultante e non dovresti avere + problemi.
Facci sapere
Intanto grazie a tutti,
@unwiredbrain: eccoti il file modificato, però non so se salvandolo con vi sia cambiato qualcosa rispetto all’originale… bah, tanto vale provare:
centralino.log
@loopback: forse non ho capito bene qualcosa, ma non è che ottenga granchè di comprensibile con quei comandi…
@Enrico e Antonio (che bello, un commento a quattro mani!): la mia padronanza del java è seconda solo a quella del cinese non semplificato… diciamo che la parte che mi impedisce di provare la vostra soluzione è quel “fai un programmino” all’inizio
solidali con le tue difficolta’ ecco un link che potra’ esserti veramente d’aiuto
http://www.consulentecina.com/100frasi_in_cinese_cc/100frasi_in_cinese.htm
facci sapere.
ok! cercheremo di risolverti il problema entro la giornata di domani.
LOL! mi avete fatto sbellicare, con quel link
Ma io… Vedo degli 055 scendendo verso il basso!
Oops!
ehm… no, sono solo numeri di fantasia… ma sei sicuro di vederli?
ach! mi è scappato che il log era doppio… meno male che i numeri comunque sono tutti “di famiglia”. Adesso li ho tolti
Io la so! Io la so! Io, io, io!
Allora, la soluzione era banale, basta dare tutto in pasto a “strings”
$ cat /dev/ttyS0 | strings > tuo_file.txt
Il comando string leva tutto quello che non e’ stampabile, il carattere 0×00 che c’e’ all’inizio del file, i vari 0×18 all’inizio delle righe, i ritorni a capo alla windows (doppi, \r e \n, tanto per andare sul sicuro), lasciando solo il testo puro e semplice.
Meglio ancora:
$ cat /dev/ttyS0 | strings -n 1 > tuo_file.txt
Altrimenti filtra anche tutte le righe piu’ corte di 4 caratteri.
strings è tuo amico, ugh tardi, bravo loopback
YAY! Funziona!
Grazie a entrambi, il premio lo potete ritirare tutti e due senza litigare
anzi, grazie a tutti quanti!
Ulisse, facciamo che dei 200 caffe’ che ti devo offrire (uno per ogni tua icona che ho nel pc, ho fatto una stima di massima… e non oso nemmeno contare quanti caffe’ devo a Lapo) ne scaliamo 1. Me ne restano solo 199…
uhm… mi sa che mio cugino non dormirebbe per un pezzo
bisogna che trovi il tempo di rimettermi a fare qualche icona, sennò qui perdo la mano!