1 概述
1.1 目的
本文介绍平头哥YoC平台WiFi 驱动框架接口的使用和如何适配新的WiFi驱动。
1.2 WiFi驱动框架介绍
WiFi驱动框架主要有27个hal_wifi接口组成。接口如下:
int hal_wifi_init(dev_t *dev);
int hal_wifi_deinit(dev_t *dev);
int hal_wifi_reset(dev_t *dev);
int hal_wifi_set_mode(dev_t *dev, wifi_mode_t mode);
int hal_wifi_get_mode(dev_t *dev, wifi_mode_t *mode);
int hal_wifi_install_event_cb(dev_t *dev, wifi_event_func *evt_cb);
int hal_wifi_set_protocol(dev_t *dev, uint8_t protocol_bitmap);
int hal_wifi_get_protocol(dev_t *dev, uint8_t *protocol_bitmap);
int hal_wifi_set_country(dev_t *dev, wifi_country_t country);
int hal_wifi_get_country(dev_t *dev, wifi_country_t *country);
int hal_wifi_set_mac_addr(dev_t *dev, const uint8_t *mac);
int hal_wifi_get_mac_addr(dev_t *dev, uint8_t *mac);
int hal_wifi_set_auto_reconnect(dev_t *dev, bool en);
int hal_wifi_get_auto_reconnect(dev_t *dev, bool *en);
int hal_wifi_set_ps(dev_t *dev, wifi_ps_type_t type);
int hal_wifi_get_ps(dev_t *dev, wifi_ps_type_t *type);
int hal_wifi_power_on(dev_t *dev);
int hal_wifi_power_off(dev_t *dev);
int hal_wifi_start_scan(dev_t *dev, wifi_scan_config_t *config, bool block);
int hal_wifi_start(dev_t *dev, wifi_config_t *config);
int hal_wifi_stop(dev_t *dev);
int hal_wifi_sta_get_link_status(dev_t *dev, wifi_ap_record_t *ap_info);
int hal_wifi_ap_get_sta_list(dev_t *dev, wifi_sta_list_t *sta);
int hal_wifi_start_monitor(dev_t *dev, wifi_promiscuous_cb_t cb);
int hal_wifi_stop_monitor(dev_t *dev);
int hal_wifi_send_80211_raw_frame(dev_t *dev, void *buffer, uint16_t len);
int hal_wifi_set_channel(dev_t *dev, uint8_t primary, wifi_second_chan_t second);
int hal_wifi_get_channel(dev_t *dev, uint8_t *primary, wifi_second_chan_t *second);
其中包括了三种WiFi模式的启动停止和切换:STA,AP,Promiscuous。各种参数的设置和获取:protocol, country_code, mode, lpm, channel,lpm。WiFi驱动的适配层需要适配这些接口的操作函数OPS,其结构如下:
typedef struct wifi_driver {
/** common APIs */
int (*init)(aos_dev_t *dev);
int (*deinit)(aos_dev_t *dev);
int (*reset)(aos_dev_t *dev);
int (*set_mode)(aos_dev_t *dev, wifi_mode_t mode);
int (*get_mode)(aos_dev_t *dev, wifi_mode_t *mode);
int (*install_event_cb)(aos_dev_t *dev, wifi_event_func *evt_cb);
/** conf APIs */
int (*set_protocol)(aos_dev_t *dev, uint8_t protocol_bitmap); //11bgn
int (*get_protocol)(aos_dev_t *dev, uint8_t *protocol_bitmap);
int (*set_country)(aos_dev_t *dev, wifi_country_t country);
int (*get_country)(aos_dev_t *dev, wifi_country_t *country);
int (*set_mac_addr)(aos_dev_t *dev, const uint8_t *mac);
int (*get_mac_addr)(aos_dev_t *dev, uint8_t *mac);
int (*set_auto_reconnect)(aos_dev_t *dev, bool en);
int (*get_auto_reconnect)(aos_dev_t *dev, bool *en);
int (*set_lpm)(aos_dev_t *dev, wifi_lpm_mode_t mode); //ps on/pff
int (*get_lpm)(aos_dev_t *dev, wifi_lpm_mode_t *mode);
int (*power_on)(aos_dev_t *dev); //the wifi module power on/off
int (*power_off)(aos_dev_t *dev);
/** connection APIs */
int (*start_scan)(aos_dev_t *dev, wifi_scan_config_t *config, bool block);
int (*start)(aos_dev_t *dev, wifi_config_t * config); //start ap or sta
int (*stop)(aos_dev_t *dev);//stop ap or sta
int (*sta_get_link_status)(aos_dev_t *dev, wifi_ap_record_t *ap_info);
int (*ap_get_sta_list)(aos_dev_t *dev, wifi_sta_list_t *sta);
/** promiscuous APIs */
int (*start_monitor)(aos_dev_t *dev, wifi_promiscuous_cb_t cb);
int (*stop_monitor)(aos_dev_t *dev);
int (*send_80211_raw_frame)(aos_dev_t *dev, void *buffer, uint16_t len);
int (*set_channel)(aos_dev_t *dev, uint8_t primary, wifi_second_chan_t second);
int (*get_channel)(aos_dev_t *dev, uint8_t *primary, wifi_second_chan_t *second);
} wifi_driver_t;
以上的wifi_dirver_t 结构体需要适配层实现。其具体说明在第二章节。
1.3 WiFi模式调用
WiFI 模式主要包括三种:STA,AP,Promiscuous。下面说明各个模式的调用方法。
1.3.1 STA
STA 模式是做常用的模式,即用于连接WiFi 热点进行网络通讯。 其调用示例代码如下:
wifi_config_t wifi_config
aos_dev_t *dev = device_open_id("wifi", 0);
wifi_config.mode = WIFI_MODE_STA;
strcpy(wifi_config.ssid, config->ssid_psk.ssid);
strcpy(wifi_config.password, config->ssid_psk.psk);
hal_wifi_start(dev, &wifi_config);
//do something
hal_wifi_stop(dev);
device_close(dev);
通过 hal_wifi_start 接口和 wifi_config_t 配置结构体来启动STA 模式,启动后驱动会通过异步连接,并通过event_publish 的方式,通知netmgr联网成功。
1.3.2 AP
AP模式会发出wifi 热点,允许其他STA来连接设备。一般用于WiFi配网。 其调用示例代码如下:
wifi_config_t wifi_config
aos_dev_t *dev = device_open_id("wifi", 0);
wifi_config.mode = WIFI_MODE_AP;
strcpy(wifi_config.ssid, config->ssid_psk.ssid);
strcpy(wifi_config.password, config->ssid_psk.psk);
hal_wifi_start(dev, &wifi_config);
//do something
hal_wifi_stop(dev);
device_close(dev);
与STA模式相同,AP模式也是通过hal_wifi_start 启动,启动后会等待sta的连接,可以通过 hal_wifi_ap_get_sta_list 来获取STA 状态。
1.3.3 Promiscuous
Promiscuous(混杂模式),可以监听空中的报文。一般用于WiFi配网。 其调用示例代码如下:
aos_dev_t *dev = device_open_id("wifi", 0);
hal_wifi_start_monitor(dev, smartconfig_callback);
//do something
hal_wifi_stop_monitor(dev);
device_close(dev);
2 适配说明
如第一章中所述,WiFi驱动提供了适配层结构体wifi_driver_t 需要新的wifi驱动对接时实现。下面对适配的数据结构和函数逐一进行介绍。
2.1 错误码
适配接口统一使用如下的错误码:
错误码 | 含义 |
---|---|
WIFI_ERR_OK | 没有错误 |
WIFI_ERR_NO_MEM | 无内存可以使用 |
WIFI_ERR_ARG | 错误的参数 |
WIFI_ERR_NOT_SUPPORT | 这个API还未被支持 |
WIFI_ERR_FAIL | 通用的错误码 |
WIFI_ERR_NOT_INIT | WiFi驱动还没有被初始化 |
WIFI_ERR_INIT | WiFi驱动已经被初始化了 |
WIFI_ERR_NOT_START | WiFi驱动还没有被开启 |
WIFI_ERR_START | WiFi驱动启动错误 |
WIFI_ERR_IF | WiFi接口错误 |
WIFI_ERR_MODE | WiFi模式错误 |
WIFI_ERR_STATE | WiFi内部状态错误 |
WIFI_ERR_HANDLE | WiFi句柄错误 |
WIFI_ERR_AUTHMODE | WiFi鉴权模式错误 |
WIFI_ERR_MAC | WiFi MAC地址错误 |
WIFI_ERR_SSID | WiFi SSID无效 |
WIFI_ERR_PASSWORD | 密码无效 |
WIFI_ERR_TIMEOUT | API超时 |
WIFI_ERR_WAKE_FAIL | 唤醒WiFi失败 |
2.2 初始化WiFi实例
- 函数原型
int (*init)(dev_t *dev);
功能描述 初始化WiFi实例
参数描述
IN/OUT | NAME | DESC |
---|---|---|
IN | dev | WiFi模块的设备句柄 |
- 返回值
RETURN | DESC |
---|---|
WIFI_ERR_OK | 成功 |
其余 | 失败,参考wifi_err_code_t的定义 |
2.3 去初始化WiFi实例
- 函数原型
int (*deinit)(dev_t *dev);
功能描述 去初始化WiFi实例
参数描述
IN/OUT | NAME | DESC |
---|---|---|
IN | dev | WiFi模块的设备句柄 |
- 返回值
RETURN | DESC |
---|---|
WIFI_ERR_OK | 成功 |
其余 | 失败,参考wifi_err_code_t的定义 |
2.4 设置WiFi模式
- 函数原型
int (*set_mode)(dev_t *dev, wifi_mode_t mode);
功能描述 设备WiFi的工作模式,适用于不同的应用场景,开机默认是STA模式。
参数描述
IN/OUT | NAME | DESC |
---|---|---|
IN | dev | WiFi模块的设备句柄 |
IN | mode | WiFi的工作模式 |
其mode定义如下: | wifi_mode_t 枚举定义 | | | - | - | | WIFI_MODE_NULL|空模式 | | WIFI_MODE_STA| STA模式 | | WIFI_MODE_AP | AP模式 | | WIFI_MODE_MONITOR | 监听模式 | | WIFI_MODE_APSTA | STA+AP模式 | | WIFI_MODE_P2P | P2P模式 | | WIFI_MODE_MAX | 枚举末尾 |
- 返回值
RETURN | DESC |
---|---|
WIFI_ERR_OK | 成功 |
其余 | 失败,参考wifi_err_code_t的定义 |
2.5 获取WiFi工作模式
- 函数原型
int (*get_mode)(dev_t *dev, wifi_mode_t *mode);
功能描述 获取WiFi工作模式。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | mode | WiFi的工作模式|
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.6 注册事件回调函数
- 函数原型
int (*install_event_cb)(dev_t *dev, wifi_event_func *evt_cb);
功能描述 注册事件回调函数。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | evt_cb | 事件回调函数|
其中 evt_cb 定义如下: | wifi_event_func 结构体定义 | | | - | - | | void (sta_connect_fail)(dev_t dev, wifi_err_code_t err, void arg); |STA连接网络失败了 | | void (status_change)(dev_t dev, wifi_event_id_t stat, void arg); | 当前有状态发生了变化 | | void (scan_compeleted)(dev_t dev, uint16_t number, wifi_ap_record_t ap_records); | 扫描已经结束,返回扫描的数量和扫描结果 | | void (fatal_err)(dev_t dev, void arg); | 出现了严重问题 |
事件id 如下 | wifi_event_id_t 枚举定义 | | | ---------------------- | ---------- | | WIFI_EVENT_WIFI_READY | WiFi就绪 | | WIFI_EVENT_SCAN_DONE | 扫描结束 | | WIFI_EVENT_STA_START | 开启一个STA | | WIFI_EVENT_STA_STOP | 结束一个STA | | WIFI_EVENT_STA_CONNECTED | STA连上了AP | | WIFI_EVENT_STA_DISCONNECTED | STA从AP断开 | | WIFI_EVENT_STA_AUTHMODE_CHANGE | STA连接的AP的鉴权方式改变 | | WIFI_EVENT_STA_GOT_IP | STA从AP拿到了IP | | WIFI_EVENT_AP_START | AP模式 打开 | | WIFI_EVENT_AP_STOP | AP模式 停止 | | WIFI_EVENT_AP_STACONNECTED | AP上有STA连接 | | WIFI_EVENT_AP_STADISCONNECTED | AP上有STA断开 | | WIFI_EVENT_AP_PROBEREQRECVED | AP上有Probe request收到 | | WIFI_EVENT_AP_STA_GOT_IP6 | STA/AP 优先拿到IPV6地址 | | WIFI_EVENT_MAX | 最大枚举值 |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.7 设置当前协议版本
- 函数原型
int (*set_protocol)(dev_t *dev, uint8_t protocol_bitmap);
功能描述 设置当前协议版本, 当前支持的模式是11b/11bg/11bgn模式 设置当前WiFi的协议版本,默认值是
WIFI_PROTOCOL_11B|WIFI_PROTOCOL_11G|WIFI_PROTOCOL_11N
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | protocol_bitmap | WiFi协议支持的bitmap|
protocol_bitmap 枚举定义 | |
---|---|
#define WIFI_PROTOCOL_11B 1 | 802.11B |
#define WIFI_PROTOCOL_11G 2 | 802.11G |
#define WIFI_PROTOCOL_11N 4 | 802.11N |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.8 获取当前协议版本
- 函数原型
int (*get_protocol)(dev_t *dev, uint8_t *protocol_bitmap);
功能描述 获取当前协议设置的bitmap
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | protocol_bitmap | WiFi协议支持的bitmap|
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.9 设置国家码
- 函数原型
int (*set_country)(dev_t *dev, wifi_country_t country);
- 功能描述 设置国家码。默认值是中国(WIFI_COUNTRY_CN)
- 参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | country | wifi_country_t规定的国家码 |
wifi_country_t 枚举定义 | |
---|---|
WIFI_COUNTRY_CN | 中国,信道号 [1, 14] |
WIFI_COUNTRY_JP | 日本,信道号 [1, 14] |
WIFI_COUNTRY_US | 美国,信道号 [1, 11] |
WIFI_COUNTRY_EU | 欧洲,信道号 [1, 13] |
WIFI_COUNTRY_MAX | 枚举最大值 |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.10 获取国家码
- 函数原型
int (*get_country)(dev_t *dev, wifi_country_t *country);
功能描述 获取当前设置的国家码
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | country | wifi_country_t规定的国家码 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.11 设置MAC地址
- 函数原型
int (*set_mac_addr)(dev_t *dev, const uint8_t *mac);
功能描述 设置WiFi芯片的MAC地址。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | MAC | MAC地址 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.12 获取MAC地址
- 函数原型
int (*get_mac_addr)(dev_t *dev, uint8_t *mac);
功能描述 获取WiFi芯片的MAC地址。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | MAC | MAC地址 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.13 设置自动重连
- 函数原型
int (*set_auto_reconnect)(dev_t *dev, bool en);
功能描述 设置WiFi断开之后是否要自动重连连接。默认是打开的,
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | en | 是否打开自动连接,分为true和false |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.14 获取当前自动重连状态
- 函数原型
int (*get_auto_reconnect)(dev_t *dev, bool *en);
功能描述 获取WiFi断链之后是否自动重连。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | en | 是否打开自动连接,分为true和false |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.15 设置省电模式
- 函数原型
int (*set_lpm)(aos_dev_t *dev, wifi_lpm_mode_t mode);
功能描述 设置当前的省电类型,默认的类型是无省电功能(WIFI_LPM_NONE)
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | mode | 省电模式的类型 |
其中 mode 枚举如下: | wifi_lpm_mode_t 枚举定义 | | | - | - | | WIFI_LPM_NONE | 无低功耗模式 | | WIFI_LPM_KEEP_SOCKET | 低功耗,保持TCP/IP socket 通讯 | | WIFI_LPM_KEEP_LINK | 低功耗,保持 WiFI Link 连接 | | WIFI_LPM_POWEROFF | 低功耗,关机 |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.16 获取当前省电模式
- 函数原型
int (*get_lpm)(aos_dev_t *dev, wifi_lpm_mode_t *mode);
功能描述 获取当前的省电模式的类型
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | mode | 省电模式的类型 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.17 打开WiFi电源
- 函数原型
int (*power_on)(dev_t *dev);
功能描述 打开WiFi芯片的电源
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.18 关闭WiFi电源
- 函数原型
int (*power_off)(dev_t *dev);
功能描述 关闭WiFi芯片的电源
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.19 扫描周围热点
- 函数原型
int (*start_scan)(dev_t *dev, wifi_scan_config_t *config, bool block);
功能描述 扫描周围环境中的所有AP。注意到每一个信道的最大的扫描时间是1500ms,这样会导致STA意外断开,这个是不会推荐的。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | config | 扫描的配置 | | IN | block | 如果是true,扫描结束后才会返回 |
其中 config 结构如下: | wifi_scan_config_t 结构体定义 | | | - | - | | uint8_t ssid[MAX_SSID_SIZE + 1] | AP的SSID | | uint8_t bssid[6] | AP的MAC地址 | | uint8_t channel | 扫描对应的信道 | | bool show_hidden | 扫描隐藏的SSID | | wifi_scan_type_t scan_type | 扫描的类型:主动或者被动扫描 | | wifi_scan_time_t scan_time | 每一个信道的扫描时间 |
wifi_scan_type_t 枚举定义 | |
---|---|
WIFI_SCAN_TYPE_ACTIVE | 主动扫描 |
WIFI_SCAN_TYPE_PASSIVE | 被动扫描 |
wifi_active_scan_time_t 结构体定义 | |
---|---|
wifi_active_scan_time_t active | 在每一个信道的主动扫描时间 |
uint32_t passive | 在每一个信道的被动扫描时间, 单位: ms |
wifi_scan_time_t 结构体定义 | |
---|---|
uint32_t min | 每一个信道的最小主动扫描时间, 单位: ms |
uint32_t max | 每一个信道的最大主动扫描时间, 单位: ms |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.20 启动WiFi
- 函数原型
int (*start)(dev_t *dev, wifi_config_t * config);
功能描述 开启一个WiFi连接,一般是一个STA或者AP连接
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | config | WiFi连接配置 |
其中 config 结构如下: | wifi_config_t 结构体定义 | | | - | - | | wifi_mode_t mode | WiFi工作模式 | | char ssid[32 + 1] | 需要连接AP的SSID | | char password[64 + 1] | 需要连接AP的PASSWORD,路由器不加密可以为空 | | wifi_config_sta_adv_t sta_config | 在STA模式下面的配置 | | wifi_config_ap_adv_t ap_config | 在AP模式下面的配置 | | wifi_config_sec_adv_t sec_config | 额外配置的安全参数 |
wifi_config_sta_adv_t 结构体定义 | |
---|---|
int present | 默认是0,如果需要启用这个结构体,设为1 |
uint8_t listen_interval | STA的监听间隔,默认是0 |
char bssid[6] | 设定目标AP的BSSID,默认是空 |
uint8_t channel | 如果指定了可以加快连接AP的速度,默认是0 |
wifi_config_ap_adv_t 结构体定义 | |
---|---|
int present | 默认是0,如果需要启用这个结构体,设为1 |
uint8_t dtim_interval | AP的DTIM间隔,默认是0,驱动自动选择 |
uint8_t channel | AP的信道,默认是0,驱动自动选择 |
uint8_t beacon_interval | AP的信标间隔,默认是0,驱动自动选择 |
int hide_ssid | 隐藏AP的SSID,默认是0 |
int max_sta_number | AP上连接的最大客户端数量 |
wifi_config_sec_adv_t 结构体定义 | |
---|---|
int present | 默认是0,如果需要启用这个结构体,设为1 |
wifi_auth_mode_t auth_mode | WiFi 的鉴权, WEP/WPA, ... |
wifi_wep_key_t wep_keys | WEP 密码,当鉴权是WEP才需要填写 |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.21 停止WiFi
- 函数原型
int (*stop)(dev_t *dev);
功能描述 关闭由start函数打开的WiFi连接
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.22 STA获取AP状态
- 函数原型
int (*sta_get_link_status)(dev_t *dev, wifi_ap_record_t *ap_info);
功能描述 作为一个STA,获取当前的链路状态,是否已连接。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | ap_info | 获取链路上AP的信息 |
其中 ap_info 结构如下: | wifi_ap_record_t 结构体定义 | | | - | - | | wifi_status_link_t link_status | 如果这里显示链路断开,那么下列的变量就不能使用 | | uint8_t bssid[6] | AP的MAC地址 | | uint8_t ssid[MAX_SSID_SIZE + 1] | AP的SSID | | uint8_t channel | AP的信道 | | int8_t rssi | AP的信号强度 | | wifi_second_chan_t second | AP的第二个信道 | | wifi_encrypt_type_t encryptmode | AP的加密模式 | | wifi_auth_mode_t authmode | AP的鉴权模式 |
wifi_status_link_t 枚举定义 | |
---|---|
WIFI_STATUS_LINK_DISCONNECTED | 链路断开 |
WIFI_STATUS_LINK_CONNECTED | 链路已连接 |
wifi_second_chan_t 枚举定义 | |
---|---|
WIFI_SECOND_CHAN_NONE | 信道是20MHZ的 |
WIFI_SECOND_CHAN_ABOVE | 信道是40MHZ的,次信道在上面 |
WIFI_SECOND_CHAN_BELOW | 信道是40MHZ的,次信道在下面 |
wifi_encrypt_type_t 枚举定义 | |
---|---|
WIFI_ENC_WEP | WEP 加密 |
WIFI_ENC_OPEN | 无加密 |
WIFI_ENC_TKIP | WPA TKIP 加密 |
WIFI_ENC_AES | WPA AES 加密 |
WIFI_ENC_TKIP_AES_MIX | WPA TKIP AES混合加密 |
WIFI_ENC_MAX | 枚举最大值 |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.23 AP获取STA列表
- 函数原型
int (*ap_get_sta_list)(dev_t *dev, wifi_sta_list_t *sta);
功能描述 获取连接到AP上的所有STA
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | sta | STA列表 |
其中 sta 结构体如下: | wifi_sta_list_t 枚举定义 | | | - | - | | wifi_sta_info_t sta[HAL_WIFI_MAX_CONN_NUM] | STA列表 | | int num | AP上连接的STA数量 |
wifi_sta_info_t 枚举定义 | |
---|---|
uint8_t mac[6] | 连接到AP的STA的MAC地址 |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.24 开始WiFi混杂模式
- 函数原型
int (*start_monitor)(dev_t *dev, wifi_promiscuous_cb_t cb);
功能描述 这里注册了一个混杂模式的监听回调函数。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | cb | 回调函数 |
其中cb 回调函数定义如下:每当一个数据包收到的时候,这个函数会被回调。
typedef void (* wifi_promiscuous_cb_t)(wifi_promiscuous_pkt_t *buf, wifi_promiscuous_pkt_type_t type);
wifi_promiscuous_pkt_t 枚举定义 | |
---|---|
wifi_pkt_rx_ctrl_t rx_ctrl | 包头 |
uint8_t payload[0] | ieee80211数据包,长度在sig_len里面指定。 |
wifi_promiscuous_pkt_t 枚举定义 | |
---|---|
signed rssi: 8 | 数据包的信号强度 |
unsigned rate: 5 | 速率 |
unsigned : 1 | 保留字段 |
unsigned sig_mode: 2 | 1代表是1n数据包,0不是11n数据包 |
unsigned : 16 | 保留字段 |
unsigned mcs: 7 | 11N数据包的MCS |
unsigned cwb: 1 | 11N数据包是否是40MHZ带宽 |
unsigned : 16 | 保留字段 |
unsigned smoothing: 1 | 保留字段 |
unsigned not_sounding: 1 | 保留字段 |
unsigned : 1 | 保留字段 |
unsigned aggregation: 1 | 是否使用帧聚合 |
unsigned stbc: 2 | 是否启用STBC |
unsigned fec_coding: 1 | 是否启用LDPC |
unsigned sgi: 1 | 是否启用ShortGI |
unsigned noise_floor: 8 | 背景噪声 |
unsigned ampdu_cnt: 8 | ampdu的数量 |
unsigned channel: 4 | 数据包所在的信道 |
unsigned : 12 | 保留字段 |
unsigned timestamp: 32 | 时间戳 |
unsigned : 32 | 保留字段 |
unsigned : 32 | 保留字段 |
unsigned sig_len: 12 | 数据包的真实长度 |
unsigned : 12 | 保留字段 |
unsigned rx_state: 8 | RX的状态 |
wifi_promiscuous_pkt_type_t 枚举定义 | |
---|---|
WIFI_PKT_CTRL | 控制类型, 数据包的buf是 wifi_pkt_rx_ctrl_t |
WIFI_PKT_MGMT | 管理类型, 数据包的buf是 wifi_promiscuous_pkt_t |
WIFI_PKT_DATA | 数据类型, 数据包的buf是 wifi_promiscuous_pkt_t |
WIFI_PKT_MISC | 其他类型, 数据包的buf是 wifi_promiscuous_pkt_t |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.25 停止混杂监听
- 函数原型
int (*stop_monitor)(dev_t *dev);
功能描述 停止混杂监听模式
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.26 发送混杂数据
- 函数原型
int (*send_80211_raw_frame)(dev_t *dev, void *buffer, uint16_t len);
功能描述 从WiFi驱动发送数据。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | buffer | 需要发送的缓存 | | IN | len | 缓存的长度 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.27 设置监听信道
- 函数原型
int (*set_channel)(dev_t *dev, uint8_t primary, wifi_second_chan_t second);
功能描述 设置混杂模式下面的主要和次要的信道。当混杂模式使能的时候才会起作用。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | primary | 对于HT40的主信道 | | IN | second | 对于HT40的次信道 |
其中 次信号结构体如下: | wifi_second_chan_t 枚举定义 | | | - | - | | WIFI_SECOND_CHAN_NONE | 带宽是HT20 | | WIFI_SECOND_CHAN_ABOVE | 宽是HT40,并且次信道是在这之上 | | WIFI_SECOND_CHAN_BELOW | 带宽是HT40,并且次信道是在这之下 |
- 返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |
2.28 获取监听信道
- 函数原型
int (*get_channel)(dev_t *dev, uint8_t *primary, wifi_second_chan_t *second);
功能描述 获取混杂模式下面的主要和次要的信道。当混杂模式使能的时候才会起作用。
参数描述 | IN/OUT | NAME | DESC | | - | - | - | | IN | dev | WiFi模块的设备句柄 | | IN | primary | 对于HT40的主信道 | | IN | second | 对于HT40的次信道 |
返回值 | RETURN | DESC | | - | - | | WIFI_ERR_OK | 成功 | | 其余 | 失败,参考wifi_err_code_t的定义 |