Hallo miteinander,
ich habe mir eine Funktion geschrieben, mit der man Art-Net Pakete (ArtDMX) senden kann, und somit Art-Net Nodes auch von PHP aus bedienen kann. Kann in manchen Fällen recht praktisch sein.
Das Script kann 255 (0xFF) Kanäle ausgeben, kann ohne große Probleme auch auf 512 Kanäle erweitert werden, dann muss Field 8 des ArtDMX Pakets auch gefüllt werden - habe ich nur nie gebraucht und mich nicht weiter drum gekümmert. In Ruby (siehe Matrix-Quellcode) geht das einfacher, dort ist das bereits berücksichtigt. Die PHP-Version hier ist quasi eine vereinfachte Version, die auf Grundlage des Ruby-Scripts entstanden ist.
Quellcode:
/* Art-Net (ArtDMX) with PHP
(c) Stefan <http://www.dmxcontrol.de/forum/index.php?page=User&userID=668>
Licence: CC 3.0 by-nc-sa
Version: 0.1
Tested with: PHP 5.1.2 */
define('CLIENT_IP', '192.168.0.1'); // define IP-Adress of Art-Net Client. Use IP-Adress, no broadcast adress
define('UNIVERSE', 1); // define Art-Net Universe
$socket = NULL;
$dmx = array(); // array of dmx values, each element from chr(0) (off) to chr(255) (full); DMX channel 1 == $dmx[1]
function art_open()
{
global $socket, $dmx;
if(defined('CLIENT_IP')) $socket = fsockopen('udp://' . CLIENT_IP, 0x1936);
for($i = 1; $i <= 64; $i++)
{
$dmx[$i] = chr(0);
}
}
function art_send()
{
global $socket, $dmx;
$buffer = "Art-Net\x00\x00\x50\000\016\x00\x01" . chr(UNIVERSE) . "\x00\x00" . chr(count($dmx)) . join($dmx);
if(defined('CLIENT_IP')) fwrite($socket, $buffer);
}
function art_close()
{
global $socket;
if(defined('CLIENT_IP')) fclose($socket);
}
Display More
$dmx ist ein Array mit den ganzen DMX-Werten, standardmäßig wird es mit 64 Kanälen vorbelegt, kann in Zeile 16 nach Wunsch angepasst werden. art_open() öffnet die Verbindung, art_send() sendet die in $dmx gespeicherten werte und art_close() schließt die Verbindung wieder.
Das Script ist auf den Art-Net-Node für 25 Euro ausgelegt, dieser speichert die zuletzt empfangenen Werte und gibt sie aus, bis die Spannungsversorgung unterbrochen wird.
Falls das PHP-Script von mehreren Clients angesprochen werden soll, muss man in PHP die aktuelle Ausgabe zwischenspeichern und die gewünschte Ausgabe errechnen. Der Art-Net Node selbst macht einfach LTP (letztes ArtDMX-Paket wird ausgegeben).
Wer das Script weiterentwickeln will (z.B. eine eigene PHP-Klasse schreiben) darf das gerne machen. Ich habe nicht mehr an Fehlerüberprüfung und Co. gebraucht, deswegen ist da auch quasi nichts drin.
Freundliche Grüße
Stefan