Newsgroup: it.comp.os.linux.sys
Titolo: equivalente di netcat per la seriale :) ?

ciao a tutti. 
<premessa>
ho un programma in c, scritto da me, che comunica via seriale con alcuni
dispositivi ( contapezzi, bilance, pdc, ecc ), e nel corso del tempo sono
aumentati i protocolli di comunicazione : uno ha il checksum prima di ETX,
uno dopo, uno non ha STX, uno vuole ETX in ricezione ma non te lo mette in
trasmissione, l' altro russa quando dorme... insomma la fase di
elaborazione del messaggio comincia a diventare lunga, e giocare con le
stringhe in c non e' molto divertente.
</premessa>
visto che devo anche introdurre le comunicazioni via udp, ho pensato di
ridisegnare tutto in modo che l' elaborazione sia fatta in perl, le
comunicazioni in rete con netcat, quelle in seriale con ... boh ? potrei
scrivere un qualcosa tipo netcat per seriale, ma se qualcuno conosce
qualcosa di gia fatto mi risparmio un po' di noie. ( programmare la seriale
e' un po' un casino... )
        san google non mi ha aiutato...
        cat < /dev/ttyS0 & echo "domanda" > /dev/ttyS0 non e' bello
TIA
vanja petrovich

 
-- 
Faciait li signeur!
Roy Batty
http://www.regalodautore.it/

 vanja petrovich
Allora ... tempo fa avevo iniziato a scrivere un gateway per SMS, che poi
ho abbandonato per sopraggiunto disaffezionamento a tale progetto nonche'
subentro di altri ca**i.
Ho ritrovato il brandello di codice che pero' devo un po' riadattare alla
tua esigenza. Poi te lo passo, ma prima ti spiego la strategia:
Dato che gli SMS dovevano essere gestiti da portale WEB ho pensato di
usare delle CGI che mandavano datagrammi UDP a un processo che gestiva
la seriale e un socket UDP multiplezando tutto con select(2)
quindi a un input da porta UDP corrispondeva una write (non bloccante e con
recupero dei bytes non trasmessi) su seriale e viceversa.
Tale "proxy" deve anche gestire una coda di messaggi, ma non deve occuparsi
di alcuna gestione di protocollo che doveva essere demandata ai processi
end-to-end.
Forse puoi riciclare tale codice.
in CPAN ho anche trovato il module Setserial per settare velocita', parita'
ecc.. ma non l' ho usato, dato che usavo stty, ma puoi integrarlo tu.
Attenzione che e' concepito per essere full-duplex e per esempio con i
cellulari o modems poteva avere problemi perche' ai comandi AT prima di
dare risposta divenivano sordi alla ricezione.
forse lo puoi riadattare alle tue necessita' o forse ti posso aiutare io.
E' parecchio che ho perso di vista questo codice, ma con un po' di
pazienza lo dovrei rimettere sotto controllo.
quindi il suggerimento e' scrivere un semplice proxy da deputare alle
problematiche di gestione della seriale, gestione del controllo di flusso
code e poco altro. atteno all' ultimo commento nel codice! E' da
completare.
---------------
#!/usr/bin/perl
use strict;
use Socket;
# PRIMA DI LANCIARE QUESTO PROCESSO SETTARE PARAMETRI DELLA SERIALE.
# per settare velocita':
# stty 9600 < /dev/ttyS0
# per vederli:
# stty < /dev/ttyS0
# o anche comando setserial
# ATTENZIONE! la seguente funzione non e' portabile! pathname Linux.
# copiata da perldoc -U perlipc
use POSIX 'setsid';
sub daemonize
{
  chdir '/'                    or die "err chdir()\n";
  open STDIN, '</dev/null'     or die "err open()\n";
  open STDOUT, '>/dev/null'    or die "err open()\n";
  defined(my $pid = fork())    or die "err fork()\n";
  if ($pid)  { exit(); }
  no strict;
  setsid()                     or die "err setsid()\n";
  use strict;
  open STDERR, '>&STDOUT'      or die "err open()\n";
}
# daemonize();
my $err = 0;
my $str = "";
my $instring = "";
my $proto = getprotobyname('udp');
my $port = 9090; # porta UDP per inviare SMS.
my $serialdevice = '/dev/ttyS0';
socket(SOCK, PF_INET, SOCK_DGRAM, $proto) or $err = 1;
if ($err) { print "Errore syscall socket\n"; exit 1;}
setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or $err = 1;
if ($err) { print "Errore syscall setsockopt\n"; exit 1;}
bind(SOCK, sockaddr_in($port, INADDR_ANY)) or $err = 1;
if ($err) { print "Errore syscall bind\n"; exit 1;}
open(SERIAL, "+<$serialdevice");
my $rin = '';
my $trin = '';
my $selectret = 0;
my $smssender = undef();
vec($rin,fileno(SOCK), 1) = 1;
vec($rin,fileno(SERIAL), 1) = 1;
$trin = $rin;
while(1)
{
  if (($selectret = select $trin, undef(), undef(), undef()) > 0)
    {
      # input disponibile
      if (vec($trin,fileno(SERIAL),1))
        {
          # ricevo da seriale.
          sysread SERIAL, $instring, 8192;
        }
      if (vec($trin,fileno(SOCK),1))
        {
          # devo trasmettere un SMS che arriva da datagramma.
          # posso rispondere a $smssender per comunicare l' esito.
          $smssender = recv(SOCK, $str, 8192, 0);
          syswrite SERIAL, $str;
          # ATTENZIONE!!! SCRIVERE UNA SUB WRITE PER RECUPERARE
          # LE SCRITTURE PARZIALI E IN MODO NON BLOCCANTE PER
          # IL CICLO DI SELECT !!!! SE CI SONO DATI IN CANNA DA
          # SCRIVERE SETTARE IL wset di select(2) PER TEST DI
          # POSSIBILE SCRITTURA NON BLOCCANTE .....
          send(SOCK, $str, 0, $smssender);
          # fine trasmissione SMS.
        }
      $trin = $rin;
    }
  else
    {
      # select ritorna valore negativo quindi errore.
      exit 1;
    }
}
----------------
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Roberto C ha scritto:
Scusate... era piu' da it.comp.os.linux..development
ciao


 
Io darei una occhiata a Twisted (un framework asincrono scritto in Python).
Ti semplifica lo sviluppo di moltissimo.
Saluti  Manlio Perillo

 ciao a tutti. 
Una possibile soluzione piu' IT con l' NG:
Tempo fa su una vecchia slack avevo trovato una utility che credo
appartenga al set SysV.
cu
la manpage era immensa. L' unico problema e trovarla.
Ciao


 Roberto.
Ciao,
David
- --
Linux Registered User #334216
Get FireFox! >> 
http://www.spreadfirefox.com/?q=affiliates&id=48183&t=1
Staff >> 
http://www.debianizzati.org
 <<
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.9.20 (GNU/Linux)
Comment: Using GnuPG with Mozilla - 
http://enigmail.mozdev.org
iD8DBQFFFCqD5sXXcRsFI+cRAn0aAKCsR95l6zzxb8Jfkx9HBwkPcblOpQCdGz/s
k4BTQIuSixtyf/D+I1+blJ4=
=DXCm
-----END PGP SIGNATURE-----

 la manpage era immensa. L' unico problema e trovarla.
Fa parte (su slackware) del pacchetto uucp: opera direttamente sulla seriale 
o su qualsiasi altra periferica in base ad una buona e/o specifica 
configuraizone, anche su tcp e avanti di questo passo
-- 
Saluti, Grizzly - 
http://www.g-sr.eu/
  4 anni di weblog, newsgroup ed e-mail condensati (-:
   "Estrazioni dal weblog", gia' ordinabile on-line
 
http://www.lulu.com/g-sr

scrivere un qualcosa tipo netcat per seriale, ma se qualcuno conosce
serproxy
ser2net
telnetcpcd