Daten vom IO zerlegen

Ich bekomme über ein Socket Daten in der Form

01 01 06 00 01 17 31 8C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AC ...

Irgendwo zwischen den vielen 00 wird eine Zeichenkette übertragen die ich ausschneiden will.

Wenn das ganze ein String wäre würde dies mit $payload


$segments = explode("00", $payload);
foreach($segments as $key => $message)
{
$length = strlen($message);
if($length == 19)
{
$address = $message;
}
}
$address = trim($address);

funktionieren. Wenn ich die Daten $payload aber von einer Registervariable über $_IPS[‚VALUE‘] beziehe, funktioniert das nicht. Hat einer eine Idee was falsch ist bzw. wie wäre die richtige Vorgehensweise um von Daten in der Form einen Teilbereich zu identifizieren und auszuschneiden?

Sicher das die Daten so aussehen?
Nimm den Haken Hex im Debug raus, dann siehst du wie sie wirklich aussehen.
Michael

Wenn ich den Haken komplett rausnehme sieht es so aus


<SOH><SOH><ACK><NUL>m<GS>¯<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>¬c¾ePg<NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL><NUL>c‚Sc5<SOH><ETX>6<EOT>À¨7<LF>2<EOT>À¨5Z6<ETX><SOH><ETX><ACK>ÿ

Mein Problem ist wenn ich das als Hex anschaue sehe ich wie zwischen den <NUL> in Hex 00 irgendwann eine MAC Adresse geschickt wird, diese möchte ich ausschneiden und in eine Variable schreiben. Dies ist in dem Format jedoch nicht mehr ersichtlich. Woran sehe ich denn nun genau was die eigentlichen Rohdaten sind?

Haken Hex = Rohdaten als Hex dargestellt.
Ohne Haken = Rohdaten als ASCII dargestellt.
Die Daten ändern sich nicht.

Somit ist die MAC-Adresse auch nicht Klartext sondern ebenfalls Binär (Hex).
DHCP Paket, oder?
Einfach mit substr($data,27,6) den Teil der Mac rauskopieren.
Ergibt einen String Länge 6 mit den Bytes welche die Mac darstellen.
Wenn du es dann leserlich haben willst:
PHP: bin2hex - Manual
Um den Anfang und das Ende eines Paketes zu erkennen, kannst du auf Start 0x01,0x01 und Ende 0xff prüfen.
Michael

Ja die MAC in Hex möchte diese dann am Schluss als String ablegen, so wie diese als HEX übergeben wird.

Es handelt sich um Bootstrap, ich bin mir eben nicht sicher ob die MAC stets an der exakt gleichen Position zu finden ist, oder ob das nicht variiert.

Gilt das auch für Bootstrap, habe das Gefühl die Daten kommen einfach zwischen vielen 00.

Ja… Sind ja auch eine Menge.
Du musst aufpassen.
00 in Hex sind ein Byte also Länge 1 und um so ein Byte als String in PHP zu nutzen gibt es entweder chr(0x00) oder „/x00“.
Laut RFC immer an der gleichen Position, identisch zu DHCP.
403 Forbidden
Michael

Also Modul geht es noch viel einfacher.
Die Mac als Eigenschaft.
Wandeln in bin und setzen als ReceiveFilter. Fertig :wink:
Keine Daten auswerten… Nur wenn welche kommen, dann Aktion ausgeführen.

Michael

Und wie würde man das konkret machen? Ich habe einen Multicast IO, ein Splitter und mehrere Device Instanzen, die dann etwas machen sollen, wenn die MAC, die als Property im der Device Instanz hinterlegt ist, mit der MAC, die übermittelt wurde, übereinstimmt. Der Splitter sucht also die MAC und leitet die weiter und die Geräte Instanz reagiert dann nur wenn der Wert der Property mit dem Wert vom Splitter übereinstimmt?

Gar kein Splitter. Nur Device direkt auf den Multicast-IO.
Dann bekommt jedes Device nur seine Daten.
Michael

Habe Blut geleckt und mich gerade in die Vollen gesetzt.
Leider ist das mit dem Filter nicht so einfach…
Ich Bau da etwas zum testen.
Michael

Hier teste mal… kannst auch gerne abschauen :slight_smile:
GitHub - Nall-chan/IPSNetwork

Damit sollte es funktionieren.
Mac Eintragen ( ohne : oder mit : oder mit - )
IO Öffnen (keine Adresse nötig)

Ausprobieren.

Funktioniert auch perfekt als Handy betritt WLAN-Zone :slight_smile:

Michael

Prima werde ich probieren bin nur unterwegs kann also dauern bist Du von mir Rückmeldung bekommst. Bin ja aber nicht der Einzige der das mal ausprobieren und Rückmeldung geben kann. Im Prinzip sollte sich damit alles registrieren lassen was gerade versucht im WLAN / LAN per Bootstrap bzw. DHCP eine IP Adresse zu bekommen, also Handy, Dashbutton usw. oder?

Jup, jedes Gerät was eine Anfrage in das Netz brüllt.
Michael

Sehr praktisch, danke nochmal. Ich hätte mich da jetzt nach der Diskussion auch ran gesetzt weil es doch besser ist als mit Skript und Registervariable. Habe aber gerade keine Zeit, um so besser das Du da ein paar Stunden Hirnschmalz investiert hast :D, kann so was sehr gut gebrauchen.

Doku und Übersetzungen fehlen noch. Kann ja jeder mithelfen :wink:
Zeit hat doch eh keiner…
Michael