Wiki - Freifunk Pinneberg

Freies WLAN im Kreis Pinneberg

Benutzer-Werkzeuge

Webseiten-Werkzeuge


alarmsystem

Bewegungsalarmsystem

TODO Das hier ist noch in der Erprobungsphase

Noch implementieren

  • Konfiguration über uci bzw. /etc/config
  • Freifunk-Clientnetzwerk im Fahrzeugknoten deaktivieren, wenn kein Link zu einem anderen Freifunkknoten besteht. Befehle dafür:
    ip link set down dev client0
    ip link set up dev client0

Dieses System ist natürlich immer im Zusammenhang mit anderen Sicherungssystemen zu sehen.

Voraussetzung ist, daß im Fahrzeug eine permanente Stromversorgung sichergestellt ist.

Feststellen ob ein Fahrzeug von seinem Parkplatz bewegt wird. Dazu können Freifunkknoten verwendet werden.

  • Ein Knoten wird im Fahrzeug plaziert
  • Ein weiterer Knoten übernimmt die Überwachung des Fahrzeugknotens

Wie funktioniert das?

  • Der Knoten im Gebäude prüft, ob die Verbindung (Link) zum Fahrzeugknoten vorhanden ist
    • Micron-Job neighbourwatch in /usr/lib/micron.d, wird einmal je Minute ausgeführt
    • Script neighbourwatch.lua prüft das Alter des Links zur MAC des Fahrzeugknotens uns setzt eine Semaphor-Datei /tmp/alarmcounter, damit wird sichergestellt, daß bei jedem verschwinden nur ein Alarm ausgelöst wird
  • Wenn das letzte Signal ein bestimmtes Alter überschritten hat und die Semaphor-Datei nicht vorhanden ist, wird die Alarmierung gestartet
    • Es wird eine SSH-Verbindung zu einem Server im Freifunknetz hergestellt und dort ein Alarmprogramm gestartet
      ssh alarmuser@server.ffpi ./alarm.sh
      • Damit Dropbear eine Verbindung aufbauen kann, wird ein Schlüsselpaar benötigt. Es gibt dafür das Programm dropbearkey
      • Der Alarmserver ist notwendig, da der Freifunkknoten nur Dienste im Freifunk-Netz ansprechen kann, d.h. alles was im lokalen Subnet ist. Die Alarmierung benötigt aber meistens erweiterte Funktionen, wie z.B. Internetzugriff um eine Mail zu versenden.
      • Es wäre auch denkbar, einen kleinen Alarmcomputer (Raspberry) im Freifunk-Netz zu haben, der mehr kann, als ein /normaler/ Freifunkknoten
  • Kommt das Fahrzeug zurück auf seinen Platz, wird die Alarmierung zurückgesetzt, so daß bei einem weiteren Entfernen erneut ein Alarm ausgelöst wird. Damit muß man das System nicht manuell aktivieren.

Hardware

  • GL-iNet 6416A im Fahrzeug
    • Stromversorgung über einen Zigarettenanzünder-USB-Adapter
    • Sehr klein
    • Am USB-Anschluß kann ein GPS-Stick angeschlossen werden
  • WR841N/ND im Fenster

Software

Das Link-Überwachungsprogramm

neighbourwatch.lua
#!/usr/bin/lua
 
function file_exists(name)
    local f=io.open(name,"r")
    if f~=nil then io.close(f) return true else return false end
end
 
function watch_mac(mac)
    command = "batctl n | grep -i " .. mac .. " | tr -s ' ' | cut -d' ' -f4"
    local handle = io.popen(command)
    local result = handle:read("*a")
    handle:close()
    return result:match("(.-)%s*$")
end
 
counterfile = "/var/run/alarmcounter"
lastseen = watch_mac("a2:1b:3a:0b:3e:72")
age_seconds = tonumber(lastseen:sub(1, -2)) or 1000
if age_seconds > 30 then
    if not file_exists(counterfile) then
        file = io.open(counterfile, "w")
        file:write("1")
        file:close()
        command = "ssh alarmuser@srv01.ffpi ./alarmmail.sh"
        local handle = io.popen(command)
        local result = handle:read("*a")
        handle:close()
    end
else
    if file_exists(counterfile) then
        os.remove(counterfile)
    end
end

Der Cronjob der das Überwachungsscript regelmäßig aufruft

/usr/lib/micron.d/neighbourwatch
* * * * * /root/neighbourwatch.lua

Alarmierung momentan per mail

alarmmail.sh
#!/bin/bash
mail -s "Alarm: Fahrzeugbewegung" mustermann@example.com << EOF
Alarm!
Das Fahrzeug /Mein Auto/ wird gerade bewegt.
EOF

Dynamische Steuerung des Client-WLANs im Fahrzeug.

Erster Entwurf:

meshcheck.lua
#!/usr/bin/lua
 
function neighbourcount()
    local handle = io.popen("batctl n | grep ibss0 | wc -l")
    local result = handle:read("*a")
    handle:close()
    return result
end
 
function ifstate()
    local file = io.open("/sys/class/net/client0/operstate", "r")
    local result = file:read("*l")
    file:close()
    return result
end
 
state = ifstate()
if neighbourcount() == 0 then
    if state == "up" then
        os.execute("ip link set down dev client0")
    end
else
    if state == "down" then
        os.execute("ip link set up dev client0")
    end
end
alarmsystem.txt · Zuletzt geändert: 20.01.2018 21:01 von havelock