【rtthread番外】第零篇:wlan框架

一、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.);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值