XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_main.c
浏览该文件的文档.
1
17/* ==================== [Includes] ========================================== */
18
19#include "xf_utils.h"
20#include "xf_wifi.h"
21#include "xf_task.h"
22
23/* ==================== [Defines] =========================================== */
24
25#define EXAMPLE_SCAN_CHANNEL_START 1
26#define EXAMPLE_SCAN_CHANNEL_END 13
27#define EXAMPLE_SCAN_RESULT_SIZE 32
28#define EXAMPLE_SCAN_BLOCK_IS_ENABLE 1
30#if EXAMPLE_SCAN_BLOCK_IS_ENABLE
31# define EXAMPLE_SCAN_BLOCK true
32#else
33# define EXAMPLE_SCAN_BLOCK false
34#endif
35
36#define EXAMPLE_WIFI_NTASK_PRIORITY 15
37#define EXAMPLE_WIFI_NTASK_PERIOD_MS 10
42#define TBL_IT(v) {v, XSTR(v)}
43
44#define EXAMPLE_WIFI_SSID "myssid"
45#define EXAMPLE_WIFI_PASS "mypassword"
47/* ==================== [Typedefs] ========================================== */
48
52typedef struct example_scan_context_s {
53 uint8_t scan_complete;
54 uint8_t curr_scan_channel;
56 uint32_t ap_num;
58
64 const char *msg;
66
67/* ==================== [Static Prototypes] ================================= */
68
69static void _error_check_failed(void);
70static void _wifi_sta_event_handler(
71 xf_wifi_event_id_t event_id, void *event_data, void *user_args);
72static void _ip_event_handler(
73 xf_ip_event_id_t event_id, void *event_data, void *user_args);
74
81static const char *ex_auth_mode_to_name(xf_wifi_auth_mode_t code);
82
93static void _wifi_ntask(xf_task_t task);
94
95/* ==================== [Static Variables] ================================== */
96
97static const char *TAG = "scan";
98
102static ex_scan_ctx_t ctx = {0};
104static uint8_t s_is_connected = false;
105
111 .password = EXAMPLE_WIFI_PASS,
112 .bssid_set = false,
113 .bssid = {0},
114 .authmode = XF_WIFI_AUTH_OPEN,
115 .channel = 0,
116 .p_cfg_ext = NULL,
117 .p_static_ip = NULL,
118};
119
120/* ==================== [Macros] ============================================ */
121
122#define ERROR_CHECK(expression) \
123 do { \
124 if (unlikely((expression) != XF_OK)) { \
125 XF_LOGE(TAG, "An error occurred: %s", XSTR(expression != XF_OK)); \
126 _error_check_failed(); \
127 } \
128 } while (0)
129
130/* ==================== [Global Functions] ================================== */
131
132void xf_main(void)
133{
134 /* 1. 使能 wifi 协议栈 */
136
137 /* 2. 设置 sta 事件回调 */
140
141 /* 3. 启动 sta */
143
144 /* 4. 开始扫描任务 */
148}
149
150/* ==================== [Static Functions] ================================== */
151
153{
155 XF_LOGI(TAG, "_wifi_ntask start!");
156
157 /* 初始化上下文内的变量 */
159 sp_ctx->ap_num = 0;
160
161 for (;;) {
162 /* 启动扫描 */
163 xf_wifi_scan_cfg_t scan_cfg = {
165 .show_hidden = true,
166 };
168
169#if (!EXAMPLE_SCAN_BLOCK_IS_ENABLE)
170 /* 非阻塞时等待扫描结束 */
171 if (false == sp_ctx->scan_complete) {
172 xf_ntask_delay(50);
173 }
174 sp_ctx->scan_complete = false;
175#endif
176
177 /* 保存当前通道的扫描结果,这里只保存 EXAMPLE_SCAN_RESULT_SIZE 条 */
178 uint32_t result_num = 0;
182 &result_num);
183 sp_ctx->ap_num += result_num;
184
195 /* 扫描下一个通道 */
199
200 /* 扫描完毕 */
201
202 int32_t matched_index = -1;
203 int32_t cmp_res = -1;
204
205 /* 输出所有扫描结果 */
206 XF_LOGI(TAG, "done!");
207 XF_LOGI(TAG, "------------------------------");
208 for (uint32_t i = 0;
209 (i < ARRAY_SIZE(sp_ctx->ap_info)) && (i < sp_ctx->ap_num);
210 i++) {
211 XF_LOGI(TAG,
212 "\n"
213 " index: %d\n"
214 " ssid: %s\n"
215 " bssid: " XF_MACSTR "\n"
216 " rssi: %d\n"
217 " authmode: %s\n"
218 " channel: %d",
219 i,
220 sp_ctx->ap_info[i].ssid,
222 sp_ctx->ap_info[i].rssi,
224 (int)sp_ctx->ap_info[i].channel);
225
226 /* 比较扫描到的 SSID 与目标 SSID 是否相同 */
227 cmp_res = strcmp(EXAMPLE_WIFI_SSID, (char *)sp_ctx->ap_info[i].ssid);
228 if ((0 == cmp_res) && (-1 == matched_index)) {
229 /* 只匹配第一个扫描到的 ap */
230 matched_index = i;
231 /* 已知 SSID 和密码,需要配置认证模式和通道 */
232 s_sta_cfg.authmode = sp_ctx->ap_info[matched_index].authmode;
233 s_sta_cfg.channel = sp_ctx->ap_info[matched_index].channel;
234 }
235 } /* for 遍历 ap_info */
236 XF_LOGI(TAG, "------------------------------");
237
238 /* 找到对应的 ap 则连接 */
239 if (matched_index != -1) {
240 XF_LOGI(TAG, "AP(%s) has been found, try to connect.", EXAMPLE_WIFI_SSID);
242 while (1) {
243 xf_ntask_delay(50);
245 break;
246 }
247 }
248 goto l_succ;
249 }
250
251 /* 目标 AP 未找到,清除可能未读完的数据 */
253
254 sp_ctx->ap_num = 0;
255 XF_LOGI(TAG, "AP(%s) Not found", EXAMPLE_WIFI_SSID);
256 xf_ntask_delay(1000);
257 } /* sp_ctx->curr_scan_channel > EXAMPLE_SCAN_CHANNEL_END */
258 } /* for 扫描所有通道 */
259
260l_succ:;
261 /* 连接成功,清除可能未读完的数据 */
263 XF_LOGI(TAG, "successful connection!");
264 XF_NTASK_END();
265}
266
268 xf_wifi_event_id_t event_id, void *event_data, void *user_args)
269{
270 UNUSED(user_args);
271
272 switch (event_id) {
274 XF_LOGI(TAG, "STA has started.");
275 /* 扫描到前未知 ap 通道和认证模式,此处不连接 */
276 } break;
278 XF_LOGI(TAG, "STA has stopped.");
279 } break;
281 s_is_connected = true;
282 XF_LOGI(TAG, "The STA is connected to the AP.");
284 XF_LOGI(TAG,
285 "\nssid: %s\n"
286 "mac: "XF_MACSTR"\n"
287 "channel: %d\n"
288 "authmode: %d",
289 e->ssid, XF_MAC2STR(e->bssid), (int)e->channel, (int)e->authmode);
290 } break;
292 /* 如果之前的状态是已连接 */
293 if (true == s_is_connected) {
294 s_is_connected = false;
295 XF_LOGI(TAG, "The STA has been disconnected from the AP.");
297 XF_LOGI(TAG,
298 "\nssid: %s\n"
299 "mac: "XF_MACSTR"\n"
300 "rssi: %d",
301 e->ssid, XF_MAC2STR(e->bssid), (int)e->rssi);
302 }
303 } break;
305 sp_ctx->scan_complete = true;
306 } break;
307 default:
308 break;
309 }
310}
311
313 xf_ip_event_id_t event_id, void *event_data, void *user_args)
314{
315 switch (event_id) {
316 case XF_IP_EVENT_GOT_IP: {
318 XF_LOGI(TAG, "\n"
319 "got ip: " XF_IPSTR "\n"
320 "got gw: " XF_IPSTR "\n"
321 "got netmask: " XF_IPSTR,
322 XF_IP2STR(&e->ip_info.ip),
323 XF_IP2STR(&e->ip_info.gw),
325 } break;
326 default:
327 break;
328 }
329}
330
332{
333 static const ex_auth_mode_msg_t ex_auth_mode_msg_table[] = {
346 };
347
348 unsigned int i = 0;
349 for (i = 0; i < (unsigned int)ARRAY_SIZE(ex_auth_mode_msg_table); ++i) {
350 if (ex_auth_mode_msg_table[i].code == code) {
351 return ex_auth_mode_msg_table[i].msg;
352 }
353 }
354 return ex_auth_mode_msg_table[ARRAY_SIZE(ex_auth_mode_msg_table) - 1].msg;
355}
356
357static void _error_check_failed(void)
358{
359 XF_LOGI(TAG, "Run-time error.");
360 for (;;) {
361 }
362}
void xf_main(void)
Definition xf_main.c:28
int32_t xf_ip_event_id_t
ip 事件 id。见 xf_ip_event_code_t.
#define XF_IPSTR
#define XF_MACSTR
Definition xf_mac.h:47
#define XF_MAC2STR(a)
Definition xf_mac.h:44
#define XF_IP2STR(ipaddr)
@ XF_IP_EVENT_GOT_IP
#define XF_NTASK_BEGIN(ntask)
Definition xf_ntask.h:193
#define XF_NTASK_END()
Definition xf_ntask.h:199
#define xf_ntask_delay(delay_ms)
Definition xf_ntask.h:229
static xf_task_t xf_ttask_create_loop(xf_task_func_t func, void *func_arg, uint16_t priority, uint32_t delay_ms)
在默认的任务管理下,创建 ttask 循环任务。
Definition xf_task.h:162
#define ARRAY_SIZE(arr)
ARRAY_SIZE - 获取数组 arr 中的元素数量。
Definition xf_predef.h:173
xf_err_t xf_wifi_sta_set_ip_cb(xf_ip_cb_t cb_func, void *user_args)
STA 设置 ip 事件回调函数.
xf_err_t xf_wifi_scan_get_result(xf_wifi_ap_info_t result_array[], uint32_t result_array_size, uint32_t *p_result_num)
wifi 获取扫描结果。
xf_err_t xf_wifi_sta_connect(xf_wifi_sta_cfg_t *p_cfg)
STA 连接到指定 AP.
xf_err_t xf_wifi_scan_start(const xf_wifi_scan_cfg_t *p_cfg, bool block)
wifi 启动 AP 扫描。
bool xf_wifi_sta_is_connected(void)
STA 检查是否已经连接到 AP.
xf_err_t xf_wifi_scan_clear_result(void)
wifi 清除扫描结果。
xf_err_t xf_wifi_sta_set_cb(xf_wifi_cb_t cb_func, void *user_args)
wifi STA 设置回调函数.
xf_err_t xf_wifi_sta_init(const xf_wifi_sta_cfg_t *p_cfg)
启用 wifi STA 模式.
xf_err_t xf_wifi_enable(void)
启用 wifi 协议栈.
enum _xf_wifi_authenticate_mode_t xf_wifi_auth_mode_t
授权模式的强度。 OPEN < WEP < WPA_PSK < OWE < WPA2_PSK = WPA_WPA2_PSK < WAPI_PSK < WPA3_PSK = WPA2_WPA3_PSK
int32_t xf_wifi_event_id_t
wifi 事件 id。见 xf_wifi_event_code_t.
@ XF_WIFI_AUTH_WPA2_PSK
@ XF_WIFI_AUTH_WEP
@ XF_WIFI_AUTH_OPEN
@ XF_WIFI_AUTH_MAX
@ XF_WIFI_AUTH_WPA3_PSK
@ XF_WIFI_AUTH_WPA_WPA2_PSK
@ XF_WIFI_AUTH_ENTERPRISE
@ XF_WIFI_AUTH_WPA_PSK
@ XF_WIFI_AUTH_WPA3_ENT_192
@ XF_WIFI_AUTH_WAPI_PSK
@ XF_WIFI_AUTH_OWE
@ XF_WIFI_AUTH_WPA2_WPA3_PSK
@ XF_WIFI_EVENT_STA_START
@ XF_WIFI_EVENT_SCAN_DONE
@ XF_WIFI_EVENT_STA_DISCONNECTED
@ XF_WIFI_EVENT_STA_STOP
@ XF_WIFI_EVENT_STA_CONNECTED
#define TAG
Definition xf_main.c:24
XF_IP_EVENT_STA_GOT_IP 事件的事件结构。
xf_netif_ip_info_t ip_info
AP 信息。 扫描结果中使用。
uint8_t bssid[XF_MAC_LEN_MAX]
xf_wifi_auth_mode_t authmode
uint8_t ssid[XF_WIFI_SSID_LEN_MAX]
STA 事件消息类型: 已连接到 AP。 事件 id 见 XF_WIFI_EVENT_STA_CONNECTED.
uint8_t bssid[XF_MAC_LEN_MAX]
uint8_t ssid[XF_WIFI_SSID_LEN_MAX]
STA 事件消息类型: 已从 AP 断开连接。 事件 id 见 XF_WIFI_EVENT_STA_DISCONNECTED.
uint8_t bssid[XF_MAC_LEN_MAX]
uint8_t ssid[XF_WIFI_SSID_LEN_MAX]
Parameters for an SSID scan.
STA 基础配置结构体。
uint8_t ssid[XF_WIFI_SSID_LEN_MAX]
认证模式与字符串消息。
Definition xf_main.c:50
扫描任务无栈协程上下文。
Definition xf_main.c:43
xf_wifi_ap_info_t ap_info[EXAMPLE_SCAN_RESULT_SIZE]
Definition xf_main.c:46
uint8_t curr_scan_channel
Definition xf_main.c:45
static void task(xf_task_t task)
Definition xf_main.c:45
#define ERROR_CHECK(expression)
Definition xf_main.c:55
static void _error_check_failed(void)
Definition xf_main.c:119
#define EXAMPLE_WIFI_SSID
Definition xf_main.c:24
#define EXAMPLE_WIFI_PASS
Definition xf_main.c:25
static uint8_t s_is_connected
Definition xf_main.c:63
static xf_wifi_sta_cfg_t s_sta_cfg
Definition xf_main.c:64
#define EXAMPLE_WIFI_NTASK_PERIOD_MS
Definition xf_main.c:37
#define EXAMPLE_SCAN_CHANNEL_START
Definition xf_main.c:25
struct example_authenticate_mode_message_s ex_auth_mode_msg_t
static void _wifi_ntask(xf_task_t task)
Definition xf_main.c:103
#define EXAMPLE_WIFI_NTASK_PRIORITY
Definition xf_main.c:36
#define EXAMPLE_SCAN_CHANNEL_END
Definition xf_main.c:26
static ex_scan_ctx_t ctx
Definition xf_main.c:69
static void _wifi_sta_event_handler(xf_wifi_event_id_t event_id, void *event_data, void *user_args)
Definition xf_main.c:161
#define EXAMPLE_SCAN_BLOCK
Definition xf_main.c:31
#define TBL_IT(v)
Definition xf_main.c:39
static const char * ex_auth_mode_to_name(xf_wifi_auth_mode_t code)
Definition xf_main.c:175
struct example_scan_context_s ex_scan_ctx_t
static ex_scan_ctx_t * sp_ctx
Definition xf_main.c:70
#define EXAMPLE_SCAN_RESULT_SIZE
Definition xf_main.c:27
static void _ip_event_handler(xf_ip_event_id_t event_id, void *event_data, void *user_args)
Definition xf_main.c:181
#define XF_LOGI(tag, format,...)
void * xf_task_t
任务句柄。
#define UNUSED(_x)
xf_wifi 包含 STA、AP 接口。