Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
学习笔记
【rtthread高级】第零篇:wlan框架
发布于 2021-05-16 19:12:17 浏览:1506
订阅该版
[tocm] # 一、rtthread wlan框架 wlan框架是rtthread用于管理wifi的中间件,对下连接硬件,控制连接、扫描, 对上承载不同的应用,为应用提供 WIFI 控制,事件,数据导流等操作。 # 二、wlan api ## 2.1 初始化相关api ``` //设置wlan模式 /* dev_name:wlan设备名称 mode:工作模式,可取 RT_WLAN_NONE, /* 停 止 工 作 模 式 */ RT_WLAN_STATION, /* 无 线 终 端 模 式 */ RT_WLAN_AP, /* 无 线 接 入 服 务 模 式 */ RT_WLAN_MODE_MAX /* 无 效 */ */ rt_err_t rt_wlan_set_mode(const char *dev_name, rt_wlan_mode_t mode) //获取设备模式 /* dev_name:设备名称,系统默认 */ rt_wlan_mode_t rt_wlan_get_mode(const char *dev_name) ``` ## 2.2 连接相关api ``` //阻塞式连接热点,连接成功还需要热点准备好才能进行数据通信。 /* ssid:热点名称 password:热点密码 */ rt_err_t rt_wlan_connect(const char *ssid, const char *password) //无阻塞连接 /* info:连接信息 passoword:热点密码 */ rt_err_t rt_wlan_connect_adv(struct rt_wlan_info *info, const char *password) //阻塞式断开连接 rt_err_t rt_wlan_disconnect(void) //获取连接状态 rt_bool_t rt_wlan_is_connected(void) //获取就绪状态 rt_bool_t rt_wlan_is_ready(void) //获取连接信息 /* info:连接信息结构体 */ rt_err_t rt_wlan_get_info(struct rt_wlan_info *info) //获取信号强度 int rt_wlan_get_rssi(void) ``` ## 2.3 扫描相关api ``` //启动扫描 rt_err_t rt_wlan_scan(void) //同步扫描 struct rt_wlan_scan_result *rt_wlan_scan_sync(void) //条件扫描 /* info:连接信息结构体指针 */ struct rt_wlan_scan_result *rt_wlan_scan_with_info(struct rt_wlan_info *info) //获取连接个数 int rt_wlan_scan_get_result_num(void) //获取连接信息 /* info:连接信息结构体指针 num:要获取的连接信息个数 */ int rt_wlan_scan_get_info(struct rt_wlan_info *info, int num) //获取扫描缓存 struct rt_wlan_scan_result *rt_wlan_scan_get_result(void) //清理扫描缓存 void rt_wlan_scan_result_clean(void) //查找最佳热点 /* ssid:指定ssid info:连接信息结构体指针 */ rt_bool_t rt_wlan_find_best_by_cache(const char *ssid, struct rt_wlan_info *info) ``` ## 2.4 热点相关api ``` //启动热点 /* ssid:热点名称 password:热点密码 */ rt_err_t rt_wlan_start_ap(const char *ssid, const char *password) //无阻塞启动热点 /* info:热点信息 */ rt_err_t rt_wlan_start_ap_adv(struct rt_wlan_info *info, const char *password) //获取启动状态 rt_bool_t rt_wlan_ap_is_active(void) //停止热点 rt_err_t rt_wlan_ap_stop(void) //获取热点信息 /* info:连接信息结构体 */ rt_err_t rt_wlan_ap_get_info(struct rt_wlan_info *info) ``` ## 2.5 自动重连api ``` //使/失能自动重连 /* enable:使/失能 */ void rt_wlan_config_autoreconnect(rt_bool_t enable) //获取自动重连模式 /* 返回RT_TRUE:当前使能自动重连 返回RT_FALSE:当前失能自动重连 */ rt_bool_t rt_wlan_get_autoreconnect_mode(void) ``` ## 2.6 事件注册回调api ``` //注册事件回调函数 /* event:事件类型 handle:回调函数 parameter:回调函数参数 */ rt_err_t rt_wlan_register_event_handler(rt_wlan_event_t event, rt_wlan_event_handler handler, void *parameter) //注销事件回调函数 rt_err_t rt_wlan_unregister_event_handler(rt_wlan_event_t event) ``` ## 2.7 功耗管理api ``` //设置功耗等级 /* level:功耗等级 */ rt_err_t rt_wlan_set_powersave(int level) //获取功耗等级 int rt_wlan_get_powersave(void) ``` ### 连接信息 ``` struct rt_wlan_info { rt_wlan_security_t security; /* 安 全 类 型 */ rt_802_11_band_t band; /* 2.4G / 5G */ rt_uint32_t datarate; /* 连 接 速 率 */ rt_int16_t channel; /* 通 道 */ rt_int16_t rssi; /* 信 号 强 度 */ rt_wlan_ssid_t ssid; /* 热 点 名 称 */ rt_uint8_t bssid[RT_WLAN_BSSID_MAX_LENGTH]; /* 热 点 物 理 地 址 */ rt_uint8_t hidden; /* 热 点 隐 藏 标 志 */ }; ``` ### 安全模式 ``` typedef enum { SECURITY_OPEN = 0, /* Open security */ SECURITY_WEP_PSK = WEP_ENABLED, /* WEP Security with open authentication */ SECURITY_WEP_SHARED = (WEP_ENABLED | SHARED_ENABLED), /* WEP Security with shared authentication */ SECURITY_WPA_TKIP_PSK = (WPA_SECURITY | TKIP_ENABLED), /* WPA Security with TKIP */ SECURITY_WPA_AES_PSK = (WPA_SECURITY | AES_ENABLED), /* WPA Security with AES */ SECURITY_WPA2_AES_PSK = (WPA2_SECURITY | AES_ENABLED), /* WPA2 Security with AES */ SECURITY_WPA2_TKIP_PSK = (WPA2_SECURITY | TKIP_ENABLED), /* WPA2 Security with TKIP */ SECURITY_WPA2_MIXED_PSK = (WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED), /* WPA2 Security with AES & TKIP */ SECURITY_WPS_OPEN = WPS_ENABLED, /* WPS with open security */ SECURITY_WPS_SECURE = (WPS_ENABLED | AES_ENABLED), /* WPS with AES security */ SECURITY_UNKNOWN = -1, /* security is unknown. */ } rt_wlan_security_t; ``` ### 扫描结果结构体 ``` struct rt_wlan_scan_result { rt_int32_t num; /* 热 点 个 数 */ struct rt_wlan_info *info; /* 热 点 信 息 */ }; ``` ### 事件类型 ``` typedef enum { RT_WLAN_EVT_READY = 0, /* 网 络 就 绪 */ RT_WLAN_EVT_SCAN_DONE, /* 扫 描 完 成 */ RT_WLAN_EVT_SCAN_REPORT, /* 扫 描 到 一 个 热 点 */ RT_WLAN_EVT_STA_CONNECTED, /* 连 接 成 功 */ RT_WLAN_EVT_STA_CONNECTED_FAIL, /* 连 接 失 败 */ RT_WLAN_EVT_STA_DISCONNECTED, /* 断 开 连 接 */ RT_WLAN_EVT_AP_START, /* 热 点 启 动 */ RT_WLAN_EVT_AP_STOP, /* 热 点 停 止 */ RT_WLAN_EVT_AP_ASSOCIATED, /* STA 接 入 */ RT_WLAN_EVT_AP_DISASSOCIATED, /* STA 断 开 */ } rt_wlan_event_t; ``` ### 事件回调函数中的buff涵义 ``` 回调标志 涵义 描述 RT_WLAN_EVT_READY ip_addr_t * IP 地址 RT_WLAN_EVT_SCAN_DONE struct rt_wlan_scan_result * 扫描的结果 RT_WLAN_EVT_SCAN_REPORT struct rt_wlan_info * 扫描到的热点信息 RT_WLAN_EVT_STA_CONNECTED struct rt_wlan_info * 连接成功的 Station 信息 RT_WLAN_EVT_STA_CONNECTED_FAIL struct rt_wlan_info * 连接失败的 Station 信息 RT_WLAN_EVT_STA_DISCONNECTEDstruct rt_wlan_info * 断开连接的 Station 信息 RT_WLAN_EVT_AP_START struct rt_wlan_info * 启动成功的 AP 信息 RT_WLAN_EVT_AP_STOP struct rt_wlan_info * 启动失败的 AP 信息 RT_WLAN_EVT_AP_ASSOCIATED struct rt_wlan_info * 连入的 Station 信息 RT_WLAN_EVT_AP_DISASSOCIATEDstruct rt_wlan_info * 断开的 Station 信息 ``` # 三、wlan示例 ``` #include
#include
#include
#include
#include
#define WLAN_SSID "SSID-A" #define WLAN_PASSWORD "12345678" #define NET_READY_TIME_OUT (rt_tick_from_millisecond(15 * 1000)) static rt_sem_t net_ready = RT_NULL; static void wifi_ready_callback(int event, struct rt_wlan_buff *buff, void *parameter) { rt_kprintf("%s\n", __FUNCTION__); rt_sem_release(net_ready); } static void wifi_connect_callback(int event, struct rt_wlan_buff *buff, void *parameter) { rt_kprintf("%s\n", __FUNCTION__); if ((buff != RT_NULL) && (buff->len == sizeof(struct rt_wlan_info))) { rt_kprintf("ssid : %s \n", ((struct rt_wlan_info *)buff->data)->ssid.val); } } static void wifi_disconnect_callback(int event, struct rt_wlan_buff *buff, void *parameter) { rt_kprintf("%s\n", __FUNCTION__); if ((buff != RT_NULL) && (buff->len == sizeof(struct rt_wlan_info))) { rt_kprintf("ssid : %s \n", ((struct rt_wlan_info *)buff->data)->ssid.val); } } static void wifi_connect_fail_callback(int event, struct rt_wlan_buff *buff, void *parameter) { rt_kprintf("%s\n", __FUNCTION__); if ((buff != RT_NULL) && (buff->len == sizeof(struct rt_wlan_info))) { rt_kprintf("ssid : %s \n", ((struct rt_wlan_info *)buff->data)->ssid.val); } } rt_err_t wifi_connect(void) { rt_err_t result = RT_EOK; /* Configuring WLAN device working mode */ rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION); /* station connect */ rt_kprintf("start to connect ap ...\n"); net_ready = rt_sem_create("net_ready", 0, RT_IPC_FLAG_FIFO); rt_wlan_register_event_handler(RT_WLAN_EVT_READY, wifi_ready_callback, RT_NULL); rt_wlan_register_event_handler(RT_WLAN_EVT_STA_CONNECTED, wifi_connect_callback, RT_NULL); rt_wlan_register_event_handler(RT_WLAN_EVT_STA_DISCONNECTED, wifi_disconnect_callback, RT_NULL); rt_wlan_register_event_handler(RT_WLAN_EVT_STA_CONNECTED_FAIL, wifi_connect_fail_callback, RT_NULL); /* connect wifi */ result = rt_wlan_connect(WLAN_SSID, WLAN_PASSWORD); if (result == RT_EOK) { /* waiting for IP to be got successfully */ result = rt_sem_take(net_ready, NET_READY_TIME_OUT); if (result == RT_EOK) { rt_kprintf("networking ready!\n"); } else { rt_kprintf("wait ip got timeout!\n"); } rt_wlan_unregister_event_handler(RT_WLAN_EVT_READY); rt_sem_delete(net_ready); rt_thread_delay(rt_tick_from_millisecond(5 * 1000)); rt_kprintf("wifi disconnect test!\n"); /* disconnect */ result = rt_wlan_disconnect(); if (result != RT_EOK) { rt_kprintf("disconnect failed\n"); return result; } rt_kprintf("disconnect success\n"); } else { rt_kprintf("connect failed!\n"); } return result; } int connect(int argc, char *argv[]) { wifi_connect(); return 0; } MSH_CMD_EXPORT(connect, connect test.); ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
happycode999
这家伙很懒,什么也没写!
文章
28
回答
6
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部