Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources

This commit is contained in:
2026-07-06 11:30:13 +08:00
commit e76462eeb7
3451 changed files with 1415300 additions and 0 deletions

116
project/wifi_pair.c Normal file
View File

@@ -0,0 +1,116 @@
#include "sys_config.h"
#include "basic_include.h"
#include "lib/rpc/cpurpc.h"
#include "lib/atcmd/libatcmd.h"
#include "lib/common/atcmd.h"
#include "lib/umac/ieee80211.h"
#include "lwip/etharp.h"
#include "syscfg.h"
/* WiFi配对 */
#if SYS_WIFI_PAIR
struct wifi_pair_status {
uint8 pair_sucess;
uint8 pair_mac[6];
uint8 aid;
uint8 ngo_ap;
} wifi_pair;
#define WIFI_PAIR_MAGIC (0x1234)
void sys_wifi_pair_init()
{
ieee80211_pair_enable(WIFI_MODE_AP, WIFI_PAIR_MAGIC);
ieee80211_pair_enable(WIFI_MODE_STA, WIFI_PAIR_MAGIC);
}
/* 参数:
magic == 0 --- 停止配对
magic == 1 --- 启动配对
magic > 1 --- 启动配对并修改magic (初始值为WIFI_PAIR_MAGIC)
*/
void sys_wifi_pair_start(uint8 ifidx, uint16 magic)
{
etharp_cleanup_netif(netif_find("w0")); //是否需要清空ARP
ieee80211_pairing(ifidx, magic);
}
void sys_event_hdl_wifi_pair(uint32 event_id, uint32 data, uint32 priv)
{
switch (event_id) {
case SYS_EVENT(SYS_EVENT_WIFI, SYSEVT_WIFI_PAIR_DONE):
//配对成功,保存参数
if (wifi_pair.pair_sucess) {
ieee80211_conf_get_ssid(sys_cfgs.wifi_mode, sys_cfgs.ssid);
ieee80211_conf_get_psk(sys_cfgs.wifi_mode, sys_cfgs.psk);
sys_cfgs.key_mgmt = ieee80211_conf_get_keymgmt(sys_cfgs.wifi_mode);
if ((int32)data == 1 && sys_cfgs.wifi_mode == WIFI_MODE_STA) {
os_printf(KERN_NOTICE"wifi pair done, NGO role AP!\r\n");
sys_cfgs.wifi_mode = WIFI_MODE_AP;
ieee80211_iface_stop(WIFI_MODE_STA); //stop STA
wificfg_flush(WIFI_MODE_AP);
ieee80211_iface_start(WIFI_MODE_AP); //switch to AP
sys_cfgs.dhcpd_en = 1;
sys_cfgs.dhcpc_en = 0;
netcfg_flush();
}
if ((int32)data == -1 && sys_cfgs.wifi_mode == WIFI_MODE_AP) {
os_printf(KERN_NOTICE"wifi pair done, NGO role STA!\r\n");
sys_cfgs.wifi_mode = WIFI_MODE_STA;
ieee80211_iface_stop(WIFI_MODE_AP); //stop AP
wificfg_flush(WIFI_MODE_STA);
ieee80211_iface_start(WIFI_MODE_STA); //switch to STA.
sys_cfgs.dhcpd_en = 0;
sys_cfgs.dhcpc_en = 1;
netcfg_flush();
}
if (sys_cfgs.wifi_mode == WIFI_MODE_STA || data) {
syscfg_save();
}
}
break;
}
}
int32 sys_wifi_event_hdl_wifi_pair(uint8 ifidx, uint16 evt, uint32 param1, uint32 param2)
{
int32 ret = 0;
switch (evt) {
case IEEE80211_EVENT_PAIR_START:
wifi_pair.ngo_ap = 0;
wifi_pair.pair_sucess = 0;
os_memset(wifi_pair.pair_mac, 0, 6);
os_printf(KERN_NOTICE"Pair Start\r\n");
break;
case IEEE80211_EVENT_PAIR_SUCCESS:
wifi_pair.pair_sucess = 1;
os_memcpy(wifi_pair.pair_mac, param1, 6); //对方的MAC地址
os_printf(KERN_NOTICE"pair success with "MACSTR", AID:%d\r\n", MAC2STR(wifi_pair.pair_mac), param2);
if(!wifi_pair.ngo_ap){ //STA端自动停止配对
ieee80211_pairing(ifidx, 0); //自动停止配对
}
break;
case IEEE80211_EVENT_PAIR_DONE:
os_printf(KERN_NOTICE"pair DONE, ngo=%d\r\n", param2);
sys_event_new(SYS_EVENT(SYS_EVENT_WIFI, SYSEVT_WIFI_PAIR_DONE), param2);
break;
case IEEE80211_EVENT_REQ_PAIR_AID: //只有AP才会产生此事件
wifi_pair.ngo_ap = 1;
ret = (wifi_pair.aid++) + 1;
break;
case IEEE80211_EVENT_PAIR_NGO:
//配对角色协商事件,在此事件可以控制角色协商结果:详细信息请阅读"TXSDK_WiFi开发指南4.1.30"
// ret = 1; //协商结果本机AP
// ret = -1; //协商结果本机做STA
break;
}
return ret;
}
#endif