【问题标题】:Android Wifi Roaming through AP with same SSIDAndroid Wifi漫游通过具有相同SSID的AP
【发布时间】:2016-06-21 10:19:12
【问题描述】:

我看到 Android 系统在 Wifi 漫游时表现不佳。 我们有一个 Wifi 集中式网络,其中包含许多具有单一 SSID 的 AP。 Adroid 手机不会无缝漫游。 即使有其他 AP(具有相同 SSID)信号良好,Android 手机也会尝试与 AP 保持连接,直到信号变为零! 当信号为零时,最后它会与另一个 AP(信号良好)进行关联。但是由于这种行为,手机会丢失所有 TCP 连接!

例如:

  1. 手机已通过 WiFi 连接到 AP1
  2. 电话在大楼内移动,现在听到来自 AP1 和 AP2 的两个信号。
  3. 当来自 AP2 的信号强于来自 AP1 的信号时,我希望手机对 AP2 进行 重新关联(不是关联)。

想法是:

  • 执行WifiManager.startScan()
  • 获取结果WifiManager.getScanResults()
  • 在结果中找到最佳 AP
  • 与最佳 AP 进行重新关联

每 30 秒重复一次。

我谈论重新关联是因为我不希望手机丢失 TCP 连接。

有办法做到这一点吗?

谢谢你, 齐射

【问题讨论】:

    标签: android wifi access-point roaming


    【解决方案1】:

    您无法按照您的描述执行此操作。客户端无法自行确定 TCP 连接的状态。您的网络还必须将通信通道从一个 AP 移动到另一个 AP。这可以通过正确的网络控制器来完成。

    此外,您应该查看 IEEE 802.11k - https://en.wikipedia.org/wiki/IEEE_802.11k-2008

    【讨论】:

      【解决方案2】:

      添加以下权限;

      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
      

      注册以下意图;

      private WifiBroadcastReceiver wifiBroadcastReceiver = new WifiBroadcastReceiver();
      

      然后在常规;

      registerReceiver(wifiBroadcastReceiver, new IntentFilter("android.net.wifi.SCAN_RESULTS"));
      

      使用下面的类来改变重新关联;

      public class WifiBroadcastReceiver extends BroadcastReceiver {
      
          private WiFiManager manager = null;//set the value in constructor
          private WifiConfiguration connectedConfiguration = null;//set the value in constructor
          private int connectedNetId;
      
          private void updateConnectedConfiguration(String ssid) {
              configs = manager.getConfiguredNetworks();
              int nid = 0;
              for (WifiConfiguration cnf : configs) {
                  if (cnf.SSID.substring(1, cnf.SSID.length() - 1).equals(ssid)) {
                      connectedConfiguration = cnf;
                      connectedNetId = nid;
                  }
                  nid++;
              }
          }
      
      
          public void onReceive(Context c, Intent intent) {
              List<ScanResult> results = manager.getScanResults();
              WifiInfo info = manager.getConnectionInfo();
              ScanResult stronger = null;
              for (ScanResult scanResult : results) {
                  try {
                      if (scanResult.SSID.equals(info.getSSID())) {
                          if (stronger == null) {
                              if (WifiManager.compareSignalLevel(info.getRssi() + 5, scanResult.level) < 0) {
                                  stronger = scanResult;
                              }
                          } else if (WifiManager.compareSignalLevel(stronger.level, scanResult.level) < 0) {
                              stronger = scanResult;
                          }
                      }
                  } catch (Exception e) {
                  }
              }
              if (stronger != null && !stronger.BSSID.equals(info.getBSSID())) {
                  updateConnectedConfiguration(info.getSSID());
                  if (connectedConfiguration != null) {
                      connectedConfiguration.BSSID = stronger.BSSID;
                      manager.updateNetwork(connectedConfiguration);
                      manager.saveConfiguration();
                      manager.enableNetwork(connectedNetId, true);
                      manager.reassociate();
                      info = manager.getConnectionInfo();
                      //showNotification("\nConnecting " + stronger.SSID, stronger.BSSID + " " + stronger.level + "dBm");
                  }
              }
          }
      }
      

      【讨论】:

      • 在哪里添加这个代码sn-p?什么文件在什么目录下?要添加的“常规”是什么?你测试过这段代码吗?
      • 可以将代码 sn-p 添加到您的应用程序中。您的应用程序在运行时会进行重新关联。您可以通过这种实现在应用商店中找到第三方应用。代码已经过测试。谢谢。
      猜你喜欢
      • 2023-04-09
      • 2019-02-18
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2015-07-29
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多