Invio paccketto byte ad un socket tcp

di il
4 risposte

Invio paccketto byte ad un socket tcp

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

  • Re: Invio paccketto byte ad un socket tcp

    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!
  • Re: Invio paccketto byte ad un socket tcp

    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
  • Re: Invio paccketto byte ad un socket tcp

    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
  • Re: Invio paccketto byte ad un socket tcp

    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