文章目录
一、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 <rthw.h>
#include <rtthread.h>
#include <wlan_mgnt.h>
#include <wlan_prot.h>
#include <wlan_cfg.h>
#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.);