Zum Inhalt springen

l2ping lässt Raspberry einfrieren

Zur Präsenzerkennung für meinen Smart Mirror hätte ich gerne mit den Bordmitteln meines Raspberrys einen Bluetooth Ping via l2ping genutzt um darüber die Anwesenheit meines Smartphones oder das meiner Freundin zu erkennen und damit den HDMI Port des Bildschirms an oder aus zu schalten.

Das Prinzip ist eigentlich einfach. Man ermittelt die Bluetooth MAC-Adresse des zu erkennenden Bluetoothgeräts und fragt in regelmäßigen Abständen dieses Gerät via l2ping an. Meldet es sich zurück, ist diejenige Person anwesend und der HDMI Port kann angeschaltet bleiben.

Das schöne an l2Ping ist, dass das Smartphone/Wearable o.ä. nicht mit dem Smart Mirror connected sein muss. Das Bluetooth der Geräte muss lediglich aktiviert sein. Ein großer Komfortgewinn gegenüber einer permanenten Koppelung.

Leider scheint mit dem Raspberryeigenen Bluetooth Stack „bluez“ etwas nicht zu stimmen. Einzelne Anfragen via l2ping werden zwar ordentlich verarbeitet nach einer Vielzahl von Anfragen friert der Raspberry Pi irgendwann komplett ein, sodass nur noch die Stromquelle getrennt werden kann.

Der einfache l2ping mit Parameter -f (Floodping) reicht bei mir aus um das System nach einiger Zeit einzufrieren.

sudo l2ping -f 12:23:34:45:56:67

Es dauert bei mir ca. 350 Anfragen bis der Raspberry komplett einfriert.

Leider bin ich nicht der einzige, der dieses Problem hat. Es gibt in Foren zur Heimautomation bereits einige Berichte darüber dass Leute über den l2ping Befehl gerne die Anwesenheitserkennung steuern würden, ihnen aber leider je nach Häufigkeit der Pings die Geräte irgendwann einfrieren.

Ich bin kein C-programmierer und kann deshalb leider nur mutmaßen was hier falsch läuft aber ein Punkt in dem source code von bluez-l2ping kommt mir verdächtig vor.

Und zwar wird bei jeder Anfrage ein neuer Socket erstellt, der aber nur im Fehlerfall wieder geschlossen wird:

error:
	close(sk);
	free(send_buf);
	free(recv_buf);
	exit(1);

Ist das Bluetoothgerät also in Reichweite, läuft irgendwann der Sockethandler voll (so meine Vermutung). Ich habe die Entwickler des l2ping zwar angeschrieben und habe das Problem beschrieben aber wie und ob das Problem behoben werden kann, steht noch in den Sternen. l2ping taugt also leider (noch) nicht für eine Präsenzerkennung zur Heimautomation.

Update

Ich dachte ich hätte mit Python einen weiteren Ansatz gefunden ein Bluetooth Gerät zu detektieren. Und zwar mit Hilfe von:

#!/usr/bin/python
import bluetooth

while True:
    result = bluetooth.lookup_name('12:23:34:45:56:67', timeout=5) 
    if (result != None): 
        print "Gerät da" 
    else: 
        print "Gerät nicht da"

Leider führt aber auch dieses Script zum Einfrieren des Raspberrys. Im Hintergrund wird dabei vermutlich auch der Stack von bluez verwendet.

Gefällt dir der Beitrag?

Schreibe dich in den Newsletter ein und bekomme in unregelmäßigen Abständen zusammenfassende Newsletter mit den neuesten Beiträgen. Ich halte es minimalistisch. Versprochen.

5 Kommentare

  1. Danke. Ich habe das gleiche Problem und noch keine Lösung gefunden. Ich möchte gerne mein elektrisches Türschloss mithilfe des l2ping betreiben. Schade, dass es noch keine Lösung gibt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*