Ciao a tutti,
dovrei mandare un pacchetto formato da byte e altro ad un socket (allego img di come deve essere formato).
Il calcolo del checksum deve essere fatto come:
Il campo CKS (checksum) è la somma modulo 100 dei campi CNT+IDENT+MESSAGGIO.
Questo il codice che ho usato:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "socket successfully created.\n";
}
echo "Attempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "successfully connected to $address.\n";
}
$stx = 0x02;
$cnt = pack('n',2);
$ident = pack('C','0');
$command = pack('CCCC','1','0','0','1');
$cks = pack('n',(unpack('cchars/nint',$cnt.$ident.$command)['int'] % 100));
$ext = 0x03;
$binary = pack('C*',$stx,$cnt,$ident,$command,$cks,$ext);
il comando ($command) dovrebbe essere composto da 3 byte (1 e 001 , così riporta la documentazione).
Credo ci sia più di qualche errore, non ho esperienza, qualcuno mi potrebbe dare qualche indicazione? La connessione avviene e la risposta è un NO ACKNOLEDGE (per checksum errato o contatore uguale al precedente invio... ho provato ad incrementare il contatore, ma la risposta è la stessa; presumo quindi o comando errato o calcolo del checksum errato)
Grazie