No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

monitor.cpp 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "monitor.h"
  2. using namespace std;
  3. SOCKADDR_IN ssin;
  4. SOCKET sock;
  5. socklen_t recsize = sizeof (ssin);
  6. /*Socket et contexte d'adressage du client */
  7. SOCKADDR_IN csin;
  8. SOCKET csock;
  9. socklen_t crecsize = sizeof (csin);
  10. int sock_err;
  11. pid_t pidNodejs;
  12. string serverReceive(int size);
  13. int serverSend(const void *data, int dataLength);
  14. int receive(char *data);
  15. int run_nodejs(const char * path, char * file) {
  16. int ret;
  17. //char *const parmList[] = {"/bin/ls", "-l", "/home", NULL};
  18. char * const parmList[] = {"node", file, NULL};
  19. if ((ret = fork()) == -1)
  20. perror("fork error");
  21. else if (ret == 0) {
  22. ret = execv(path, parmList);
  23. }
  24. return ret;
  25. }
  26. int kill_nodejs() {
  27. #ifdef __VERBOSE__
  28. printf("kill nodejs\n");
  29. #endif
  30. return kill(pidNodejs, SIGTERM);
  31. }
  32. int open_server(int port) {
  33. /* Création d'un socket */
  34. sock = socket(AF_INET, SOCK_STREAM, 0);
  35. int enable = 1;
  36. /* Si la socket est valide */
  37. if (sock != INVALID_SOCKET) {
  38. #ifdef _WITH_TRACE_
  39. printf("TCP/IP Socket %d opened\n", sock);
  40. #endif
  41. setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof (enable));
  42. /* Configuration */
  43. ssin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */
  44. ssin.sin_family = AF_INET; /* Protocole familial (IP) */
  45. ssin.sin_port = htons(port); /* Listage du port */
  46. sock_err = bind(sock, (SOCKADDR*) & ssin, recsize);
  47. /* Si la socket fonctionne */
  48. if (sock_err != SOCKET_ERROR) {
  49. /* Démarrage du listage (mode server) */
  50. sock_err = listen(sock, 1);
  51. /* Si la socket fonctionne */
  52. if (sock_err != SOCKET_ERROR) {
  53. /* Attente pendant laquelle le client se connecte */
  54. #ifdef _WITH_TRACE_
  55. printf("Waiting a client on port %d\n", port);
  56. #endif
  57. csock = accept(sock, (SOCKADDR*) & csin, &crecsize);
  58. #ifdef _WITH_TRACE_
  59. printf("Client connected\n");
  60. #endif
  61. return 0;
  62. } else {
  63. perror("listen");
  64. }
  65. } else {
  66. perror("bind");
  67. return (-1);
  68. }
  69. } else {
  70. perror("socket");
  71. return (-1);
  72. }
  73. return 0;
  74. }
  75. int close_server(void) {
  76. /* Fermeture de la socket client et de la socket serveur */
  77. close(csock);
  78. close(sock);
  79. printf("Socket fermé\n");
  80. return 0;
  81. }
  82. int send_message_to_monitor(const char* typeMessage, const void * data) {
  83. if ((string) typeMessage == HEADER_STM_IMAGE) {
  84. Jpg * imgC = (Jpg*) data;
  85. serverSend("IMG", 3);
  86. serverSend(imgC->data(), imgC->size());
  87. serverSend("TRAME", 5);
  88. return 0;
  89. } else if ((string) typeMessage == HEADER_STM_POS) {
  90. char buffer[400];
  91. Position * maPosition = (Position*) data;
  92. sprintf(buffer, "POScenter: %3d;%3d | %.1fTRAME", maPosition->center.x, maPosition->center.y, maPosition->angle);
  93. serverSend(buffer, strlen(buffer));
  94. return 0;
  95. } else if ((string) typeMessage == HEADER_STM_MES) {
  96. char buffer[50];
  97. sprintf(buffer, "MSG%sTRAME", (const char*) data);
  98. serverSend(buffer, strlen(buffer));
  99. return 0;
  100. } else if ((string) typeMessage == HEADER_STM_ACK) {
  101. char buffer[50];
  102. sprintf(buffer, "ACK%sTRAME", (const char*) data);
  103. serverSend(buffer, strlen(buffer));
  104. return 0;
  105. } else if ((string) typeMessage == HEADER_STM_BAT) {
  106. char buffer[50];
  107. sprintf(buffer, "BAT%sTRAME", (const char*) data);
  108. serverSend(buffer, strlen(buffer));
  109. return 0;
  110. } else if ((string) typeMessage == HEADER_STM_NO_ACK) {
  111. char buffer[50];
  112. sprintf(buffer, "NAK%sTRAME", (const char*) data);
  113. serverSend(buffer, strlen(buffer));
  114. return 0;
  115. } else if ((string) typeMessage == HEADER_STM_LOST_DMB) {
  116. char buffer[50];
  117. sprintf(buffer, "LCD%sTRAME", (const char*) data);
  118. serverSend(buffer, strlen(buffer));
  119. return 0;
  120. } else {
  121. return -1;
  122. }
  123. }
  124. int receive_message_from_monitor(char *typeMessage, char *data) {
  125. char buffer[20];
  126. int tBuffer = receive(buffer);
  127. sscanf(buffer, "%3s:%s", typeMessage, data);
  128. return tBuffer;
  129. }
  130. int receive(char *data) {
  131. int result;
  132. result = recv(csock, data, 20, 0);
  133. //cout <<"Data : " << data << endl;
  134. return result;
  135. }
  136. int serverSend(const void *data, int dataLength) {
  137. if (send(csock, data, dataLength, 0) != dataLength) {
  138. perror("Send failed : ");
  139. return false;
  140. }
  141. return true;
  142. }