Ich lebe in der wilden bl0rg-wg, und die muss ganz im bl0rg-stil auch komplett automatisiert, überwacht und verkabelt werden. Zum Beispiel müssen die Einkäufe automatisch erfasst werden, damit der Traum des selbstfüllenden Kühlschranks ein bisschen näher rückt. Das Tolle ist: ziemlich jedes Produkt, das man kaufen kann, ist mit einem Barcode versehen (bis auf das Brot vom Bäcker, aber das kriegen wir auch noch irgendwie geregelt). Im Entropia lag noch ein alter Barcodescanner, der prompt analysiert wurde, und wie sich rausstellte ganz bequem die Barcodes über seriell rausgebeamt hat. Nach ein bisschen Rumfrusten mit bestimmten seriellen Interfaces, die nicht funktionierten, kann man jetzt die Barcodes ganz “bequem” (*hüstel*) mit folgendem Shellscript extrahieren:
#!/bin/sh
DEV=/dev/ttyE0
stty -F $DEV cs8 -parenb -cstopb speed 9600 icrnl -ixon
while true; do
i=`head -n 1 $DEV`
echo -en "barcode $i\nquit\n" | nc localhost 12345
done
DEV ist hier die serielle Schnittstelle. Als erstes setzt das Skript die nötigen Parameter für die Kommunikation (9600 bauds, 8n2, Carriage Return unix-konform nach Newline konvertieren, und Flowcontrol aus). Dann wird jeweils die neuste Zeile gelesen (also das neuste Barcode), und dieser Barcode wird dem Bl0rgo-caster übergeben. Insgesamt also schön einfach, nur ein bisschen Glue notwendig. Hiermit hätten wir schonmal die Sprache Shell benutzt (und das sind auch die einzigen Zeilen code von mir in diesem geilen System, der Rest ist alles von Dividuum. Ich hab mich da gleich zu Anfang irgendwie mit meinem UDP Broadcast-system verfahren, und konnte nicht mal sinnvoll UDP-Nachrichten auf dem Ethernet schicken).
Der bl0rgo-caster an sich besteht aus einem Server, der über UDP Broadcast messages senden und empfangen kann, und diese Nachrichten über TCP an verschiedene Listener dann übermitteln kann. Also, wenn man einfach nur Nachrichten broadcasten will, kann man eine UDP Nachrichten schicken. Wenn man sie empfangen will, kann man über TCP connecten, und lauschen. Der Clou ist aber, dass der bl0rgo-caster über LUA skriptbar ist. Wenn man also per TCP connected, kriegt man eigentlich eine LUA-Shell, und kann dort LUA-Kommandos absetzen. Beim Start parst der Server eine Skript-datei, die er dann auch später reloaden kann. Dort kann man dann z.B. Kommandos einbauen, um XMMS zu steuern. Der bl0rgo-caster benutzt libevent, um die verschiedenen Datenquellen zu pollen. Der LUA-Code, der z.B. unsere XMMS-Barcodes analysiert, sieht wie folgt aus:
function onBroadcast(datatype, data)
-- print("onUDPData: " .. datatype .. " - " .. data)
-- print(datatype)
-- print(data)
-- print("---")
if datatype == 0 then
Client.writelnAll("Message: " .. data)
elseif datatype == 1 then
Client.writelnAll("Barcode scanned: " .. data)
if (data == "1234567") then
os.execute("xmms -r")
elseif (data == "1231313") then
os.execute("xmms -f")
else
print("huh?")
end
end
end
Hier sieht man, wie der Messagetyp analysiert wird, und wenn ein Barcode kam XMMS gesteuert wird. Doch das war für den wilden Dividuum nicht genug, ein weiteres Tool in der bl0rgo-caster Suite zeigt Broadcast messages als X11-Popup an, so dass man immer am Laufenden gehalten wird, was gerade in der WG passiert (denn nachher werden alle Sensoren in der WG ihre Nachrichten in den bl0rgo-caster dumpen). Diese Popuptool ist in Ruby geschrieben, und verwendet intern TK um die Grafik anzuzeigen. Das sind also insgesamt 5 Sprachen, die zum Einsatz kommen: ruby, C, shell, Lua und Tk (insofern Tk als Sprache gilt). Beim Testen von Popup unter meiner Debian kam noch ein komischer Fehler vor: die clear Methode von TkText war irgendwie nicht definiert (?), also mussten wir wirklich ein Stückchen Tk reinziehen:
# UAAAAAAAAAAAAAAArgggggg
class TkText
def clear
tk_send_without_enc('delete', "1.0", 'end')
self
end
end
Wie lecker… 🙂
Den Code für den bl0rgo-caster könnt ihr aus unserem Subversion ziehen:
$ svn co svn://bl0rg.net/bl0rgo-caster/
Erweiterungsideen sind z.B. ein Listener, der alle Events als RSS veröffentlicht. Mal sehen, das werden wir bestimmt in Lisp oder so hacken, damit der Sprachenchaos komplett ist.
We’ll build our own Windows-Nachrichtendienst, with blackjack … and barcodes! 😉