Schneid doch nur die Bytes raus, welche du brauchst.
Zähler, Timestamp etc brauchst du ja nicht für die Berechnung der Zustände.
Du kannst auf einzelne Zeichen eines String einfach wie auf ein Array zugreifen.
Mit ord dann in das ‚Zeichen‘ in dessen Byte konvertieren.
ord($Data[10]);
Oder bei größeren Werten dann nur Teile an unpack übergeben.
Und dann die Bits einzeln auswerten.
Keine Ahnung wie jetzt die Daten ‚wirklich‘ aussehen aber hier mal ein Beispiel wie man es machen könnte.
Im Array könnte sogar hier den Ident für die IPS-Variable stehen
//Beispieldaten Byte 1-3 = 'Müll' 4 & 5 Nutzdaten
$IOSample = chr(0x12).chr(0x13).chr(0x14).chr(bindec("00001001")).chr(bindec("10000011"));
// so ?
$GPIOs = array('IO_12','IO_11','IO_10','IO_09','IO_08','IO_07','IO_06','IO_05','IO_04','IO_03','IO_02','IO_01');
// oder so ?
$GPIOs = array('IO_01','IO_02','IO_03','IO_04','IO_05','IO_06','IO_07','IO_08','IO_09','IO_10','IO_11','IO_12');
// Alle verarbeiten:
$PinValue = unpack("n", substr($IOSample, 3, 2))[1];
foreach ($GPIOs as $Index => $Name)
{
$Bit = pow(2, $Index);
if ($PinValue & $Bit)
echo $Name." is true".PHP_EOL;
else
echo $Name." is false".PHP_EOL;
}
//Gezielt ein Bit
$PinValue = unpack("n", substr($IOSample, 3, 2))[1];
$Bit = pow(2, 7 /* 8. Bit*/);
if ($PinValue & $Bit)
echo "8. Bit true".PHP_EOL;
else
echo "8.Bit false".PHP_EOL;
Ich hatte auch irgendwo mal ein Beispiel wo ich es mit verschieben der Quell-Bits umgesetzt hatte.
Und dann immer logisch mit 1 und-verknüpft um zu prüfen ob das Bit gesetzt ist.
Ist aber Grundzätzlich egal wie man es umsetzt…weil wir wollen ja wohl keinen Performance-Preis gewinnen
Und du dir zuerst gedanken machen solltest, welche Instanz welche Aufgabe übernimmt.
Wenn du jetzt einen Splitter hast, braucht er die Nutzdaten komplett zu zerlegen und feuert dann für jedes Bit der GPIOs ein ForwardData zu deinen Device-Instanzen ?
Oder wirfst du das ganze oder Teile vom Datentelegramm einfach weiter und jede Device-Instanz prüft ob ihr Bit gesetzt ist ?!
Michael