XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_main.c
浏览该文件的文档.
1
17/* ==================== [Includes] ========================================== */
18
19#include "lwip/err.h"
20#include "lwip/sockets.h"
21#include "lwip/sys.h"
22#include "lwip/netdb.h"
23#include "lwip/inet.h"
24
25#include "xf_utils.h"
26#include "xf_wifi.h"
27#include "xf_netif.h"
28#include "xf_osal.h"
29#include "xf_sys.h"
30
31#include "ex_easy_wifi.h"
32
33/* ==================== [Defines] =========================================== */
34
35#define PORT CONFIG_EXAMPLE_PORT
36#define KEEPALIVE_IDLE CONFIG_EXAMPLE_KEEPALIVE_IDLE
37#define KEEPALIVE_INTERVAL CONFIG_EXAMPLE_KEEPALIVE_INTERVAL
38#define KEEPALIVE_COUNT CONFIG_EXAMPLE_KEEPALIVE_COUNT
39#define EXAMPLE_DELAY_MS 1000
40#define CLIENT_IP_ADDR INADDR_ANY
41
42/* ==================== [Typedefs] ========================================== */
43
44/* ==================== [Static Prototypes] ================================= */
45
46static void _example_thread(void *argument);
47
48/* ==================== [Static Variables] ================================== */
49
50static const char *TAG = "ap";
51static const char *payload = "This is a message from server.";
52
54#define EX_THREAD_NAME "ex_thread"
55#define EX_THREAD_PRIORITY XF_OSAL_PRIORITY_NORMOL
56#define EX_THREAD_STACK_SIZE (1024 * 4)
59 .priority = EX_THREAD_PRIORITY,
60 .stack_size = EX_THREAD_STACK_SIZE,
61};
62
63/* ==================== [Macros] ============================================ */
64
65/* ==================== [Global Functions] ================================== */
66
67void xf_main(void)
68{
70 if (s_thread_hdl == NULL) {
71 XF_LOGE(TAG, "xf_osal_thread_create error");
72 return;
73 }
74}
75
76/* ==================== [Static Functions] ================================== */
77
78static void _example_thread(void *argument)
79{
80 UNUSED(argument);
81
83
84 int err = 0;
85 char rx_buffer[128];
86 int addr_family = 0;
87 int ip_protocol = 0;
88 int sockfd_listen = 0;
89 int sockfd_conn = 0;
90 int keepAlive = 1;
91 int keepIdle = KEEPALIVE_IDLE;
92 int keepInterval = KEEPALIVE_INTERVAL;
93 int keepCount = KEEPALIVE_COUNT;
94 xf_ip4_addr_t src_ip4;
95
96 struct sockaddr_in dest_addr = {0};
97 struct sockaddr_in source_addr = {0};
98 struct timeval timeout = {0};
99
100 dest_addr.sin_addr.s_addr = htonl(CLIENT_IP_ADDR);
101 dest_addr.sin_family = AF_INET;
102 dest_addr.sin_port = htons(PORT);
103 addr_family = AF_INET;
104 ip_protocol = IPPROTO_IP;
105
106 sockfd_listen = socket(addr_family, SOCK_STREAM, ip_protocol);
107 if (sockfd_listen < 0) {
108 XF_LOGE(TAG, "Unable to create socket: errno %d", errno);
109 goto l_err;
110 }
111 XF_LOGI(TAG, "Socket created");
112
113 /* 绑定端口号 */
114 err = bind(sockfd_listen, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
115 if (err < 0) {
116 XF_LOGE(TAG, "Socket unable to bind: errno %d", errno);
117 goto l_err;
118 }
119 XF_LOGI(TAG, "Socket bound, port %d", PORT);
120
121 /* 监听 */
122 err = listen(sockfd_listen, 1);
123 if (err != 0) {
124 XF_LOGE(TAG, "Error occurred during listen: errno %d", errno);
125 goto l_err;
126 }
127
128 XF_LOGI(TAG, "Socket listening");
129
130 socklen_t addr_len = sizeof(source_addr);
131 sockfd_conn = accept(sockfd_listen, (struct sockaddr *)&source_addr, &addr_len);
132 if (sockfd_conn < 0) {
133 XF_LOGE(TAG, "Unable to accept connection: errno %d", errno);
134 goto l_err;
135 }
136
137 timeout.tv_sec = 10;
138 timeout.tv_usec = 0;
139 setsockopt(sockfd_conn, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
140
141 /* 设置 tcp keepalive 选项 */
142 setsockopt(sockfd_conn, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(int));
143 setsockopt(sockfd_conn, IPPROTO_TCP, TCP_KEEPIDLE, &keepIdle, sizeof(int));
144 setsockopt(sockfd_conn, IPPROTO_TCP, TCP_KEEPINTVL, &keepInterval, sizeof(int));
145 setsockopt(sockfd_conn, IPPROTO_TCP, TCP_KEEPCNT, &keepCount, sizeof(int));
146
147 for (;;) {
148 socklen_t socklen = sizeof(source_addr);
149 int len = recvfrom(sockfd_conn,
150 rx_buffer, sizeof(rx_buffer) - 1, 0,
151 (struct sockaddr *)&source_addr, &socklen);
152 if (len < 0) {
153 XF_LOGE(TAG, "recvfrom failed: errno %d", errno);
154 continue;
155 } else if (len == 0) {
156 XF_LOGW(TAG, "Connection closed");
157 }
158
159 rx_buffer[len] = 0;
160
161 src_ip4.addr = source_addr.sin_addr.s_addr;
162 XF_LOGI(TAG, "Received %d bytes from " XF_IPSTR ": \"%s\"",
163 len, XF_IP2STR(&src_ip4), rx_buffer);
164
165 /* 发送 */
166 int payload_len = strlen(payload);
167 err = sendto(sockfd_conn,
168 payload, payload_len, 0,
169 (struct sockaddr *)&source_addr, sizeof(source_addr));
170 if (err < 0) {
171 XF_LOGE(TAG, "Error occurred during sending: errno %d", errno);
172 break;
173 }
174 XF_LOGI(TAG, "send %d bytes to " XF_IPSTR ": \"%s\"",
175 payload_len, XF_IP2STR(&src_ip4), payload);
176
178 }
179
180l_err:;
181 if (sockfd_conn != -1) {
182 shutdown(sockfd_conn, 0);
183 closesocket(sockfd_conn);
184 }
185 if (sockfd_listen != -1) {
186 XF_LOGE(TAG, "Shutting down socket...");
187 shutdown(sockfd_listen, 0);
188 closesocket(sockfd_listen);
189 }
191}
#define EX_THREAD_PRIORITY
#define EX_THREAD_STACK_SIZE
#define EX_THREAD_NAME
xf_err_t ex_easy_wifi_ap(void)
void xf_main(void)
Definition xf_main.c:28
#define XF_IPSTR
#define XF_IP2STR(ipaddr)
xf_err_t xf_osal_thread_delete(xf_osal_thread_t thread)
终止线程的执行。
xf_osal_thread_t xf_osal_thread_create(xf_osal_thread_func_t func, void *argument, const xf_osal_thread_attr_t *attr)
创建一个线程并将其添加到活动线程中。
void * xf_osal_thread_t
线程句柄。
xf_err_t xf_osal_delay_ms(uint32_t ms)
(睡眠)等待超时,以 ms 为单位。
#define TAG
Definition xf_main.c:24
static const xf_osal_thread_attr_t s_thread_attr
Definition xf_main.c:57
static void _example_thread(void *argument)
Definition xf_main.c:78
static xf_osal_thread_t s_thread_hdl
Definition xf_main.c:53
#define EXAMPLE_DELAY_MS
Definition xf_main.c:35
#define PORT
Definition xf_main.c:34
static const char * payload
Definition xf_main.c:46
#define CLIENT_IP_ADDR
Definition xf_main.c:40
#define KEEPALIVE_COUNT
Definition xf_main.c:38
#define KEEPALIVE_INTERVAL
Definition xf_main.c:37
#define KEEPALIVE_IDLE
Definition xf_main.c:36
线程的属性结构。
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)
#define XF_LOGW(tag, format,...)
#define UNUSED(_x)
xf_wifi 包含 STA、AP 接口。