7. WiFi

7.1. 概述

本文档介绍BL_IoT SDK的WiFi联网功能。主要包括

  • 基站模式(即 STA 模式或 Wi-Fi 客户端模式),此时 BL_IoT 连接到接入点 (AP)。

  • AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 BL_IoT。

  • AP-STA 共存模式(BL_IoT 既是接入点,同时又作为基站连接到另外一个接入点)。

  • 上述模式的各种安全模式(WPA、WPA2 及 WEP(AP模式不支持))。

  • 扫描接入点(包括主动扫描及被动扫描)。

  • 使用混杂模式监控 IEEE802.11 Wi-Fi 数据包。

7.2. 应用实例

BL_IoT的实例 bl602_demo_wifi 目录下包含了一个应用程序,该demo介绍了如何使用BL_IoT模组连接到AP等一系列wifi操作。该实例实现的主要思路如下:

The original documentation had an image called imgs/image1.png here, but the file is not publically available. This text is here to prevent a missing image warning.

  • 在主函数 bfl_main() 中创建一个 aos_loop_proc() 线程,在此线程中调用 aos_register_event_filter() 接口注册一个 EV_WIFI 事件的监听函数 event_cb_wifi_event()

  • 首先用户在终端中输入 stack_wifi 命令后,在 cmd_stack_wifi() 函数中创建一个 wifi_main() 的线程,接着调用 aos_post_event() 接口发布 CODE_WIFI_ON_INIT_DONE 事件后, event_cb_wifi_event() 会被调用,并进入case CODE_WIFI_ON_INIT_DONE 分支从而调用 wifi_mgmr_start_background() 开启WiFi Manager,同时发布 CODE_WIFI_ON_MGMR_DONE 事件,进入case CODE_WIFI_ON_MGMR_DONE 分支调用 _connect_wifi() 函数,此函数先判断easyflash中是否设置了可连接的ssid,如果设置了则会自动进行wifi连接,没有设置则需手动输命令设置;

  • 如用户在终端中输入 wifi_sta_connect 命令,会调用相应的api实现。如需实现wifi相关的其他功能可通过调用对应api来实现。

7.3. Reason Codes

WLAN_FW_SUCCESSFUL

WiFi连接成功

WLAN_FW_TX_AUTH_FRAME_ALLOCATE_FAIILURE

发送验证帧分配失败

WLAN_FW_AUTHENTICATION_FAIILURE

验证失败

WLAN_FW_AUTH_ALGO_FAIILURE

身份验证响应但身份验证算法失败

WLAN_FW_TX_ASSOC_FRAME_ALLOCATE_FAIILURE

发送关联帧分配失败

WLAN_FW_ASSOCIATE_FAIILURE

关联错误

WLAN_FW_DEAUTH_BY_AP_WHEN_NOT_CONNECTION

AP取消验证,但状态错误

WLAN_FW_DEAUTH_BY_AP_WHEN_CONNECTION

连接时由AP取消验证

WLAN_FW_4WAY_HANDSHAKE_ERROR_PSK_TIMEOUT_FAILURE

密码错误,四次握手超时

WLAN_FW_4WAY_HANDSHAKE_TX_DEAUTH_FRAME_TRANSMIT_FAILURE

密码错误,发送取消验证帧传输失败

WLAN_FW_4WAY_HANDSHAKE_TX_DEAUTH_FRAME_ALLOCATE_FAIILURE

密码错误,发送取消验证帧分配失败

WLAN_FW_TX_AUTH_OR_ASSOC_FRAME_TRANSMIT_FAILURE

发送授权或关联帧传输失败

WLAN_FW_SCAN_NO_BSSID_AND_CHANNEL

SSID错误,扫描不到bssid和频道

WLAN_FW_CREATE_CHANNEL_CTX_FAILURE_WHEN_JOIN_NETWORK

加入网络时创建通道上下文失败

WLAN_FW_JOIN_NETWORK_FAILURE

加入网络失败

WLAN_FW_ADD_STA_FAILURE

加入sta模式失败

WLAN_FW_BEACON_LOSS

信标丢失

7.4. API参考

  • 头文件

wifi_mgmr_ext.h

  • API介绍

void wifi_mgmr_start_background(wifi_conf_t *conf)

/**
* function      初始化并开启WiFi Manager。(wifi相关的操作第一步首先调用此接口)
*
* @param[in]    conf    WiFi配置
*
* @return       无
*/

wifi_interface_t wifi_mgmr_sta_enable(void)

/**
* function      wifi sta 使能
*
* @param[in]    
*
* @return       指向wifi sta的结构体信息的指针
*/

int wifi_mgmr_sta_disable(wifi_interface_t *interface)

/**
* function    wifi sta 失能
*
* @param[in]  interface    wifi sta结构体指针
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_mac_set(uint8_t mac[6])

/**
* function    设置 wifi mac 地址
*
* @param[in]  mac[6]    存储mac地址的数组
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_mac_get(uint8_t mac[6])

/**
* function    获取 wifi mac 地址
*
* @param[in]  mac[6]    存储mac地址的数组
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_ip_get(uint32_t *ip, uint32_t *gw, uint32_t *mask)

/**
* function    获取 wifi ip
*
* @param[in]  ip    指向ip的指针
* @param[in]  gw    指向gateway的指针
* @param[in]  mask  指向mask的指针
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_connect(wifi_interface_t *wifi_interface, char *ssid, char *psk, char *pmk, uint8_t *mac, uint8_t band, uint16_t freq)

/**
* function    wifi sta 连接
*
* @param[in]  wifi_interface    wifi sta结构体指针(wifi_mgmr_sta_enable的返回值)
* @param[in]  ssid              wifi名
* @param[in]  psk               密码
* @param[in]  pmk               pmk
* @param[in]  mac               mac地址
* @param[in]  band              band
* @param[in]  freq              freq
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_disconnect(void)

/**
* function    wifi sta 断开(调用此接口后需要TaskDelay 1s左右,再调用wifi_mgmr_sta_disable接口才能实现wifi disconnect)
*
* @param[in]  无
*
* @return     0:成功, 其他:失败
*/

wifi_interface_t wifi_mgmr_ap_enable(void)

/**
* function    wifi ap模式使能
*
* @param[in]  
*
* @return     指向wifi ap的结构体信息的指针
*/

int wifi_mgmr_ap_start(wifi_interface_t *interface, char *ssid, int md, char *passwd, int channel)

/**
* function    开启wifi ap模式
*
* @param[in]  interface     wifi ap结构体指针
* @param[in]  ssid          wifi名
* @param[in]  md            md
* @param[in]  passwd        密码
* @param[in]  channel       wifi信道
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_ap_stop(wifi_interface_t *interface)

/**
* function    关闭wifi ap模式
*
* @param[in]  interface     wifi ap结构体指针
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_scan(void *data, scan_complete_cb_t cb)

/**
* function    开启wifi扫描
*
* @param[in]  data     scan data
* @param[in]  cb       sacn cb
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_autoconnect_enable(void)

/**
* function    开启wifi重连
*
* @param[in]  无
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_autoconnect_disable(void)

/**
* function    关闭wifi重连
*
* @param[in]  无
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sta_powersaving(int ps)

/**
* function    开启wifi sta省电模式
*
* @param[in]  ps     0:关闭省电模式
                     1:开启省电模式
                     2:动态切换模式
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_ap_sta_cnt_get(uint8_t *sta_cnt)

/**
* function    获取ap模式下允许连接的sta个数
*
* @param[in]  sta_cnt     sta的个数
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_ap_sta_info_get(struct wifi_sta_basic_info *sta_info, uint8_t idx)

/**
* function    获取ap模式下sta连接的信息
*
* @param[in]  sta_info     存储sta的信息
* @param[in]  idx          sta编号
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sniffer_enable(void)

/**
* function    使能sniffer
*
* @param[in]  无
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sniffer_disable(void)

/**
* function    失能sniffer
*
* @param[in]  无
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sniffer_register(void *env, sniffer_cb_t cb)

/**
* function    注册sniffer(注册之前需enable sniffer)
*
* @param[in]  env    env
* @param[in]  cb     sniffer回调函数
*
* @return     0:成功, 其他:失败
*/

int wifi_mgmr_sniffer_unregister(void *env)

/**
* function    注销sniffer(注销之前需disable sniffer)
*
* @param[in]  env    env
*
* @return     0:成功, 其他:失败
*/