Bonjour.

J'ai une carte relais 8 ports pilotable par wifi:
Nom : relay8x.jpg
Affichages : 325
Taille : 47,9 Ko
que je souhaiterai piloter via une petite interface graphique sous windows d'abord tout en étant compilable pour les autres O.S.
J'ai commencé à dessiner l'idée de l'interface aussi:
Nom : MP8X_GUI01.jpg
Affichages : 412
Taille : 135,8 Ko
J'ai donc commencer à m'instruire en C++ mais suis ouvert à d'autres suggestions !
Depuis plusieurs jours j'essaye tout simplement d'envoyer la commande qui permettrait d'éteindre tous les relais car ils sont tous allumés quand je mets le courant !
Voici la liste des instructions fournies par le constructeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
agreement£ºTCP/IP
IP: 192.168.1.4
port number£º      30000 
code for the control of relay:
           1channel on£º FD 02 20 01 01 5D
           1channel off£º FD 02 20 01 00 5D
           2channel on£º FD 02 20 02 01 5D
           2channel off£º FD 02 20 02 00 5D
           3channel on£º FD 02 20 03 01 5D
           3channel off£º FD 02 20 03 00 5D¡¢
           4channel on£º FD 02 20 04 01 5D
           4channel off£º FD 02 20 04 00 5D
           5channel on£º FD 02 20 05 01 5D
           5channel off£º FD 02 20 05 00 5D
           6channel on£º FD 02 20 06 01 5D
           6channel off£º FD 02 20 06 00 5D
           7channel on£º FD 02 20 07 01 5D
           7channel off£º FD 02 20 07 00 5D
           8channel on£º FD 02 20 08 01 5D
           8channel off£º FD 02 20 08 00 5D
 
         1-8channel on£º FD 02 20 F8 88 5D
         1-8channel off£º FD 02 20 F8 80 5D
Donc mon objectif est d'envoyer FD 02 20 F8 80 5D à 192.168.1.4 via le port 30000 pour commencer, et plus tard de faire une interface graphique pour pouvoir programmer chaque temps ON & OFF de chacun des 8 relais.

Le logiciel "fourni" ne fonctionne pas ! sous windows, il se connecte mais une fois que je clique sur 1 des boutons, il gèle ! Je suis obligé de passer par le gestionnaire des taches pour l'arretter !

Donc je decouvre que je ne pourrais pas utiliser Csocket car c'est propriété microsoft donc payant....
Du coup je m'oriente vers du opensource : MinGW.
Tant bien que mal je réussi à inclure les path et lib qui me permettent de compiler sans problème sous MinGW avec mon Eclipse.
Mais impossible d'envoyer ce buffer précis !
C'est alors que je vois dans http://www.mingw.org/wiki/FAQ :
Porting Issues
...
How do I use Windows sockets, rather than Unix sockets?
....
Alors là çà m'en a mis un coup ! ! :O Ce serait pas possible ce que j'essaye de faire ! :o

Voici le code qui "fonctionne", plutot qu'il est possible de compiler sans erreurs mais il n'envoi pas le databuffer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
 * createSocket.cpp
 
 *
 *  Created on: Nov 18, 2014
 *      Author: Myke974
 */
// mise à jour 20 novembre 2014 à 03:25 am
 
// 	#include <winsock.h> // ancienne version winsock
 	#include <windows.h>
	#include <winsock2.h> //
	#include <ws2tcpip.h> // à vérifier si indispensable !
	#include <stdio.h> // header file that comes in MinGW features many functions you are likely to need for your program, including the print and getchar functions, which are needed in practically any application.
//	#include <socket.h> // introuvable ! ! d'après ce que je vois il suffirait d'utiliser winsock2.h !
	#include <stdlib.h>
	#include <iostream>
//  typedef int socklen_t; // utile ?
	using namespace std;
// #pragma comment(lib, "ws2_32.lib") // windows proprietaire...
// #pragma comment(lib, "libws2_32.a") //  renvoi : "ignoring pragma"....
 
	int main(void) {
 
	WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
       /* ... */
    SOCKET sock;  	 //  initialise une variable de type SOCKET qui sera utilisée pour définir le socket.
    SOCKADDR_IN sin; // la struct du SOCKADDR contient les informations techniques du socket.
//sock = SOCKET(AF_INET, SOCK_STREAM, 0); // avec SOCKET en majuscule on dirait que çà marche pas !
    sock = socket(AF_INET, SOCK_STREAM, 0);
    sin.sin_addr.s_addr	= inet_addr("192.168.1.4");
    sin.sin_family	= AF_INET;
    sin.sin_port = htons(30000);
 
    unsigned char databuffer[6],datareceive[1024]; //le databuffer va etre envoyé à l'interface
    databuffer[0]=0xFD;
    databuffer[1]=0x02;
    databuffer[2]=0x20;
    databuffer[3]=0xF8;
    databuffer[4]=0x80;
    databuffer[5]=0x5D;
 
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    send(sock, "hello, world!\n", 6, 0); // fonctionne mais n'envoi pas le databuffer !
// send(sock, (void *), databuffer, sizeof(sin));   // fonctionne pas
// send(databuffer, sock, 6, 0);	 // envoi du databuffer ?  // fonctionne pas
// ioctlsocket(sock, databuffer, 6); // à voir ce que c'est exactement...
	datareceive[0] = 0;
	int closesocket(int sock);   // pour fermer le socket.
    WSACleanup();
//  system("PAUSE"); si besoin est...
	return 0;
}
Les messages "Warnings":
Description Resource Path Location Type
ignoring #pragma comment [-Wunknown-pragmas] createSocket.cpp /Test04/src line 21 C/C++ Problem
variable 'databuffer' set but not used [-Wunused-but-set-variable] createSocket.cpp /Test04/src line 36 C/C++ Problem
variable 'datareceive' set but not used [-Wunused-but-set-variable] createSocket.cpp /Test04/src line 36 C/C++ Problem
Un petit coup de main serait vraiement vraiement très apprécié !