doubao_chat/apps/demo/demo_audio/wifi_app_task.c

405 lines
12 KiB
C
Raw 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.

#include "wifi/wifi_connect.h"
#include "os/os_api.h"
#include "app_config.h"
#include "event/net_event.h"
#include "syscfg/syscfg_id.h"
#include "system/init.h"
#ifdef CONFIG_ASSIGN_MACADDR_ENABLE
#include "net/assign_macaddr.h"
#include "net/config_network.h"
#endif
#define CONNECT_TIMEOUT_SEC 60
static struct {
u32 use_static_ipaddr_flag : 1;
u32 net_app_init_flag : 1;
u32 request_connect_flag : 1;
u32 save_ssid_flag : 1;
u32 mac_addr_succ_flag : 1;
u32 reserved : 26;
} wifi_app_hdl;
#define __this (&wifi_app_hdl)
#if 1
#define INIT_MODE STA_MODE
#define FORCE_DEFAULT_MODE 1
#else
#define INIT_MODE SMP_CFG_MODE
#define FORCE_DEFAULT_MODE 0 //配置wifi_on之后的模式,0为使用最后记忆的模式, 1为强制默认模式, 3-200为连接超时时间多少秒,如果超时都连接不上就连接最后记忆的或者最优网络
#endif
#define INIT_STORED_SSID (INIT_MODE==STA_MODE)//配置STA模式情况下,把默认配置SSID也存储起来, 以后即使保存过其他SSID,也不会覆盖丢失,使用连接最优信号SSID策略的情况下可以匹配连接
#define INIT_CONNECT_BEST_SSID 1 //配置如果啟動WIFI后在STA模式下, 是否挑选连接记忆过的信号最优WIFI
#define WIFI_FORCE_DEFAULT_MODE FORCE_DEFAULT_MODE
#define WIFI_INIT_MODE INIT_MODE
#define WIFI_INIT_SSID INIT_SSID
#define WIFI_INIT_PWD INIT_PWD
#define WIFI_INIT_CONNECT_BEST_SSID INIT_CONNECT_BEST_SSID
#define WIFI_INIT_STORED_SSID INIT_STORED_SSID
void wifi_return_sta_mode(void)
{
if (!wifi_is_on()) {
return;
}
int ret;
struct wifi_mode_info info;
info.mode = STA_MODE;
ret = wifi_get_mode_stored_info(&info);
if (ret) {//如果没保存过SSID
info.ssid = WIFI_INIT_SSID;
info.pwd = WIFI_INIT_PWD;
}
wifi_clear_scan_result(); //根据扫描结果连接信号最优ssid之前先清除之前结果,防止之前最优信号的ssid已下线
wifi_set_sta_connect_best_ssid(1);
wifi_enter_sta_mode(info.ssid, info.pwd);
__this->save_ssid_flag = 0;
}
static int wifi_is_in_smp_cfg_mode(void)
{
struct wifi_mode_info info;
info.mode = NONE_MODE;
wifi_get_mode_cur_info(&info);
return info.mode == SMP_CFG_MODE;
}
static void wifi_sta_save_ssid(void)
{
if (__this->save_ssid_flag) {
__this->save_ssid_flag = 0;
struct wifi_mode_info info;
info.mode = STA_MODE;
wifi_get_mode_cur_info(&info);
wifi_store_mode_info(STA_MODE, info.ssid, info.pwd);
}
}
static int wifi_event_callback(void *network_ctx, enum WIFI_EVENT event)
{
int ret = 0;
struct net_event net = {0};
switch (event) {
case WIFI_EVENT_MODULE_INIT:
struct wifi_store_info wifi_default_mode_parm;
wifi_default_mode_parm.mode = WIFI_INIT_MODE;
if (wifi_default_mode_parm.mode == AP_MODE || wifi_default_mode_parm.mode == STA_MODE) {
strncpy((char *)wifi_default_mode_parm.ssid[wifi_default_mode_parm.mode - STA_MODE], (const char *)WIFI_INIT_SSID, sizeof(wifi_default_mode_parm.ssid[wifi_default_mode_parm.mode - STA_MODE]) - 1);
strncpy((char *)wifi_default_mode_parm.pwd[wifi_default_mode_parm.mode - STA_MODE], (const char *)WIFI_INIT_PWD, sizeof(wifi_default_mode_parm.pwd[wifi_default_mode_parm.mode - STA_MODE]) - 1);
}
wifi_default_mode_parm.connect_best_network = WIFI_INIT_CONNECT_BEST_SSID;
wifi_set_default_mode(&wifi_default_mode_parm, WIFI_FORCE_DEFAULT_MODE, WIFI_INIT_STORED_SSID);
break;
case WIFI_EVENT_MODULE_START:
puts("|network_user_callback->WIFI_EVENT_MODULE_START\n");
struct wifi_mode_info info;
info.mode = NONE_MODE;
wifi_get_mode_cur_info(&info);
if (info.mode == SMP_CFG_MODE) {
net.arg = "net";
net.event = NET_EVENT_SMP_CFG_FIRST;
net_event_notify(NET_EVENT_FROM_USER, &net);
}
#if 1
u32 tx_rate_control_tab = // 不需要哪个速率就删除掉,可以动态设定
0
| BIT(0) //0:CCK 1M
| BIT(1) //1:CCK 2M
| BIT(2) //2:CCK 5.5M
| BIT(3) //3:OFDM 6M
| BIT(4) //4:MCS0/7.2M
| BIT(5) //5:OFDM 9M
| BIT(6) //6:CCK 11M
| BIT(7) //7:OFDM 12M
| BIT(8) //8:MCS1/14.4M
| BIT(9) //9:OFDM 18M
| BIT(10) //10:MCS2/21.7M
| BIT(11) //11:OFDM 24M
| BIT(12) //12:MCS3/28.9M
| BIT(13) //13:OFDM 36M
| BIT(14) //14:MCS4/43.3M
| BIT(15) //15:OFDM 48M
| BIT(16) //16:OFDM 54M
| BIT(17) //17:MCS5/57.8M
| BIT(18) //18:MCS6/65.0M
| BIT(19) //19:MCS7/72.2M
;
wifi_set_tx_rate_control_tab(tx_rate_control_tab);
#endif
break;
case WIFI_EVENT_MODULE_STOP:
puts("|network_user_callback->WIFI_EVENT_MODULE_STOP\n");
break;
case WIFI_EVENT_AP_START:
puts("|network_user_callback->WIFI_EVENT_AP_START\n");
break;
case WIFI_EVENT_AP_STOP:
puts("|network_user_callback->WIFI_EVENT_AP_STOP\n");
break;
case WIFI_EVENT_STA_START:
puts("|network_user_callback->WIFI_EVENT_STA_START\n");
break;
case WIFI_EVENT_MODULE_START_ERR:
puts("|network_user_callback->WIFI_EVENT_MODULE_START_ERR\n");
break;
case WIFI_EVENT_STA_STOP:
puts("|network_user_callback->WIFI_EVENT_STA_STOP\n");
break;
case WIFI_EVENT_STA_SCAN_COMPLETED:
puts("|network_user_callback->WIFI_STA_SCAN_COMPLETED\n");
break;
case WIFI_EVENT_STA_CONNECT_SUCC:
/*wifi_rxfilter_cfg(3); //过滤not_my_bssid,如果需要使用扫描空中SSID就不要过滤*/
printf("|network_user_callback->WIFI_STA_CONNECT_SUCC,CH=%d\r\n", wifi_get_channel());
break;
case WIFI_EVENT_MP_TEST_START:
puts("|network_user_callback->WIFI_EVENT_MP_TEST_START\n");
break;
case WIFI_EVENT_MP_TEST_STOP:
puts("|network_user_callback->WIFI_EVENT_MP_TEST_STOP\n");
break;
case WIFI_EVENT_STA_CONNECT_TIMEOUT_NOT_FOUND_SSID:
puts("|network_user_callback->WIFI_STA_CONNECT_TIMEOUT_NOT_FOUND_SSID\n");
net.arg = "net";
net.event = NET_CONNECT_TIMEOUT_NOT_FOUND_SSID;
net_event_notify(NET_EVENT_FROM_USER, &net);
break;
case WIFI_EVENT_STA_CONNECT_ASSOCIAT_FAIL:
puts("|network_user_callback->WIFI_STA_CONNECT_ASSOCIAT_FAIL\n");
net.arg = "net";
net.event = NET_CONNECT_ASSOCIAT_FAIL;
net_event_notify(NET_EVENT_FROM_USER, &net);
break;
case WIFI_EVENT_STA_CONNECT_ASSOCIAT_TIMEOUT:
puts("|network_user_callback->WIFI_STA_CONNECT_ASSOCIAT_TIMEOUT .....\n");
break;
case WIFI_EVENT_STA_NETWORK_STACK_DHCP_SUCC:
puts("|network_user_callback->WIFI_EVENT_STA_NETWPRK_STACK_DHCP_SUCC\n");
//有些使用了加密的路由器刚获取IP地址后前几个包都会没响应,怀疑路由器没转发成功
void connect_broadcast(void);
connect_broadcast();
wifi_sta_save_ssid();
#ifdef CONFIG_ASSIGN_MACADDR_ENABLE
if (!is_server_assign_macaddr_ok()) { //如果使用服务器分配MAC地址的情况,需要确认MAC地址有效才发送连接成功事件到APP层,否则先访问服务器分配mac地址
server_assign_macaddr(wifi_return_sta_mode);
break;
}
__this->mac_addr_succ_flag = 1;
#endif
wifi_set_sta_connect_best_ssid(0);
__this->request_connect_flag = 0;
net.arg = "net";
net.event = NET_EVENT_CONNECTED;
net_event_notify(NET_EVENT_FROM_USER, &net);
break;
case WIFI_EVENT_STA_DISCONNECT:
puts("|network_user_callback->WIFI_STA_DISCONNECT\n");
/*wifi_rxfilter_cfg(0);*/
#ifdef CONFIG_ASSIGN_MACADDR_ENABLE
if (!__this->mac_addr_succ_flag) {
break;
}
#endif
net.arg = "net";
net.event = NET_EVENT_DISCONNECTED;
net_event_notify(NET_EVENT_FROM_USER, &net);
if (!wifi_is_in_smp_cfg_mode() && !__this->request_connect_flag) {
memset(&net, 0, sizeof(net));
net.arg = "net";
net.event = NET_EVENT_DISCONNECTED_AND_REQ_CONNECT;
net_event_notify(NET_EVENT_FROM_USER, &net);
}
break;
case WIFI_EVENT_STA_NETWORK_STACK_DHCP_TIMEOUT:
puts("|network_user_callback->WIFI_EVENT_STA_NETWPRK_STACK_DHCP_TIMEOUT\n");
break;
case WIFI_EVENT_P2P_START:
puts("|network_user_callback->WIFI_EVENT_P2P_START\n");
break;
case WIFI_EVENT_P2P_STOP:
puts("|network_user_callback->WIFI_EVENT_P2P_STOP\n");
break;
case WIFI_EVENT_P2P_GC_DISCONNECTED:
puts("|network_user_callback->WIFI_EVENT_P2P_GC_DISCONNECTED\n");
break;
case WIFI_EVENT_P2P_GC_NETWORK_STACK_DHCP_SUCC:
puts("|network_user_callback->WIFI_EVENT_P2P_GC_NETWORK_STACK_DHCP_SUCC\n");
break;
case WIFI_EVENT_P2P_GC_NETWORK_STACK_DHCP_TIMEOUT:
puts("|network_user_callback->WIFI_EVENT_P2P_GC_NETWORK_STACK_DHCP_TIMEOUT\n");
break;
case WIFI_EVENT_SMP_CFG_START:
puts("|network_user_callback->WIFI_EVENT_SMP_CFG_START\n");
break;
case WIFI_EVENT_SMP_CFG_STOP:
puts("|network_user_callback->WIFI_EVENT_SMP_CFG_STOP\n");
break;
case WIFI_EVENT_SMP_CFG_TIMEOUT:
puts("|network_user_callback->WIFI_EVENT_SMP_CFG_TIMEOUT\n");
net.arg = "net";
net.event = NET_EVENT_SMP_CFG_TIMEOUT;
net_event_notify(NET_EVENT_FROM_USER, &net);
break;
case WIFI_EVENT_SMP_CFG_COMPLETED:
puts("|network_user_callback->WIFI_EVENT_SMP_CFG_COMPLETED\n");
net.arg = "net";
net.event = NET_SMP_CFG_COMPLETED;
net_event_notify(NET_EVENT_FROM_USER, &net);
break;
case WIFI_EVENT_PM_SUSPEND:
puts("|network_user_callback->WIFI_EVENT_PM_SUSPEND\n");
break;
case WIFI_EVENT_PM_RESUME:
puts("|network_user_callback->WIFI_EVENT_PM_RESUME\n");
break;
case WIFI_EVENT_AP_ON_ASSOC:
puts("|network_user_callback->WIFI_EVENT_AP_ON_ASSOC\n");
break;
case WIFI_EVENT_AP_ON_DISCONNECTED:
puts("|network_user_callback->WIFI_EVENT_AP_ON_DISCONNECTED\n");
break;
default:
break;
}
return ret;
}
static void net_app_init(void)
{
if (__this->net_app_init_flag) {
return;
}
__this->net_app_init_flag = 1;
}
static void net_app_uninit(void)
{
}
static void wifi_and_network_on(void)
{
if (wifi_is_on()) {
return;
}
wifi_on();
net_app_init();
}
void wifi_and_network_off(void)
{
if (wifi_is_on() == 0) {
return;
}
net_app_uninit();
wifi_off();
}
void wifi_sta_connect(char *ssid, char *pwd, char save, void *priv)
{
if (save) {
struct wifi_mode_info info;
info.mode = STA_MODE;
wifi_get_mode_cur_info(&info);
if (strcmp(info.ssid, ssid) || strcmp(info.pwd, pwd)) {
__this->save_ssid_flag = 1; //防止输错密码还保存ssid, 等待确保连接上路由器再保存
}
}
__this->request_connect_flag = 1;
if (save) {
/* wifi_store_mode_info(STA_MODE,ssid,pwd); */
}
wifi_enter_sta_mode(ssid, pwd);
}
int get_wifi_scan_ssid_info(struct wifi_scan_ssid_info **ssid_info)
{
struct wifi_scan_ssid_info *sta_ssid_info;
u32 sta_ssid_num = 0;
sta_ssid_info = wifi_get_scan_result(&sta_ssid_num);
wifi_clear_scan_result();
for (u32 i = 0; i < sta_ssid_num; i++) {
printf("find scan ssid = [%s]\r\n", sta_ssid_info[i].ssid);
}
*ssid_info = sta_ssid_info;
return sta_ssid_num;
}
static void wifi_app_task(void *priv) //主要是create wifi 线程的
{
wifi_set_store_ssid_cnt(NETWORK_SSID_INFO_CNT);
wifi_set_sta_connect_timeout(CONNECT_TIMEOUT_SEC);
wifi_set_event_callback(wifi_event_callback);
wifi_and_network_on();
}
#ifdef CONFIG_WIFI_ENABLE
static int wireless_net_init(void) //主要是create wifi 线程的
{
puts("wireless_net_init \n\n");
return thread_fork("wifi_app_task", 10, 1792, 0, 0, wifi_app_task, NULL);
}
late_initcall(wireless_net_init);
#endif
#include "asm/power_interface.h"
#if TCFG_LOWPOWER_LOWPOWER_SEL == 0
void wf_low_power_request(void *priv, u32 usec)
{
}
#endif