OVH Cloud OVH Cloud

camera gérée par serveur et Winsock

6 réponses
Avatar
jose MULLER
Bonjour

Je dois interfacer en client sous VB6 une camera qui est gérée par un
programme Serveur.

1) J'utilise winsock pour me connecter au programme serveur

Private Sub cmdClient_Click()
'------------------------

Me.Winsock1.RemoteHost = "127.0.0.1"
Me.Winsock1.RemotePort = 3000
Me.Winsock1.Protocol = sckTCPProtocol
Me.Winsock1.LocalPort = 0

Me.Winsock1.Connect

Memo.Text = Memo.Text & "cmdClient" & vbCrLf

End Sub


c'est OK , le programme serveur me répond correctement

2) Je lance ma premiere commande et le programme serveur doit me répondre
par l'envoi d une structure

Private Sub cmd_PRTC_INIT_HARDWARE_Click()
'----------------------------------------
Dim sTmp As String

' envoi de la commande
Memo.Text = Memo.Text & "PRTC_INIT_HARDWARE" & vbCrLf
Me.Winsock1.SendData PRTC_INIT_HARDWARE

' la structure status en retour
' Me.Winsock1.GetData ServerStatus, , Len(ServerStatus) ??????????
' Me.Winsock1.GetData sTmp ',type,maxLen ????????????
' Debug.Print Len(sTmp)
?????????????
' Memo.Text = Memo.Text & sTmp & vbCrLf & "---------" & vbCrLf

End Sub

Type TCServerStatus
m_ErrorCode As Long
m_Info1 As Long
m_Info2 As Long
m_Status As Long
m_Length As Long
End Type

Public ServerStatus As TCServerStatus

--------------

en plus m_ErrorCode = 0 = NO_ERROR

Je ne recois aucune réponse si j'utilise Private Sub
Winsock1_DataArrival(ByVal bytesTotal As Long)


Comment envoyer et recevoir une structure ??????????

merci

6 réponses

Avatar
Vincent Guichard
je proposerais une solution de ce type:

1: tu récupère les données dans un tableau de byte
2: tu fait un LSet de ton tableau sur la structure

Vincent Guichard
Avatar
jose MULLER
merci

mais si c'est trop lent car la structure est longue, je passe a DELPHI




"Vincent Guichard" a écrit dans le message de
news: ca74ce$fv$
| je proposerais une solution de ce type:
|
| 1: tu récupère les données dans un tableau de byte
| 2: tu fait un LSet de ton tableau sur la structure
|
| Vincent Guichard
Avatar
Vincent Guichard
jose MULLER a écrit :
merci

mais si c'est trop lent car la structure est longue, je passe a DELPHI



Ta structure fait 5*4 bytes, donc 20 octets... Ca devrais pas etre long...

Vincent Guichard
Avatar
jose MULLER
merci ca va deja un peu mieux
je cale aussi lorsque je dois envoyer une structure de 20 bytes

Me.Winsock1.SendData PRTC_INIT_HARDWARE

'2 envoi de la structure contenant les thresholds
UserSetupData.m_LowThreshold = 1
UserSetupData.m_HighThreshold = 2
UserSetupData.m_LowLowThreshold = 3
UserSetupData.m_HighHighThreshold = 4
UserSetupData.m_MinDefectArea = 5

' Me.Winsock1.SendData UserSetupData 'erreur de
compilation il faut un byte array
sTmp = Str(20)
LSet sTmp = UserSetupData
'????????? erreur ???????
For i = 1 To 20
Me.Winsock1.SendData iData(i) comment
transvaser userSetupData dans idata() ??????
Next i

'3 le status en retour via Winsock1_DataArrival
----------

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'---------------------------------------------------------
' Type TCServerStatus
' m_ErrorCode As Long
' m_Info1 As Long
' m_Info2 As Long
' m_Status As Long
' m_Length As Long
'End Type

' Memo.Text = Memo.Text & " Winsock1_DataArrival " & bytesTotal & vbCrLf

Me.Winsock1.GetData ServerStatus.m_ErrorCode, vbLong
Me.Winsock1.GetData ServerStatus.m_Info1, vbLong
Me.Winsock1.GetData ServerStatus.m_Info2, vbLong
Me.Winsock1.GetData ServerStatus.m_Status, vbLong
Me.Winsock1.GetData ServerStatus.m_Length, vbLong


Memo.Text = Memo.Text & "---------" & vbCrLf

End Sub



"Vincent Guichard" a écrit dans le message de
news: ca79s0$ie3$
| jose MULLER a écrit :
| > merci
| >
| > mais si c'est trop lent car la structure est longue, je passe a
DELPHI
|
| Ta structure fait 5*4 bytes, donc 20 octets... Ca devrais pas etre
long...
|
| Vincent Guichard
Avatar
Vincent Guichard
jose MULLER a écrit :

Public Type TestData
m_1 As Long
m_2 As Long
m_3 As Long
m_4 As Long
m_5 As Long
End Type

Public Type TestBytes
m_0(1 To 20) As Byte
End Type

pour passer de ta structure vers tableau de byte:
dim td as TestData
dim tb as TestByte
td.m_1 = &h01020304
td.m_2 = &h01020304
td.m_3 = &h01020304
td.m_4 = &h01020304
td.m_5 = &h01020304
LSet tb = td
Winsock1.SendData tb.m_0

pour passer du tableau vers ta structure:
Winsock1.GetData tb.m_0, vbArray + vbByte, 20
LSet td = tb

Attention au stockage des infos, il peut y avoir des inversions dans
l'ordre des bytes (les poids faibles avant les poids forts dans le
tableau m_0)

Vincent Guichard
Avatar
jose MULLER
Merci , j y suis a 50%

du client vers le serveur OK
'1 envoi de la commande
Me.Winsock1.SendData CByte(PRTC_CALIB_BLACK)
'2 envoi de la structure contenant les thresholds
UserSetupData.m_LowThreshold = &H1020304
UserSetupData.m_HighThreshold = &H0
UserSetupData.m_LowLowThreshold = &H0
UserSetupData.m_HighHighThreshold = &H0
UserSetupData.m_MinDefectArea = &H1020304
LSet tbU = UserSetupData
Me.Winsock1.SendData tbU.m_0

du serveur vers le client , je coince encore :

' le code suivant fonctionne mais trop d'appel
' Me.Winsock1.GetData ServerStatus.m_ErrorCode, vbLong, 4
' Me.Winsock1.GetData ServerStatus.m_Info1, vbLong, 4
' Me.Winsock1.GetData ServerStatus.m_Info2, vbLong, 4
' Me.Winsock1.GetData ServerStatus.m_Status, vbLong, 4
' Me.Winsock1.GetData ServerStatus.m_Length, vbLong, 4

' le code suivant ne fonctionne pas , rien que des zéros
Me.Winsock1.GetData tbStatus.m_0, vbArray + vbByte, 20 ' lecture
en array de 20 bytes
For i = 0 To 19
Memo.Text = Memo.Text & i & vbTab & Hex(tbStatus.m_0(i)) & vbCrLf
Next i
LSet ServerStatus = tbStatus ' passage de l array
vers la structure


PS les poids sont dans bon ordre

Merci


"Vincent Guichard" a écrit dans le message de
news: ca9a2h$2hs$
| jose MULLER a écrit :
|
| Public Type TestData
| m_1 As Long
| m_2 As Long
| m_3 As Long
| m_4 As Long
| m_5 As Long
| End Type
|
| Public Type TestBytes
| m_0(1 To 20) As Byte
| End Type
|
| pour passer de ta structure vers tableau de byte:
| dim td as TestData
| dim tb as TestByte
| td.m_1 = &h01020304
| td.m_2 = &h01020304
| td.m_3 = &h01020304
| td.m_4 = &h01020304
| td.m_5 = &h01020304
| LSet tb = td
| Winsock1.SendData tb.m_0
|
| pour passer du tableau vers ta structure:
| Winsock1.GetData tb.m_0, vbArray + vbByte, 20
| LSet td = tb
|
| Attention au stockage des infos, il peut y avoir des inversions dans
| l'ordre des bytes (les poids faibles avant les poids forts dans le
| tableau m_0)
|
| Vincent Guichard