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.

128 lines
5.0 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
  1. #include "xs_udp.h"
  2. #include "xs_log.h"
  3. #define TAG "xs_udp"
  4. #define UDP_DEFAULT_SEND_PORT 5000
  5. #define SOCKET_DO(function) \
  6. do { \
  7. int ret = function; \
  8. if (ret) { \
  9. ZLOGE(TAG, "do %s fail", #function); \
  10. return false; \
  11. } \
  12. } while (0)
  13. static void udp_server_receive_thread(void const *argument) { //
  14. udp_t *udp_handler = (udp_t *)argument;
  15. ZLOGI(TAG, "udp server receive thread start: %s", udp_handler->name);
  16. while (true) {
  17. struct sockaddr_in sock;
  18. socklen_t sock_len = sizeof(sock);
  19. int recv_datalen = recvfrom(udp_handler->sock_fd, (char *)udp_handler->rxbuf, udp_handler->rxbuf_len, 0, (struct sockaddr *)&sock, &sock_len);
  20. if (recv_datalen > 0) {
  21. if (udp_handler->on_packet) udp_handler->on_packet(udp_handler, &sock, (uint8_t *)udp_handler->rxbuf, recv_datalen);
  22. }
  23. }
  24. }
  25. /**
  26. * @brief
  27. *
  28. * lwipϢϢͻһֱֻҪijsocketҪ
  29. * Ϣ
  30. */
  31. static void udp_broadcast_rx_thread(void const *argument) { //
  32. udp_broadcast_handler_t *udp_handler = (udp_t *)argument;
  33. while (true) {
  34. struct sockaddr_in sock;
  35. socklen_t sock_len = sizeof(sock);
  36. int recv_datalen = recvfrom(udp_handler->sock_fd, (char *)udp_handler->rxbuf, udp_handler->rxbuf_len, 0, (struct sockaddr *)&sock, &sock_len);
  37. }
  38. }
  39. bool xs_udp_init(udp_t *udp_handler, const char *name, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data) {
  40. memset(udp_handler, 0, sizeof(udp_t));
  41. udp_handler->server.sin_family = AF_INET;
  42. udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0");
  43. udp_handler->server.sin_port = htons(port);
  44. udp_handler->on_packet = on_packet;
  45. udp_handler->data = data;
  46. udp_handler->name = name;
  47. if (rxbuf_size == 0) {
  48. udp_handler->rxbuf_len = 1024;
  49. } else {
  50. udp_handler->rxbuf_len = rxbuf_size;
  51. }
  52. udp_handler->rxbuf = (char *)malloc(udp_handler->rxbuf_len);
  53. ZASSERT(udp_handler->rxbuf != NULL);
  54. // �����ͻ�������ͨ�ŵ�Socket
  55. udp_handler->sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  56. if (udp_handler->sock_fd < 0) {
  57. ZLOGE(TAG, "create socket fail");
  58. return false;
  59. }
  60. // ����
  61. SOCKET_DO(bind(udp_handler->sock_fd, (struct sockaddr *)&udp_handler->server, sizeof(udp_handler->server)));
  62. // ���ó�ʱ
  63. struct timeval tv = {1, 0};
  64. SOCKET_DO(lwip_setsockopt(udp_handler->sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)));
  65. if (on_packet) {
  66. // ���������߳�
  67. osThreadDef(udp_server_rx_thread, udp_server_receive_thread, osPriorityNormal, 0, 512);
  68. udp_handler->rx_thread = osThreadCreate(osThread(udp_server_rx_thread), udp_handler);
  69. ZASSERT(udp_handler->rx_thread != NULL);
  70. }
  71. return true;
  72. }
  73. int xs_udp_send_message(udp_t *udp_handler, const char *ip, int port, const char *data, int len) { //
  74. struct sockaddr_in sockaddr;
  75. sockaddr.sin_family = AF_INET;
  76. sockaddr.sin_addr.s_addr = inet_addr(ip);
  77. sockaddr.sin_port = htons(port);
  78. return sendto(udp_handler->sock_fd, data, len, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
  79. }
  80. int xs_udp_send_message2(udp_t *udp_handler, struct sockaddr_in *add, const char *data, int len) { //
  81. return sendto(udp_handler->sock_fd, data, len, 0, (struct sockaddr *)add, sizeof(struct sockaddr_in));
  82. }
  83. bool xs_udp_broadcast_init(udp_broadcast_handler_t *udp_handler, uint16_t localport) {
  84. memset(udp_handler, 0, sizeof(udp_broadcast_handler_t));
  85. udp_handler->server.sin_family = AF_INET;
  86. udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0");
  87. udp_handler->server.sin_port = htons(localport);
  88. udp_handler->rxbuf_len = 1024;
  89. udp_handler->rxbuf = (char *)malloc(udp_handler->rxbuf_len);
  90. ZASSERT(udp_handler->rxbuf);
  91. // �����ͻ�������ͨ�ŵ�Socket
  92. udp_handler->sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  93. if (udp_handler->sock_fd < 0) {
  94. ZLOGE(TAG, "create socket fail");
  95. return false;
  96. }
  97. // ���ó�ʱ
  98. struct timeval tv = {1, 0};
  99. SOCKET_DO(lwip_setsockopt(udp_handler->sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)));
  100. // ����
  101. SOCKET_DO(bind(udp_handler->sock_fd, (struct sockaddr *)&udp_handler->server, sizeof(udp_handler->server)));
  102. osThreadDef(_udp_broadcast_rx_thread, udp_broadcast_rx_thread, osPriorityNormal, 0, 512);
  103. udp_handler->rx_thread = osThreadCreate(osThread(_udp_broadcast_rx_thread), udp_handler);
  104. ZASSERT(udp_handler->rx_thread != NULL);
  105. return true;
  106. }
  107. ssize_t xs_udp_broadcast(udp_broadcast_handler_t *handler, uint32_t remoteport, uint8_t *data, size_t datalen) {
  108. struct sockaddr_in sockaddr;
  109. sockaddr.sin_family = AF_INET;
  110. sockaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  111. sockaddr.sin_port = htons(remoteport);
  112. return sendto(handler->sock_fd, data, datalen, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
  113. }