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的定义 |

results matching ""

    No results matching ""