机器无法搜索6gwifi(英飞凌的WIFI芯片有限制,STA和AP需保持同频段才能正常使用,连接6Gwifi才能开启6G热点)

--- a/service/java/com/android/server/wifi/SoftApManager.java
+++ b/service/java/com/android/server/wifi/SoftApManager.java
@@ -918,6 +918,7 @@ public class SoftApManager implements ActiveModeManager {

         startResult = ApConfigUtil.updateApChannelConfig(
                 mWifiNative, mCoexManager, mResourceCache, mCountryCode,
+                mActiveModeWarden.getClientModeManagers(),
                 localConfigBuilder, mCurrentSoftApConfiguration, mCurrentSoftApCapability);
         if (startResult != START_RESULT_SUCCESS) {
             Log.e(getTag(), "Failed to update AP band and channel");
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 88c32793b2..9b8138f42b 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -18,6 +18,7 @@ package com.android.server.wifi;

 import static android.app.AppOpsManager.MODE_ALLOWED;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.net.TetheringManager.TETHERING_WIFI;
 import static android.net.wifi.ScanResult.WIFI_BAND_24_GHZ;
 import static android.net.wifi.ScanResult.WIFI_BAND_5_GHZ;
 import static android.net.wifi.ScanResult.WIFI_BAND_6_GHZ;
@@ -92,14 +93,17 @@ import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.hardware.wifi.WifiStatusCode;
 import android.location.LocationManager;
+import android.net.ConnectivityManager;
 import android.net.DhcpInfo;
 import android.net.DhcpOption;
 import android.net.DhcpResultsParcelable;
 import android.net.InetAddresses;
 import android.net.MacAddress;
 import android.net.Network;
+import android.net.TetheringManager;
 import android.net.NetworkCapabilities;
 import android.net.NetworkStack;
+import java.util.concurrent.Executors;
 import android.net.TetheringManager;
 import android.net.Uri;
 import android.net.ip.IpClientUtil;
@@ -290,6 +294,7 @@ import java.io.DataOutputStream;
  */
 public class WifiServiceImpl extends IWifiManager.Stub {
     private static final String TAG = "WifiService";
+    private static final String TAG_AP = "WifiServiceAP";
     private static final boolean VDBG = false;

     /** Max wait time for posting blocking runnables */
@@ -391,6 +396,8 @@ public class WifiServiceImpl extends IWifiManager.Stub {

     private final DefaultClientModeManager mDefaultClientModeManager;

+    private TetheringManager mTetheringManager = null;
+
     private final WepNetworkUsageController mWepNetworkUsageController;

     private final FeatureFlags mFeatureFlags;
@@ -809,6 +816,7 @@ public class WifiServiceImpl extends IWifiManager.Stub {
         mFeatureFlags = mDeviceConfigFacade.getFeatureFlags();
         mApplicationQosPolicyRequestHandler = mWifiInjector.getApplicationQosPolicyRequestHandler();
         mWifiPulledAtomLogger = mWifiInjector.getWifiPulledAtomLogger();
+        mTetheringManager = mContext.getSystemService(TetheringManager.class);
         mAfcManager = mWifiInjector.getAfcManager();
         mTwtManager = mWifiInjector.getTwtManager();
         mWepNetworkUsageController = mWifiInjector.getWepNetworkUsageController();
@@ -1047,6 +1055,7 @@ public class WifiServiceImpl extends IWifiManager.Stub {
             registerForCarrierConfigChange();
             mWifiInjector.getAdaptiveConnectivityEnabledSettingObserver().initialize();
             mIsWifiServiceStarted = true;
+            mActiveModeWarden.addWifiNetworkStateChangedListener(new WifiNetworkStateChangedListener());
         }, TAG + "#checkAndStartWifi");
     }

@@ -9275,6 +9284,121 @@ public class WifiServiceImpl extends IWifiManager.Stub {
         }, TAG + "#getSupportedSimultaneousBandCombinations");
     }

+    public class WifiNetworkStateChangedListener extends IWifiNetworkStateChangedListener.Stub {
+
+        public static final int MAKE_Hotspot_With_Network_DELAYED_MILLIS = 2 * 1000;
+
+        @Override
+        public void onWifiNetworkStateChanged(int clientRole, int status) {
+            switch (status) {
+                case WifiManager.WifiNetworkStateChangedListener.WIFI_NETWORK_STATUS_DISCONNECTED:
+                    mWifiThreadRunner.removeCallbacks(makeHotspotWithConnectedNetworkRunnable);
+                    break;
+                case WifiManager.WifiNetworkStateChangedListener.WIFI_NETWORK_STATUS_CONNECTED:
+                    mWifiThreadRunner.removeCallbacks(makeHotspotWithConnectedNetworkRunnable);
+                    mWifiThreadRunner.postDelayed(makeHotspotWithConnectedNetworkRunnable,
+                            MAKE_Hotspot_With_Network_DELAYED_MILLIS,"WifiServiceImpl");
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        private Runnable makeHotspotWithConnectedNetworkRunnable = () -> {
+            updateApConfiguration();
+            restartTetheringIfNeeded();
+        };
+
+        //update new ap config
+        private void updateApConfiguration() {
+            SoftApConfiguration newSoftApConfig = makeNewSoftApConfiguration(
+                    mWifiApConfigStore.getApConfiguration(), mActiveModeWarden.getConnectionInfo());
+            Log.w(TAG_AP, "Update Hotspot due network connected : " + newSoftApConfig);
+            mWifiApConfigStore.setApConfiguration(newSoftApConfig);
+            mActiveModeWarden.updateSoftApConfiguration(newSoftApConfig);
+        }
+
+        private SoftApConfiguration makeNewSoftApConfiguration(SoftApConfiguration oldSoftApConfig,
+                                                               WifiInfo connectionInfo) {
+            if (connectionInfo.getFrequency() == 0) {
+                return new SoftApConfiguration.Builder(oldSoftApConfig)
+                        .setBand(SoftApConfiguration.BAND_2GHZ)
+                        .build();
+            }else {
+                return new SoftApConfiguration.Builder(oldSoftApConfig)
+                        .setBand(ApConfigUtil.convertFrequencyToBand(connectionInfo.getFrequency()))
+                        .build();
+            }
+        }
+
+        //restart soft ap
+        private void restartTetheringIfNeeded() {
+            int apStatue = getWifiApEnabledState();
+            if (apStatue == WIFI_AP_STATE_ENABLED || apStatue == WIFI_AP_STATE_ENABLING) {
+                Log.w(TAG_AP, "Restarting Tethering");
+                apNeedRestart = true;
+                if (!mTetheredSoftApTracker.registerSoftApCallback(new SoftApCallback(),null)) {
+                    Log.e(TAG_AP, "registerSoftApCallback: Failed to add callback");
+                }
+                Log.w(TAG_AP, "Stopping Tethering");
+                mTetheringManager.stopTethering(TETHERING_WIFI);
+            }
+        }
+
+    }
+
+    private boolean apNeedRestart;
+
+    public class SoftApCallback extends ISoftApCallback.Stub {
+
+        private static final int RESTART_INTERVAL_MS = 200;
+
+        @Override
+        public void onStateChanged(SoftApState state) {
+            if (state.getState() == WIFI_AP_STATE_DISABLED) {
+                Log.w(TAG_AP, "AP DISABLED");
+                if (!apNeedRestart) {
+                    return;
+                }
+                mWifiThreadRunner.postDelayed(() -> {
+                    Log.w(TAG_AP, "Starting Tethering");
+                    mTetheringManager.startTethering(TETHERING_WIFI,
+                            Executors.newSingleThreadExecutor(), new StartTetheringCallback());
+                }, RESTART_INTERVAL_MS,"WifiServiceImpl");
+                apNeedRestart = false;
+            } else if (state.getState() == WIFI_AP_STATE_ENABLED) {
+                Log.w(TAG_AP, "AP ENABLED");
+            }
+        }
+
+        @Override
+        public void onConnectedClientsOrInfoChanged(Map<String, SoftApInfo> infos,
+                                                    Map<String, List<WifiClient>> clients, boolean isBridged,
+                                                    boolean isRegistration){
+        }
+
+        @Override
+        public void onCapabilityChanged(SoftApCapability capability){
+        }
+
+        @Override
+        public void onBlockedClientConnecting(WifiClient client, int blockedReason){
+        }
+        @Override
+        public void onClientsDisconnected(SoftApInfo info,List<WifiClient> clients){
+        }
+    }
+
+    private class StartTetheringCallback implements TetheringManager.StartTetheringCallback {
+        @Override
+        public void onTetheringStarted() {
+        }
+
+        @Override
+        public void onTetheringFailed(int error) {
+        }
+    }
+
     /**
      * Set the mock wifi service for testing
      */
diff --git a/service/java/com/android/server/wifi/util/ApConfigUtil.java b/service/java/com/android/server/wifi/util/ApConfigUtil.java
index c60a9f4f35..d5bde9a92b 100644
--- a/service/java/com/android/server/wifi/util/ApConfigUtil.java
+++ b/service/java/com/android/server/wifi/util/ApConfigUtil.java
@@ -82,6 +82,8 @@ import java.util.Set;
 import java.util.StringJoiner;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+import android.net.wifi.WifiInfo;
+import com.android.server.wifi.ClientModeManager;

 /**
  * Provide utility functions for updating soft AP related configuration.
@@ -1000,6 +1002,7 @@ public class ApConfigUtil {
             @NonNull CoexManager coexManager,
             WifiResourceCache resources,
             String countryCode,
+            List<ClientModeManager> clientModeManagers,
             SoftApConfiguration.Builder configBuilder,
             SoftApConfiguration config,
             SoftApCapability capability) {
@@ -1044,6 +1047,20 @@ public class ApConfigUtil {
             }
         }

+        //Make AP band same as Connect band, default BAND_5GHZ
+//        configBuilder.setBand(SoftApConfiguration.BAND_5GHZ);
+        for (ClientModeManager cmm
+                : clientModeManagers) {
+            WifiInfo wifiConnectedInfo = cmm.getConnectionInfo();
+            int frequency = wifiConnectedInfo.getFrequency();
+            if (frequency > 0) {
+                Log.d(TAG, "Connected Frequency " + frequency
+                        + ", make AP band same as Connected band.");
+                configBuilder.setBand(convertFrequencyToBand(frequency));
+                break;
+            }
+        }
+
         return SoftApManager.START_RESULT_SUCCESS;
     }

内容概要:本文介绍了一个针对电力系统连锁故障传播路径的N-k多阶段双层优化及故障场景筛选模型,该模型基于混合整数线性规划(MILP)方法构建,旨在全面评估电力系统在遭受多重故障时的脆弱性与恢复能力。通过引入故障传播路径的概念,模型能够动态模拟故障在电网中的逐级扩散过程,并结合多阶段优化策略,实现对关键故障场景的有效识别与优先排序。整个框架不仅考虑了初始故障元件的选取,还涵盖了后续因潮流转移引发的级联跳闸行为,从而提升了风险评估的准确性与时效性。该研究已在Matlab平台上完成代码实现,具备良好的可复现性工程应用价值,适用于提升现代电网的安全防御水平。; 适合人群:电力系统、能源安全及相关领域的科研人员、高校研究生以及从事电网规划与运行管理的工程技术人员。; 使用场景及目标:①用于电力系统安全评估中识别最危险的N-k故障组合;②支撑电网应急预案制定与薄弱环节改造;③作为学术研究中关于级联故障建模与优化求解的教学与验证工具;④服务于智能电网背景下抵御蓄意攻击或极端事件的风险防控决策。; 阅读建议:建议读者结合Matlab代码深入理解模型的数学 formulation 与求解流程,重点关注目标函数设计、约束条件构建及双层优化结构的实现逻辑,时可通过调整系统参数故障设定进行仿真对比分析,以掌握不因素对连锁故障演化的影响规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值