Invio paccketto byte ad un socket tcp

di Anonimizzato26545 il
4 risposte
Ciao a tutti,

dovrei mandare un pacchetto formato da byte e altro ad un socket (allego img di come deve essere formato).

comandi.png
comandi.png

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

4 Risposte

  • Ciao, probabilmente devo risolvere il tuo stesso problema,
    hai per caso trovato una soluzione ?
    mi puoi dire anche come leggi la risposta dal dispositivo?
    Grazie!
  • Ciao,
    mi trovo anche io nella stessa situazione.IO uso un altro linguaggio però. Non riesco a capire come ottenere la checksum.
    Addirittura sembra addirittura che la codifica che sto usando non va bene.

    Mi fai sapere grazie!
    David
  • Ciao hai risolto il problema?
    Immagino che stai interfacciando un registratore fiscale su socket!!!
    Se hai risolto posti il codice... in rete non si trova molto
  • Io ho risolto così:

    Private Function CalcolaCK(Stringa) As Integer


    Dim CK As Integer = Asc(Strings.Left(Stringa, 1))

    For j = 2 To Stringa.Length

    CK = CK + Asc(Strings.Mid(Stringa, j, 1))
    Next

    Dim CKS As String = "00" & CK

    CK = Strings.Right(CKS, 2)

    Return CK


    End Function
Devi accedere o registrarti per scrivere nel forum
4 risposte