Hallo Leute!
Ich habe mit einem Arduino einen Temperaturmessgerät gebaut. Das funktioniert auch gut, nun will ich das machen, dass die Daten ins Nagios einfliessen.
Nun, da das Arduino auch anderes macht, um die Temperatur zu lesen muss man ein Befehl (die Buchstabe "T") senden, dann wird das Programm mit der Temperatur antworten.
Wenn ich das per Hand mit minicom mache, funktioniert es einwandfrei.
Nun muss ich das automatisieren, also ein Skript oder Programm (PERL, PHP, was anderes?) das das "T" schickt, die Antwort liest und diese zurück gibt.
Leider schaffe ich es nicht... Was ich probiert habe ist:
stty -F /dev/ttyUSB1 9600 echo "T" > /dev/ttyUSB1 ; cat /dev/ttyUSB1
aber hängt immer.
Hat jemand eine Ahnung, wie ich das Problem lösen kann?
Danke Luca Bertoncello (lucabert@lucabert.de)
Luca Bertoncello lucabert@lucabert.de (Mi 06 Jan 2021 21:58:11 CET):
zurück gibt.
Leider schaffe ich es nicht... Was ich probiert habe ist:
stty -F /dev/ttyUSB1 9600 echo "T" > /dev/ttyUSB1 ; cat /dev/ttyUSB1
Da ich gerade nix serielles habe, habe ich mal
socat TCP-LISTEN:8080,fork,reuseaddr SYSTEM:'read _; echo TOO HOT; exit'
gemacht, um das serielle Device zu emulieren. Und nun:
bash -c 'exec 3<>/dev/tcp/localhost/8080; { read response <&3; echo "GOT $response"; } & echo T >&3'
Heiko Schlittermann hs@schlittermann.de (Mi 06 Jan 2021 22:17:10 CET):
Da ich gerade nix serielles habe, habe ich mal
Habe noch mal in die Manpage von socat geillert: socat kann auch einen seriellen Port emulieren (wäre sonst kein Socat):
socat TCP-LISTEN:8080,fork,reuseaddr SYSTEM:'read _; echo TOO HOT; exit'
socat -v PTY,link=/tmp/x,raw,fork SYSTEM:'read _; echo too hot'
bash -c 'exec 3<>/tmp/x; { read response <&3; echo "GOT $response"; } & echo T >&3'
Heiko Schlittermann hs@schlittermann.de (Mi 06 Jan 2021 22:30:34 CET):
socat -v PTY,link=/tmp/x,raw SYSTEM:'while read _; do echo too hot; done'
Und für den Client könntest Du auch das hier probieren, wenn das mit der Shell zu schnöde aussieht: (Serviervorschlag, nicht zum Verzehr geeigent):
package main
import ( "bufio" "fmt" "log" "os" )
func main() { f, err := os.OpenFile("/tmp/x", os.O_RDWR, 0666) if err != nil { log.Fatal(err) } defer f.Close()
if _, err = fmt.Fprintln(f, "T"); err != nil { log.Fatal(err) }
if got, err := bufio.NewReader(f).ReadString('\n'); err != nil { log.Fatal(err) } else { fmt.Print("Got:", got) } }
Am 06.01.2021 um 22:30 schrieb Heiko Schlittermann:
Heiko Schlittermann hs@schlittermann.de (Mi 06 Jan 2021 22:17:10 CET):
Da ich gerade nix serielles habe, habe ich mal
Habe noch mal in die Manpage von socat geillert: socat kann auch einen seriellen Port emulieren (wäre sonst kein Socat):
socat TCP-LISTEN:8080,fork,reuseaddr SYSTEM:'read _; echo TOO HOT; exit'
socat -v PTY,link=/tmp/x,raw,fork SYSTEM:'read _; echo too hot'
bash -c 'exec 3<>/tmp/x; { read response <&3; echo "GOT $response"; } & echo T >&3'
Hallo Heiko,
ich habe versucht mit:
socat -v PTY,link=/dev/ttyUSB1,raw SYSTEM:'read _; echo too hot' bash -c 'exec 3<>/dev/ttyUSB1; { read response <&3; echo "GOT $response"; } & echo T >&3'
weil fork für ttyUSB1 nicht geht. Es geht, aber es läuft anscheinend im Hintergrund, und was ich brauche wäre, dass die Temperatur in einer Variabel gespeichert wird...
Kannst du mir vielleicht ein Tipp noch geben?
Danke Luca Bertoncello (lucabert@lucabert.de)
Luca Bertoncello lucabert@lucabert.de (Do 07 Jan 2021 06:44:09 CET):
ich habe versucht mit: socat -v PTY,link=/dev/ttyUSB1,raw SYSTEM:'read _; echo too hot' bash -c 'exec 3<>/dev/ttyUSB1; { read response <&3; echo "GOT $response"; } & echo T >&3'
Ja, das "fork" nicht geht, schrieb ich in einer weiteren Mail. Und bereits in der ersten Mail schrieb ich, dass ich dieses socat *nur* verwende, um das serielle Device zu emulieren für den Test.
Die eigentliche Lösung für das, was Du suchtest, war der Shell-Teil (bzw. in meiner letzten Mail das Beispiel in Go).
Kannst du mir vielleicht ein Tipp noch geben?
Nochmal die erste Antwort-Mail lesen (für die Shell) oder die letzte meiner Mails für eine andere Möglichkeit, Go statt Shell zu nutzen (sicher übertragbar auf beliebige andere Programmiersprachen, egal ob Script oder kompiliert).
Hi, frei geraten hängt das cat, weil kein EOF kommt (woher auch), und möglicherweise siehst du nix, weil es in einem Buffer hängt? Mglw. hilft hier stdbuf. Carsten
Carsten Weber info@carwe.de (Do 07 Jan 2021 02:56:45 CET):
Hi, frei geraten hängt das cat, weil kein EOF kommt (woher auch), und möglicherweise siehst du nix, weil es in einem Buffer hängt? Mglw. hilft hier stdbuf.
Hm. Ich glaube auch, die Lösung von mir gestern war etwas over-engineered.
Deinem Vorschlag folgend: ich meine, cat arbeitet zeilenweise, wenn also der Arduino keine komplette Zeile schickt, wird cat noch eine Weile warten. (Sehr lange, bis zum Zeilenende)
*simuliertes serial device*
socat -v PTY,link=/tmp/x,raw system:'while read _;do echo too hot; done'
Und nun kann ich genau das, was Luca versucht, tun:
echo T >/tmp/x read </tmp/x echo $REPLY
Aber, es sind hier überall Zeilenumbrüche dran.
Am 07.01.2021 09:58, schrieb Heiko Schlittermann:
Hallo
Hm. Ich glaube auch, die Lösung von mir gestern war etwas over-engineered.
Ich habe jetzt einfach gelöst, indem ich ein kleines Programm in C geschrieben habe. Das funktioniert. Warum aber dasselbe mit PERL oder Python nicht geht, bleibt mir ein Rätsel...
Grüße Luca Bertoncello (lucabert@lucabert.de)
Luca Bertoncello lucabert@lucabert.de (Do 07 Jan 2021 10:02:21 CET):
Ich habe jetzt einfach gelöst, indem ich ein kleines Programm in C geschrieben habe. Das funktioniert. Warum aber dasselbe mit PERL oder Python nicht geht, bleibt mir ein Rätsel...
Buffering. Zeilenumbrüche. Zeig doch mal Deine Versuche und die Lösung.
lug-dd@mailman.schlittermann.de