backdafuckup Back to da old skool | Bonjour,
Mon problème va être un peu long a être expliqué, mais j'espère que les plus vaillants pour répondre.
Le schéma est simple.
La ou je travaille, il y a une porte avec un lecteur de badge (lecteur simple à code barre). Ce lecteur est relié à notre réseau en ethernet, et communique avec le serveur sur le protocole TCP, sur le port 2100.
Le serveur possède plusieurs services, qui répondent au lecteur en tant voulu.
Après quelques sniff du réseau, j'ai trouvé les infos envoyées, les échanges etc.
Le but de mon projet est de développer une appli de remplacement pour gérer les badges, la communication, tout ça, étant donné que l'appli actuelle est sous un vieux NT4, et on a très peur d'une panne matérielle, entre autres.
Donc je me suis intéressé à la programmation TCP/IP en vb.net, puisque j'avais ça sous la main et que je m'en sortais pas trop mal.
J'ai commencé par faire une appli serveur qui écoute le port 2100 en asynchrone (pour rien bloquer). Je reçois correctement les informations.
Mais, il faut répondre. Pourquoi ? 2 raisons : - Le lecteur, lorsque qu'un badge est lu, envoie un paquet TCP qui contient une chaine de 49 caractères, avec dedans le matricule du badge, l'identificaiton du lecteur, la date et l'heure (plus quelques autres chiffres toujours identiques).
- De temps en temps (je n'ai pas trouvé de récurrence pour l'instant), le lecteur envoie un message de la forme *011100000000m et attend une réponse valant :008100012v avec les caractères 0A 0D à la fin (CR et LF).
Après une longue analyse, je commence à mieux comprendre les paquets TCP.
Le lecteur envoie dans son paquet (comme tout paquet tcp je suppose), trois infos importantes : le numéro de séquence, le prochain numéro de séquence et le numéro d'accusé de réception (ACK).
Je pense (et surtout dites moi si je me trompe), que la réponse doit avoir pour séquence le numéro "next sequence" du lecteur. Mais ce n'est pas le cas dans ce que je renvoie...
Un exemple
Lecteur
-------
Sequence : 1234
Next Sequence : 65473
ACK : 25
Serveur
--------
Sequence : 2514
Next Sequence : XXXXX (on s'en fout)
ACK : 1234
Il me semble que c'est pas bon, et que c'est pour ça que la communication ne se fait pas. En fait, on dirait que le lecteur n'entend pas ma réponse.
J'aimerais juste arriver à ce qu'elle capte mon message, que je puisse lui répondre immédiatement, dès que je reçois son message, mais là, je sèche...
Voici mon code (juste pour la réception et émission de message) :
Code :
- Dim networkStream As NetworkStream = Me.tcpClient.GetStream()
- ' Read the stream into a byte array
- Dim bytes(Me.tcpClient.ReceiveBufferSize) As Byte
- networkStream.Read(bytes, 0, CInt(Me.tcpClient.ReceiveBufferSize))
- ' Return the data received from the client to the console.
- Dim clientdata As String = Encoding.ASCII.GetString(bytes)
- clientdata = Replace(clientdata, Chr(0), "" )
- clientdata = Replace(clientdata, Chr(10), "" )
- clientdata = Replace(clientdata, Chr(13), "" )
- Me.CallDisplayMessage("Client sent: " & clientdata)
- Dim Reponse() As Byte = GetReponse(clientdata)
- Me.CallDisplayMessage("Host sending: " & Encoding.ASCII.GetString(Reponse))
- Dim sendBytes As [Byte]() = Reponse
- networkStream.Write(sendBytes, 0, sendBytes.Length)
|
La connexion se fait bien, ça fonctionne puisque j'avais fait des tests avec une appli cliente qui simulait le lecteur, et ça communique correctement.
Dès que je communique avec le lecteur, il ne reçoit pas mes messages...
Voilà, si quelqu'un peut m'aider, ça serait génial...
Merci d'avance |