meine Webcam mit Bewegungserkennung detektiert einfach zu viel Quatsch und so dachte ich mir ein externer Auslöser wäre da zuverlässiger.
Als client habe ich einen ESP8266 über Arduino der einfach nur bei eintreten eines Ereignisses z.B. Tastendruck ein Zeichen via UDP an meinen Pi Computer sendet.
Der Pi Computer soll dann die Webcam ansprechen und ein Foto auf die SD Speicherkarte schreiben.
So sieht mein Script auf der Linux Seite aus. (Die Webcam kann keine Fotos direkt machen und muss den Videostream anzapfen. Mit Imagemagic wird oben links noch ein zeitstempel generiert.
Code: Alles auswählen
#!/bin/sh
today=`/bin/date '+%Y-%m-%d__%H-%M'`; #Datum für Dateiname
todayx=`/bin/date '+%d-%m-%Y %H:%M'`; #Datum für BildimBild
counter=1
#Ping zur Webcam ob sie erreichbar ist
if ping -c 1 -w 1 192.168.1.6 > /dev/null ; then
#Ein Bild generieren als pseudo Film
ffmpeg -rtsp_transport tcp -i rtsp://192.168.1.6/11 -ss 00:00:01.000 -f image2 -vframes 1 -pix_fmt yuvj420p /run/12c$today.jpg
#Bild in Bild mit Datum generieren
convert -size 320x36 -gravity east -background black -fill white -pointsize 20 label:"$todayx" /run/soverlay.gif
# Sensorbild mit Webcam Bild vereinen
composite -gravity northwest /run/soverlay.gif /run/12c$today.jpg /daten/auslos/$today.jpg
rm /run/soverlay.gif
rm /run/12c$today.jpg
ncat -v -ul -p 7777 -c /home/pi/auslos.sh
else
echo "kein Ping zur Webcam" > /daten/auslos/$today.txt
ncat -v -ul -p 7777 -c /home/pi/auslos.sh
exit
fi
und so sieht der Code beim ESP8266 programmiert mit Arduino IDE aus
Code: Alles auswählen
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "routerssid";
const char* password = "wlanpasswort";
IPAddress ip(192, 168, 1, 21);
WiFiUDP Udp;
void setup()
{
Serial.begin(115200);
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected");
Udp.beginPacket(ip, 7777);
Udp.write(1);
Udp.endPacket();
Serial.println("gesendet");
}
void loop()
{ }
Der Arduinno Code ist erstmal total vereinfacht und sendet beim Start nur einmal und dann ist ende. Wenn man den reset Knopf drückt wird alles nochmal abgearbeitet.
Auf der Pi Linux Seite (verwende armbian) funktioniert das Script genau ein mal. Danach werden die UDP vom ESP8266 ignoriert.
starte ich auf einem Windows PC das Programm Packet Sender und sende ein UDP Paket an 192.168.1.21 port 7777 springt das script an aber dann kein zweites mal.
Über ein zweites Terminal Fenster am Pi-PC kann ich beliebig oft das Script mit dem Befehl
nc -u localhost 7777
auslösen, muss aber das Programm jedesmal mit Strg + c beenden.
------------------
Ich habe gelesen das evt. ein EOF erwartet wird aber da passiert nichts wenn ich EOF oder <C><S> noch sende. Auch die Parameter mit Timeout setzen bringen mich nicht weiter.
Wer weiß wo der Fehler liegt oder gibt es eine bessere Lösung für das Problem? Mit dem ESP8266 ist es einfach UDP Pakete zu senden, Ping gehen auch noch aber so TCP Kram wird umständlich.