当前位置: 首页 > 文档资料 > YoC 编程基础 >

WIFI驱动移植

优质
小牛编辑
117浏览
2023-12-01

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);

如第一章中所述,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_INITWiFi驱动还没有被初始化
WIFI_ERR_INITWiFi驱动已经被初始化了
WIFI_ERR_NOT_STARTWiFi驱动还没有被开启
WIFI_ERR_STARTWiFi驱动启动错误
WIFI_ERR_IFWiFi接口错误
WIFI_ERR_MODEWiFi模式错误
WIFI_ERR_STATEWiFi内部状态错误
WIFI_ERR_HANDLEWiFi句柄错误
WIFI_ERR_AUTHMODEWiFi鉴权模式错误
WIFI_ERR_MACWiFi MAC地址错误
WIFI_ERR_SSIDWiFi SSID无效
WIFI_ERR_PASSWORD密码无效
WIFI_ERR_TIMEOUTAPI超时
WIFI_ERR_WAKE_FAIL唤醒WiFi失败

2.2 初始化WiFi实例

  • 函数原型
    int (*init)(dev_t *dev);
    
  • 功能描述 初始化WiFi实例

  • 参数描述

IN/OUTNAMEDESC
INdevWiFi模块的设备句柄
  • 返回值
RETURNDESC
WIFI_ERR_OK成功
其余失败,参考wifi_err_code_t的定义

2.3 去初始化WiFi实例

  • 函数原型
    int (*deinit)(dev_t *dev);
    
  • 功能描述 去初始化WiFi实例

  • 参数描述

IN/OUTNAMEDESC
INdevWiFi模块的设备句柄
  • 返回值
RETURNDESC
WIFI_ERR_OK成功
其余失败,参考wifi_err_code_t的定义

2.4 设置WiFi模式

  • 函数原型
    int (*set_mode)(dev_t *dev, wifi_mode_t mode);
    
  • 功能描述 设备WiFi的工作模式,适用于不同的应用场景,开机默认是STA模式。

  • 参数描述

IN/OUTNAMEDESC
INdevWiFi模块的设备句柄
INmodeWiFi的工作模式

其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 | 枚举末尾 |

  • 返回值
RETURNDESC
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 1802.11B
#define WIFI_PROTOCOL_11G 2802.11G
#define WIFI_PROTOCOL_11N 4802.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_intervalSTA的监听间隔,默认是0
char bssid[6]设定目标AP的BSSID,默认是空
uint8_t channel如果指定了可以加快连接AP的速度,默认是0
wifi_config_ap_adv_t 结构体定义
int present默认是0,如果需要启用这个结构体,设为1
uint8_t dtim_intervalAP的DTIM间隔,默认是0,驱动自动选择
uint8_t channelAP的信道,默认是0,驱动自动选择
uint8_t beacon_intervalAP的信标间隔,默认是0,驱动自动选择
int hide_ssid隐藏AP的SSID,默认是0
int max_sta_numberAP上连接的最大客户端数量
wifi_config_sec_adv_t 结构体定义
int present默认是0,如果需要启用这个结构体,设为1
wifi_auth_mode_t auth_modeWiFi 的鉴权, WEP/WPA, ...
wifi_wep_key_t wep_keysWEP 密码,当鉴权是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_WEPWEP 加密
WIFI_ENC_OPEN无加密
WIFI_ENC_TKIPWPA TKIP 加密
WIFI_ENC_AESWPA AES 加密
WIFI_ENC_TKIP_AES_MIXWPA 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: 21代表是1n数据包,0不是11n数据包
unsigned : 16保留字段
unsigned mcs: 711N数据包的MCS
unsigned cwb: 111N数据包是否是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: 8ampdu的数量
unsigned channel: 4数据包所在的信道
unsigned : 12保留字段
unsigned timestamp: 32时间戳
unsigned : 32保留字段
unsigned : 32保留字段
unsigned sig_len: 12数据包的真实长度
unsigned : 12保留字段
unsigned rx_state: 8RX的状态
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的定义 |