====== 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
#!/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
* * * * * /root/neighbourwatch.lua
Alarmierung momentan per mail
#!/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:
#!/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