{"id":78,"date":"2005-02-22T23:51:32","date_gmt":"2005-02-22T21:51:32","guid":{"rendered":"http:\/\/blogs.bl0rg.net\/netzstaub\/?p=78"},"modified":"2005-02-22T23:51:32","modified_gmt":"2005-02-22T21:51:32","slug":"der-geile-bl0rgo-caster","status":"publish","type":"post","link":"https:\/\/blogs.bl0rg.net\/netzstaub\/2005\/02\/22\/der-geile-bl0rgo-caster\/","title":{"rendered":"Der geile bl0rgo-caster"},"content":{"rendered":"<p>\nIch lebe in der wilden <a href=\"http:\/\/wg.bl0rg.net\/\">bl0rg-wg<\/a>, und die muss ganz im <a href=\"http:\/\/www.bl0rg.net\/\">bl0rg-stil<\/a> auch komplett automatisiert, &#252;berwacht und verkabelt werden. Zum Beispiel m&#252;ssen die Eink&#228;ufe automatisch erfasst werden, damit der Traum des selbstf&#252;llenden K&#252;hlschranks ein bisschen n&#228;her r&#252;ckt. Das Tolle ist: ziemlich jedes Produkt, das man kaufen kann, ist mit einem Barcode versehen (bis auf das Brot vom B&#228;cker, aber das kriegen wir auch noch irgendwie geregelt). Im <a href=\"http:\/\/www.entropia.de\/\">Entropia<\/a> lag noch ein alter Barcodescanner, der prompt analysiert wurde, und wie sich rausstellte ganz bequem die Barcodes &#252;ber seriell rausgebeamt hat. Nach ein bisschen Rumfrusten mit bestimmten seriellen Interfaces, die nicht funktionierten, kann man jetzt die Barcodes ganz &#8220;bequem&#8221; (*h&#252;stel*) mit folgendem Shellscript extrahieren:\n<\/p>\n<pre>\n#!\/bin\/sh\nDEV=\/dev\/ttyE0\nstty -F $DEV cs8 -parenb -cstopb speed 9600 icrnl -ixon\nwhile true; do \n    i=`head -n 1 $DEV`\n    echo -en \"barcode $i\\nquit\\n\" | nc localhost 12345 \ndone\n<\/pre>\n<p>\nDEV ist hier die serielle Schnittstelle. Als erstes setzt das Skript die n&#246;tigen Parameter f&#252;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 &#252;bergeben. Insgesamt also sch&#246;n einfach, nur ein bisschen Glue notwendig. Hiermit h&#228;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).\n<\/p>\n<p>\nDer bl0rgo-caster an sich besteht aus einem Server, der &#252;ber UDP Broadcast messages senden und empfangen kann, und diese Nachrichten &#252;ber TCP an verschiedene Listener dann &#252;bermitteln kann. Also, wenn man einfach nur Nachrichten broadcasten will, kann man eine UDP Nachrichten schicken. Wenn man sie empfangen will, kann man &#252;ber TCP connecten, und lauschen. Der Clou ist aber, dass der bl0rgo-caster &#252;ber <a href=\"http:\/\/www.lua.org\/\">LUA<\/a> 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&#228;ter reloaden kann. Dort kann man dann z.B. Kommandos einbauen, um XMMS zu steuern. Der bl0rgo-caster benutzt <a href=\"http:\/\/www.monkey.org\/~provos\/libevent\/\">libevent<\/a>, um die verschiedenen Datenquellen zu pollen. Der LUA-Code, der z.B. unsere XMMS-Barcodes analysiert, sieht wie folgt aus:\n<\/p>\n<pre>\nfunction onBroadcast(datatype, data)\n    -- print(\"onUDPData: \" .. datatype .. \" - \" .. data)\n    -- print(datatype)\n    -- print(data)\n    -- print(\"---\")\n    if datatype == 0 then\n        Client.writelnAll(\"Message: \" .. data)\n    elseif datatype == 1 then\n        Client.writelnAll(\"Barcode scanned: \" .. data)\n        if (data == \"1234567\") then\n            os.execute(\"xmms -r\")\n        elseif (data == \"1231313\") then\n            os.execute(\"xmms -f\")\n        else\n            print(\"huh?\")\n        end\n    end\nend\n\n<\/pre>\n<p>\nHier sieht man, wie der Messagetyp analysiert wird, und wenn ein Barcode kam XMMS gesteuert wird. Doch das war f&#252;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&#252;ckchen Tk reinziehen:\n<\/p>\n<pre>\n# UAAAAAAAAAAAAAAArgggggg\nclass TkText\n def clear                                                                                             \n  tk_send_without_enc('delete', \"1.0\", 'end')                                                         \n  self                                                                                                \n end         \nend\n<\/pre>\n<p>\nWie lecker&#8230; \ud83d\ude42\n<\/p>\n<p>\nDen Code f&#252;r den bl0rgo-caster k&#246;nnt ihr aus unserem Subversion ziehen:\n<\/p>\n<pre>\n$ svn co svn:\/\/bl0rg.net\/bl0rgo-caster\/\n<\/pre>\n<p>\nErweiterungsideen sind z.B. ein Listener, der alle Events als RSS ver&#246;ffentlicht. Mal sehen, das werden wir bestimmt in Lisp oder so hacken, damit der Sprachenchaos komplett ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich lebe in der wilden bl0rg-wg, und die muss ganz im bl0rg-stil auch komplett automatisiert, &#252;berwacht und verkabelt werden. Zum Beispiel m&#252;ssen die Eink&#228;ufe automatisch erfasst werden, damit der Traum des selbstf&#252;llenden K&#252;hlschranks ein bisschen n&#228;her r&#252;ckt. Das Tolle ist: &hellip; <a href=\"https:\/\/blogs.bl0rg.net\/netzstaub\/2005\/02\/22\/der-geile-bl0rgo-caster\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-78","post","type-post","status-publish","format-standard","hentry","category-programmstaub"],"_links":{"self":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts\/78","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/comments?post=78"}],"version-history":[{"count":0,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts\/78\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/media?parent=78"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/categories?post=78"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/tags?post=78"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}