doubao_chat/include_lib/net/wifi/wifi_connect.h

604 lines
18 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _WIFI_CONNECT_H_
#define _WIFI_CONNECT_H_
#include "generic/typedef.h"
#define ENC_NONE 0x00
#define ENC_WEP BIT(0)
#define ENC_WPA BIT(1)
#define ENC_WPA2 BIT(2)
#define ENC_WPA3 BIT(3)
#define ENC_MODE_BIT_SET(val, mode) ((val) = ((val) | (mode)))
#define ENC_MODE_BIT_IS_SET(val, mode) (((((val) & (mode)) == (mode)) && \
((mode) != 0u)) ? (1) : (0))
/// \cond DO_NOT_DOCUMENT
enum WIFI_MODE {
STA_MODE = 1,//STA_MODE位置必须为第一个
AP_MODE,
SMP_CFG_MODE,
MP_TEST_MODE,
P2P_MODE,
NONE_MODE,
};
enum P2P_ROLE {
P2P_GC_MODE = 1,
P2P_GO_MODE,
};
enum WSC_CFG_MODE {
STA_ENROLLEE_PIN_MODE,
STA_REGISTRAR_PIN_MODE,
STA_ENROLLEE_PBC_MODE,
STA_REGISTRAR_PBC_MODE,
AP_ENROLLEE_PIN_MODE,
AP_REGISTRAR_PIN_MODE,
AP_ENROLLEE_PBC_MODE,
AP_REGISTRAR_PBC_MODE,
};
struct wifi_store_info {
enum WIFI_MODE mode;
u8 pwd[2][64];
u8 ssid[2][33];
enum P2P_ROLE p2p_role;
u8 sta_cnt;
u8 connect_best_network;
} __attribute__((packed));
struct wifi_stored_sta_info {
u8 pwd[64];
u8 ssid[33];
} __attribute__((packed));
struct wifi_scan_ssid_info {
char ssid[32];
unsigned int ssid_len;
unsigned char mac_addr[6];
char rssi;
char snr;
char rssi_db;
char rssi_rsv;
unsigned int channel_number;
unsigned char SignalStrength;//(in percentage)
unsigned char SignalQuality;//(in percentage)
unsigned char SupportedRates[16];
char enc;
};
enum wifi_sta_connect_state {
WIFI_STA_DISCONNECT,
WIFI_STA_CONNECT_SUCC,
WIFI_STA_CONNECT_TIMEOUT_NOT_FOUND_SSID,
WIFI_STA_CONNECT_ASSOCIAT_FAIL,
WIFI_STA_CONNECT_ASSOCIAT_TIMEOUT,
WIFI_STA_NETWORK_STACK_DHCP_SUCC,
WIFI_STA_NETWORK_STACK_DHCP_TIMEOUT,
};
enum SMP_CFG_TYPE {
PRIV_SMP_CFG1 = 1,
PRIV_SMP_CFG2,
AIRKISS_SMP_CFG,
};
struct smp_cfg_result {
enum SMP_CFG_TYPE type;
unsigned int ssid_crc;
unsigned int random_val;
char ssid[32];
char passphrase[64];
};
enum WIFI_EVENT {
WIFI_EVENT_MODULE_INIT,
WIFI_EVENT_MODULE_START,
WIFI_EVENT_MODULE_STOP,
WIFI_EVENT_MODULE_START_ERR,
WIFI_EVENT_AP_START,
WIFI_EVENT_AP_STOP,
WIFI_EVENT_STA_START,
WIFI_EVENT_STA_STOP,
WIFI_EVENT_STA_SCAN_COMPLETED,
WIFI_EVENT_STA_CONNECT_SUCC,
WIFI_EVENT_STA_CONNECT_TIMEOUT_NOT_FOUND_SSID,
WIFI_EVENT_STA_CONNECT_ASSOCIAT_FAIL,
WIFI_EVENT_STA_CONNECT_ASSOCIAT_TIMEOUT,
WIFI_EVENT_STA_DISCONNECT,
WIFI_EVENT_SMP_CFG_START,
WIFI_EVENT_SMP_CFG_STOP,
WIFI_EVENT_SMP_CFG_TIMEOUT,
WIFI_EVENT_SMP_CFG_COMPLETED,
WIFI_EVENT_STA_NETWORK_STACK_DHCP_SUCC,
WIFI_EVENT_STA_NETWORK_STACK_DHCP_TIMEOUT,
WIFI_EVENT_AP_ON_DISCONNECTED,
WIFI_EVENT_AP_ON_ASSOC,
WIFI_EVENT_MP_TEST_START,
WIFI_EVENT_MP_TEST_STOP,
WIFI_EVENT_P2P_START,
WIFI_EVENT_P2P_STOP,
WIFI_EVENT_P2P_GC_DISCONNECTED,
WIFI_EVENT_P2P_GC_NETWORK_STACK_DHCP_SUCC,
WIFI_EVENT_P2P_GC_NETWORK_STACK_DHCP_TIMEOUT,
WIFI_EVENT_PM_SUSPEND,
WIFI_EVENT_PM_RESUME,
WIFI_FORCE_MODE_TIMEOUT,
WIFI_EVENT_STA_SCANNED_SSID,
};
struct wifi_mode_info {
enum WIFI_MODE mode;
char *ssid;
char *pwd;
};
// @brief 配置WIFI MP测试后校准后的 晶体频偏参数 ,PA参数 , 各个速率功率的数字增益参数
struct wifi_calibration_param {
u8 xosc_l;
u8 xosc_r;
u8 pa_trim_data[7];
u8 mcs_dgain[20];
};
extern const struct wifi_calibration_param wifi_calibration_param;
struct ieee80211_frame {
u8 i_fc[2];
u8 i_dur[2];
u8 i_addr1[6];
u8 i_addr2[6];
u8 i_addr3[6];
u8 i_seq[2];
/* possibly followed by addr4[6]; */
} __packed;
/**
* @brief IEEE 802.11 management frame subtype definition
*/
#define IEEE80211_FC_STYPE_SHIFT 4
#define IEEE80211_FC_STYPE_MASK (0xf << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_ASSOC_REQ (0x0 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_ASSOC_RESP (0x1 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_REASSOC_REQ (0x2 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_REASSOC_RESP (0x3 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_PROBE_REQ (0x4 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_PROBE_RESP (0x5 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_BEACON (0x8 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_ATIM (0x9 << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_DISASSOC (0xa << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_AUTH (0xb << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_DEAUTH (0xc << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC_STYPE_ACTION (0xd << IEEE80211_FC_STYPE_SHIFT)
#define IEEE80211_FC0_TYPE_MASK 0x0c
#define IEEE80211_FC0_TYPE_MGT 0x00
#define IEEE80211_FC0_TYPE_CTL 0x04
#define IEEE80211_FC0_TYPE_DATA 0x08
#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
/// \endcond
/**
* @brief wifi_set_event_callback,用于注册(设置)WIFI事件回调函数
*
* @param cb 指向WIFI事件回调函数,一般为:wifi_event_callback
*/
extern void wifi_set_event_callback(int (*cb)(void *, enum WIFI_EVENT));
/**
* @brief wifi_airkiss_calcrc_bytes,用于计算airkiss接收包crc校验
*
* @param p 指向设备端扫描到的空中SSID
* @param num_of_bytes 设备端扫描到的空中SSID长度
*/
extern u8 wifi_airkiss_calcrc_bytes(u8 *p, unsigned int num_of_bytes);
/**
* @brief wifi_set_frame_cb,用于注册(设置)WIFI底层接收到802.11数据帧回调函数
*
* @param cb 指向WIFI底层接收到802.11数据帧回调函数
* @param priv 用户私有指针传递
*/
extern void wifi_set_frame_cb(void (*cb)(void *rxwi, struct ieee80211_frame *wh, void *data, u32 len, void *priv), void *priv);
/**
* @brief wifi_set_pwr,用于设置WIFI 模拟功率等级
*
* @param pwr_sel 默认为6,范围为0-6
*
* @note 参数设为0,表示把WIFI模拟功率调整到最低档位节电
*/
extern void wifi_set_pwr(unsigned char pwr_sel);
/**
* @brief wifi_on,用于启动WIFI
*/
extern int wifi_on(void);
/**
* @brief wifi_is_on,查询WIFI是否启动
*/
extern int wifi_is_on(void);
/**
* @brief wifi_off,关闭WIFI
*/
extern int wifi_off(void);
/**
* @brief wifi_get_mac,获取WIFI MAC地址
*
* @param mac 指向存储MAC地址的缓存数组,数组大小为6
*/
extern int wifi_get_mac(u8 *mac);
/**
* @brief wifi_set_mac,设置WIFI MAC地址
*
* @param mac_addr 指向要设置的MAC地址缓存数组,数组大小为6
*/
extern int wifi_set_mac(char *mac_addr);
/**
* @brief wifi_rxfilter_cfg,设置WIFI接收过滤
*
* @param mode 过滤模式
* |mode|说明|
* |- |- |
* |0|STA模式默认不过滤|
* |1|AP模式默认不过滤|
* |2|STA模式下使用,过滤广播,多播|
* |3|STA模式下使用,过滤not_my_bssid|
* |4|STA模式下使用,过滤广播+多播+not_my_bssid|
* |5|AP模式下使用,过滤广播,多播|
* |6|AP模式下使用,过滤not_my_bssid|
* |7|AP模式下使用,过滤广播+多播+not_my_bssid|
*/
extern void wifi_rxfilter_cfg(char mode);
/**
* @brief wifi_set_tx_rate_control_tab,用于设置WIFI TX速率
*
* @param tab 速率表,不需要哪个速率就删除掉,可以动态设定
*/
extern void wifi_set_tx_rate_control_tab(u32 tab);
/**
* @brief wifi_get_channel,用于获取WIFI当前信道
*/
extern u32 wifi_get_channel(void);
/**
* @brief wifi_get_bssid,用于获取WIFI当前bssid
*/
extern void wifi_get_bssid(u8 bssid[6]);
/**
* @brief wifi_get_upload_rate,用于获取WIFI上行速率
*/
extern u32 wifi_get_upload_rate(void);
/**
* @brief wifi_get_download_rate,用于获取WIFI下行速率
*/
extern u32 wifi_get_download_rate(void);
/**
* @brief wifi_get_mode_cur_info,用于获取WIFI当前是什么模式,或者当前指定模式下的配置信息
*
* @param info 指向一个wifi_mode_info类型的结构体,其包含了变量mode、ssid、pwd
*/
extern void wifi_get_mode_cur_info(struct wifi_mode_info *info);
/**
* @brief wifi_get_mode_stored_info,用于获取WIFI最后记忆的是什么模式,或者最后记忆模式下的配置信息
*
* @param info 指向一个wifi_mode_info类型的结构体,其包含了变量mode、ssid、pwd
*/
extern int wifi_get_mode_stored_info(struct wifi_mode_info *info);
/**
* @brief wifi_set_default_mode,用于设置WIFI启动默认模式配置
*
* @param parm 指向一个wifi_store_info类型的结构体
* @param force 配置wifi_on之后的模式
* |force|说明|
* |- |- |
* |0|使用最后记忆的模式|
* |1|强制默认模式|
* |3-200|STA连接超时时间多少秒,如果超时都连接不上就连接最后记忆的或者最优网络|
* @param store 选择是否存储默认配置的SSID
* |store|说明|
* |- |- |
* |0|不存储默认配置的SSID|
* |1|存储默认配置的SSID|
*
* @note 配置STA模式情况下,把默认配置SSID也存储起来,以后即使保存过其他SSID,也不会覆盖丢失,使用连接最优信号SSID策略的情况下可以匹配连接
*/
extern int wifi_set_default_mode(struct wifi_store_info *parm, char force, char store);
/**
* @brief wifi_store_mode_info,用于保存WIFI模式配置信息,覆盖默认模式
*
* @param mode 配置的wifi模式
* @param ssid 配置模式下的SSID
* @param pwd 配置模式下的密码
*/
extern int wifi_store_mode_info(enum WIFI_MODE mode, char *ssid, char *pwd);
/**
* @brief wifi_del_stored_ssid,用于删除STA模式下保存过的SSID,仅允许STA模式使用
*
* @param ssid 删除wifi_get_stored_sta_info存储中的ssid
*/
extern int wifi_del_stored_sta_info(char *ssid);
/**
* @brief wifi_set_target_mac_for_agc_recv,用于设置目标接收地址,有利于提高抗干扰能力,专门针对目标地址的数据包进行接收AGC和频偏调整
*
* @param mac 目标接收地址
*/
extern void wifi_set_target_mac_for_agc_recv(char *mac);
/*-------------------------------------AP MODE--------------------------------------*/
/**
* @brief wifi_enter_ap_mode,用于设置WIFI进入AP模式
*
* @param ap_ssid AP模式下的SSID
* @param ap_pwd AP模式下的密码
*/
extern int wifi_enter_ap_mode(char *ap_ssid, char *ap_pwd);
/**
* @brief wifi_get_sta_entry_rssi,用于AP模式下获取接入的每个STA信号质量和MAC地址
*/
extern int wifi_get_sta_entry_rssi(char wcid, char **rssi, u8 **evm, u8 **mac);
/**
* @brief wifi_disconnect_station,用于AP模式下断开指定MAC地址的STA
*
* @param mac 要断开设备的mac地址
* @param reason 断开的原因,通常填8:Deauthenticated because sending station is leaving
*/
extern void wifi_disconnect_station(char *mac, u16 reason);
/*-------------------------------------STA MODE--------------------------------------*/
/**
* @brief wifi_set_store_ssid_cnt,用于设置WIFI最多保存多少个连接的SSID数目
*
* @param cnt sta模式下最多保存的SSID数目,工程中默认为5
*/
extern void wifi_set_store_ssid_cnt(u32 cnt);
/**
* @brief wifi_set_sta_connect_best_ssid,用于设置WIFI进入STA模式的时候如果匹配到信号最好的网络就去连接
*
* @param enable 自动连接保存过的信号最好的SSID使能端,置1:使能,置0:不使能
*/
extern void wifi_set_sta_connect_best_ssid(u8 enable);
/**
* @brief wifi_set_sta_connect_timeout,用于设置WIFI连接STA超时时间
*
* @param sec WIFI连接STA超时时间,单位为秒,工程中默认为60秒
*/
extern void wifi_set_sta_connect_timeout(int sec);
/**
* @brief wifi_set_connect_sta_block,用于设置WIFI连接STA是否阻塞, 默认非阻塞通过事件通知
*
* @param block 使能端,置1:阻塞,置为0:不阻塞
*/
extern void wifi_set_connect_sta_block(int block);
/**
* @brief wifi_enter_sta_mode,用于设置WIFI进入STA模式
*
* @param sta_ssid 配置STA模式的SSID
* @param sta_pwd 配置STA模式的密码
*/
extern int wifi_enter_sta_mode(char *sta_ssid, char *sta_pwd);
/**
* @brief wifi_scan_req,用于WIFI STA模式或者AP模式下启动一次扫描空中SSID
* @note STA模式下调用返回-1代表WIFI OFF/正在扫描/连接中,无需启动扫描, 可以等待几秒或者扫描完成事件到来获取结果
*/
extern int wifi_scan_req(void);
/**
* @brief wifi_get_scan_result,用于启动一次扫描空中SSID后,获取扫描结果
*/
extern struct wifi_scan_ssid_info *wifi_get_scan_result(u32 *ssid_cnt);
/**
* @brief wifi_clear_scan_result,用于获取扫描结果后,清空上次扫描结果
*/
extern void wifi_clear_scan_result(void);
/**
* @brief wifi_get_stored_sta_info,用于获取WIFI保存过的SSID
*
* @note 返回WIFI保存过的SSID数目
*/
extern int wifi_get_stored_sta_info(struct wifi_stored_sta_info wifi_stored_sta_info[]);
/**
* @brief wifi_get_rssi,用于获取WIFI连接的STA接收信号强度
*
* @note 返回WIFI连接的STA接收信号强度
*/
extern char wifi_get_rssi(void);
/**
* @brief wifi_get_cqi,用于获取WIFI连接的STA信号质量
*
* @note 返回WIFI连接的STA通信丢包质量,0-100,一般认为大于50为较好,20-50之间为一般,小于20较差, decide ChannelQuality based on: 1)last BEACON received time, 2)last RSSI权重50, 3)TxPER权重30, and 4)RxPER权重20
*/
extern char wifi_get_cqi(void);
/**
* @brief wifi_get_sta_connect_state,用于获取WIFI是连接STA状态
*
* @note 返回WIFI连接STA的状态
*/
enum wifi_sta_connect_state wifi_get_sta_connect_state(void);
/*-------------------------------------MONITOR MODE--------------------------------------*/
/**
* @brief wifi_enter_smp_cfg_mode,用于设置WIFI进入配网模式/monitor模式
*/
extern int wifi_enter_smp_cfg_mode(void);
/**
* @brief wifi_set_smp_cfg_timeout,用于设置WIFI配网超时事件时间
*
* @param sec WIFI配网超时时间,单位为秒
*/
extern void wifi_set_smp_cfg_timeout(int sec);
/**
* @brief wifi_set_smp_cfg_scan_all_channel,用于设置WIFI配网模式/monitor模式下是否扫描全部信道,默认否
*
* @param onoff 全扫描开关,1:开启,0:关闭
*/
extern void wifi_set_smp_cfg_scan_all_channel(char onoff);
/**
* @brief wifi_set_smp_cfg_airkiss_recv_ssid,用于设置WIFI airkiss配网模式下是否接收完整的SSID,默认否,有助于加快配网时效,有概率配网失败
*
* @param onoff 全扫描开关,1:开启,0:关闭
*/
extern void wifi_set_smp_cfg_airkiss_recv_ssid(char onoff);
/**
* @brief wifi_set_smp_cfg_just_monitor_mode,用于设置WIFI进入配网/monitor模式后,是否只保留monitor模式,默认否
*
* @param onoff 全扫描开关,1:开启,0:关闭
*/
extern void wifi_set_smp_cfg_just_monitor_mode(char onoff);
/**
* @brief wifi_set_monitor_mode_scan_channel_time,用于在WIFI只保留monitor模式的情况下,设置扫描每个信道的时间间隔
*
* @param time_ms 扫描每个信道的时间间隔,单位为ms
*/
extern void wifi_set_monitor_mode_scan_channel_time(int time_ms);
/**
* @brief wifi_set_airkiss_key,用于设置WIFI配网模式下airkiss的key
*
* @param key 为WIFI配网模式下airkiss的key数组
*/
extern void wifi_set_airkiss_key(u8 key[16]);
/**
* @brief wifi_get_cfg_net_result,用于配网成功后获取WIFI配网信息
*/
extern int wifi_get_cfg_net_result(struct smp_cfg_result *smp_cfg);
/**
* @brief wifi_set_channel,用于设置WIFI当前信道
*
* @param ch 要设置的WIFI信道
*/
extern void wifi_set_channel(u8 ch);
/*-------------------------------------WSC MODE--------------------------------------*/
/**
* @brief wifi_wsc_start,用于设置wifi的WSC模式
*
* @param ssid 要设置的ssid信道
* @param ssid 设置pincode值
* @param mode WSC_CFG_MODE
*/
extern void wifi_wsc_start(const char *ssid, const char *pincode, int mode);
/// \cond DO_NOT_DOCUMENT
// @brief 使用WIFI底层接口直接发送数据帧
enum wifi_tx_rate {
WIFI_TXRATE_1M = 0,
WIFI_TXRATE_2M,
WIFI_TXRATE_5M,
WIFI_TXRATE_6M,
WIFI_TXRATE_7M,
WIFI_TXRATE_9M,
WIFI_TXRATE_11M,
WIFI_TXRATE_12M,
WIFI_TXRATE_14M,
WIFI_TXRATE_18M,
WIFI_TXRATE_21M,
WIFI_TXRATE_24M,
WIFI_TXRATE_28M,
WIFI_TXRATE_36M,
WIFI_TXRATE_43M,
WIFI_TXRATE_48M,
WIFI_TXRATE_54M,
WIFI_TXRATE_57M,
WIFI_TXRATE_65M,
WIFI_TXRATE_72M,
};
/// \endcond
/**
* @brief wifi_get_payload_ptr,用于获取WIFI底层接口填充payload指针
*
*/
extern u8 *wifi_get_payload_ptr(void);
/**
* @brief wifi_send_data,用于使用WIFI底层接口直接发送数据帧
*
* @param pkg 要发送的数组
* @param len 发送数据的长度,最大2510字节
* @param rate WIFI发送速率
*/
extern void wifi_send_data(int len, enum wifi_tx_rate rate);
/**
* @brief wifi_set_long_retry,用于设置WIFI底层长帧重传次数
*
* @param retry 为重传次数
*/
extern void wifi_set_long_retry(u8 retry);
/**
* @brief wifi_set_short_retry,用于设置WIFI底层短帧重传次数
*
* @param retry 为重传次数
*/
extern void wifi_set_short_retry(u8 retry);
/**
* @brief wifi_get_remain_tx_queue,用于获取WIFI底层发送队列剩余个数
*
* @param ac_queue 为Qos优先级,用户无配置就是填0
*
* @return 剩余多少个包可填充,最大为 MAX_PACKETS_IN_QUEUE
*/
extern u32 wifi_get_remain_tx_queue(char ac_queue);
/**
* @brief wifi 最大backoff范围设置
*
* @param cwmax 为最大backoff范围
*/
extern void wifi_backoff_cfg(u8 cwmax);
/**
* @brief wifi_get_tbtt 获取 wifi 下一个 beacon 抵达的剩余预测时间
*
* @return 返回值范围 0 ~ 1600,单位为 64 us,即最小误差为 64 us
*/
extern u32 wifi_get_tbtt(void);
#endif //_WIFI_CONNECT_H_