udp_client.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <string.h>
  2. #include <sys/param.h>
  3. #include "sdkconfig.h"
  4. #include "freertos/FreeRTOS.h"
  5. #include "freertos/task.h"
  6. #include "freertos/event_groups.h"
  7. #include "esp_system.h"
  8. #include "esp_wifi.h"
  9. #include "esp_event.h"
  10. #include "esp_log.h"
  11. #include "nvs_flash.h"
  12. #include "esp_netif.h"
  13. #include "lwip/err.h"
  14. #include "lwip/sockets.h"
  15. #include "lwip/sys.h"
  16. #include <lwip/netdb.h>
  17. #include "udp_client.h"
  18. #include "wifi.h"
  19. #include "nexaTransmit.h"
  20. /**********************************************************************************
  21. * For sending and receiving UDP-Data from the Debian-server use these commands:
  22. * echo "<NT4C90AD91>" | nc -uv 192.168.1.164 53000
  23. * nc -lu -p 53000
  24. **********************************************************************************/
  25. #ifdef WIFI_ENABLED
  26. #define HOST_IP_ADDR CONFIG_BACK_END_SERVER_IP_ADDRESS
  27. #define PORT CONFIG_UDP_PORT_NO
  28. static QueueHandle_t udpTxQueue = NULL; // Queue for transmitting UDP-Data to back-end server
  29. static void setupConnection(int *socket_fd, struct sockaddr_in *backEndAddress) {
  30. struct sockaddr_in recvFromAddress;
  31. closesocket(*socket_fd);
  32. backEndAddress->sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
  33. backEndAddress->sin_family = AF_INET;
  34. backEndAddress->sin_port = htons(PORT);
  35. // Wait for WiFi to be connected first
  36. while( commIsUpAndRunning == 0 ) vTaskDelay(500 / portTICK_PERIOD_MS);
  37. *socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
  38. if (*socket_fd < 0) ESP_LOGE("UDP","Socket error");
  39. // Bind our server socket to a port.
  40. recvFromAddress.sin_family = AF_INET;
  41. recvFromAddress.sin_addr.s_addr = htonl(INADDR_ANY);
  42. recvFromAddress.sin_port = htons(PORT);
  43. if( (bind(*socket_fd, (const struct sockaddr *)&recvFromAddress, sizeof(struct sockaddr_in))) == -1 )
  44. ESP_LOGE("UDP","Bind error");
  45. else
  46. ESP_LOGI("UDP","UDP Rx Bind.");
  47. }
  48. void udp_client_task(void *pvParameter)
  49. {
  50. struct sockaddr_in backEndAddress;
  51. int recv_len;
  52. char dataBuff[UDP_QUEUE_OBJ_LENGTH];
  53. int socket_fd;
  54. setupConnection(&socket_fd, &backEndAddress);
  55. while(1)
  56. {
  57. memset(dataBuff,0,UDP_QUEUE_OBJ_LENGTH);
  58. // Receive
  59. if( (recv_len = recvfrom(socket_fd, dataBuff, UDP_QUEUE_OBJ_LENGTH,MSG_DONTWAIT, NULL, NULL)) > 0 ) {
  60. if( dataBuff[recv_len-1] == '\n' ) dataBuff[recv_len-1] = '\0';
  61. sendNexaCodeStr(dataBuff);
  62. ESP_LOGI("UDP","UDP Task: Data: %s -- %d" , dataBuff, recv_len);
  63. }
  64. else if( recv_len == -1 && errno != 11 ) {
  65. ESP_LOGE("UDP", "Error occurred during recvfrom: errno %d", errno);
  66. }
  67. // Transmit
  68. while( xQueueReceive( udpTxQueue, &dataBuff, 0 ) == pdTRUE ) {
  69. //ESP_LOGI("UDP","Send data:%s",dataBuff);
  70. sendto(socket_fd, dataBuff, strlen(dataBuff), 0, (struct sockaddr *)&backEndAddress, sizeof(backEndAddress));
  71. }
  72. vTaskDelay(50 / portTICK_RATE_MS);
  73. }
  74. vTaskDelete(NULL);
  75. }
  76. // Public interface for sending a UDP Message to the back-end server.
  77. // Argument #1 must be UDP_QUEUE_OBJ_LENGTH chars in length.
  78. void sendUDPMessage(char *p) {
  79. if( udpTxQueue != NULL ) xQueueSend( udpTxQueue, p, 0 );
  80. }
  81. void udpClientInit()
  82. {
  83. ESP_ERROR_CHECK(esp_netif_init());
  84. ESP_ERROR_CHECK(esp_event_loop_create_default());
  85. udpTxQueue = xQueueCreate( 5, UDP_QUEUE_OBJ_LENGTH );
  86. xTaskCreate(udp_client_task, "udp_client", 4096, NULL, 5, NULL);
  87. }
  88. #endif