Wie Zugriff überwachen?

Camera model

Raspberry Pi Camera (11/2018) https://www.amazon.de/gp/product/B01M6UCEM5
webcamd / mjpg-streamer

What is the problem?

(English below)
Um Strom zu sparen schloss ich einen WS2801 Pixel für die Webcam an (wird bei Erfolg durch Stripe ersetzt). Dieser wird erfolgreich mit 2 scripte ein- und ausgeschaltet. Arbeitet gut mit octolapse zusammen.

Jetzt würde ich gerne, dass, wenn ich den Stream (http://[ip]/webcam/?action=stream:80) beobachte, vollautomatisch die LED eingeschaltet wird.
Kann ich den Stream überwachen und herausfinden, dass jemand darauf zugreift?


To save power, I connected a WS2801 Pixel for the webcam (will be replaced with Stripe if successful). This is successfully switched on and off with 2 scripts. Works well with Octolapse.

Now I would like to have the LED turn on fully automatically when I watch the stream (http://[ip]/webcam/?action=stream:80).
Can I monitor the stream and find out if someone is accessing it?

What did you already try to solve it?

Diverse Log-Dateien auf Veränderungen beobachtet beim Zugriff auf den Stream

Have you tried running in safe mode?

Nein

Did running in safe mode solve the problem?

Nein

Systeminfo Bundle

browser.user_agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0
connectivity.connection_check: 8.8.8.8:53
connectivity.connection_ok: True
connectivity.enabled: True
connectivity.online: True
connectivity.resolution_check: octoprint.org
connectivity.resolution_ok: True
env.hardware.cores: 4
env.hardware.freq: 1200.0
env.hardware.ram: 914006016
env.os.bits: 32
env.os.id: linux
env.os.platform: linux
env.plugins.pi_support.model: Raspberry Pi 3 Model B Rev 1.2
env.plugins.pi_support.octopi_camera_stack: webcamd
env.plugins.pi_support.octopi_version: 0.18.0
env.plugins.pi_support.octopiuptodate_build: 0.18.0-1.8.6-20221018093204
env.plugins.pi_support.octopiuptodate_build_short: 2022.10.18.093204
env.plugins.pi_support.throttle_check_enabled: True
env.plugins.pi_support.throttle_check_functional: True
env.plugins.pi_support.throttle_state: 0x0
env.python.pip: 20.3.3
env.python.version: 3.7.3
env.python.virtualenv: True
octoprint.last_safe_mode.date: unknown
octoprint.last_safe_mode.reason: unknown
octoprint.safe_mode: False
octoprint.version: 1.9.3
systeminfo.generated: 2024-01-23T20:29:11Z
systeminfo.generator: zipapi

Additional information about your setup

OctoPrint Version 1.9.3
OctoPi Build 2022.10.18.093204 with "webcamd"
  based on OctoPi 0.18.0
  running on Raspberry Pi 3 Model B Rev 1.2
Ender 3 V1, Marlin, Firefox, kubuntu 22.04

Hm da ist mir nichts bekannt.
Ich schätzen du könntest versuchen den Webcam port zu überwachen.

Irgendwas in Richtung (Python)

import subprocess

# Run the netstat command
netstat_output = subprocess.check_output("netstat -tn", shell=True).decode()

# Parse the output and check if a connection to port 8080 is active
for line in netstat_output.split("\n"):
    if "ESTABLISHED" in line and ":8080" in line:
        print("A connection to port 8080 is active.")
        break
else:
    print("No connection to port 8080 is active.")

Ist nicht getestet und soll nur als Anregung und Beispiel dienen.

Logs wären natürlich auch ne Option, aber das wäre der Weg, den ich gehen würde.

Funktioniert, danke :grinning:

Auf netstat kam ich nicht. Ich habs für mich für bash umgebogen:
/home/pi/bin/ws2801.py

/bin/python3

# https://docs.circuitpython.org/projects/ws2801/en/latest/api.html#adafruit_ws2801.WS2801.fill

import time, sys, inspect, ast
import RPi.GPIO as GPIO
import Adafruit_WS2801
import Adafruit_GPIO.SPI as SPI

PIXEL_COUNT = 1

# Alternatively specify a hardware SPI connection on /dev/spidev0.0:
SPI_PORT   = 0
SPI_DEVICE = 0

r = int(1)
g = int(1)
b = int(1)

pixels = Adafruit_WS2801.WS2801Pixels(PIXEL_COUNT, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE), gpio=GPIO)

def setRGBColor(pixels, r=255, g=255, b=255):
    # cast from string to int
    r, g, b = int(float(r)), int(float(g)), int(float(b))
    pixels.set_pixels( Adafruit_WS2801.RGB_to_color( r, b, g ) )
    pixels.show()

if __name__ == "__main__":
    if len(sys.argv) < 4:
        sys.exit(1)

    cmdargs = sys.argv[1:]
    setRGBColor(pixels, cmdargs[0], cmdargs[1], cmdargs[2])

sys.exit(0)

/home/pi/bin/LED_off.sh

#!/bin/sh

~/bin/ws2801.py 0 0 0 & exit 0

/home/pi/bin/LED_white.sh

#!/bin/sh

~/bin/ws2801.py 120 255 120 & exit 0

Die LED_off.sh und LED_white.sh werden auch von octolapse aufgerufen.

/etc/systemd/system/switchwebcamled.service

[Unit]
Description=Schaltet die LED ein und aus beim Webcam-Zugriff und Octolapse
After=webcamd.service

[Service]
User=pi
WorkingDirectory=/home/pi/bin
ExecStart=/home/pi/bin/checkwebcamstream.sh
Restart=always
Type=forking
RestartSec=1

[Install]
WantedBy=multi-user.target

Bekannt geben mit

sudo systemctl daemon-reload

testen mit

sudo service switchwebcamled start

und mit ctrl+c abbrechen
stoppen mit

sudo service switchwebcamled stop

beim start aktivieren mit

sudo systemctl enable switchwebcamled

Neustart

sudo init 6

Funktioniert bei mir einwandfrei. Das schlimmste was passieren wird ist, dass wenn ich den Stream betrachte, von octolapse nach dem Schnappschuss die LED abgeschaltet wird, bis mein Script diese nach einer Sekunde wieder einschaltet. Kann ich mit leben...

1 Like

hubbs, da fehlt noch /home/pi/bin/checkwebcamstream.sh

#!/bin/bash

while true; do
        if [ $(netstat -n |grep "127.0.0.1:8080          ESTABLISHED" -c) == 0 ]; then
                ~/bin/LED_off.sh
#               echo "niemand guckt zu"
        else
                ~/bin/LED_white.sh
#               echo "Da ist jemand"
        fi
        sleep 1
done
1 Like

Sauber
Klasse umgesetzt

Sicherheitshalber sei noch erwähnt, dass diverse Scripte ausführbar sein müssen:

sudo chmod +x /home/pi/bin/checkwebcamstream.sh /home/pi/bin/ws2801.py /home/pi/bin/LED_white.sh  /home/pi/bin/LED_off.sh
1 Like

Die LED geht zeitweilig zu schnell aus, wenn keiner per Webcam zuschaut. Hab deshalb nen Zähler dazu gebaut. Nicht schön, aber funktional.
/home/pi/bin/checkwebcamstream.sh:

#!/bin/bash

declare -i i=10

while true; do
        if [ $(netstat -n |grep "127.0.0.1:8080          ESTABLISHED" -c) == 0 ]; then
                i=$i-1
                if [ $i -le 0 ]
                then
                        ~/bin/LED_off.sh
                fi
#               echo "niemand guckt zu"
        else
                i=10
                ~/bin/LED_white.sh
#               echo "Da ist jemand"
        fi
        sleep 1
done