如何在 Android 中连接到加密算法未知的 WiFi 网络?

2024-01-06

我研究过这个问题堆栈溢出,但所有答案都指定了如何使用已知加密算法(主要是 WEP)连接到网络。在我的应用程序中,我检索可用 wifi 网络的列表,并将它们显示在ListView (using WifiManager)。当用户单击列表中的一项时,我想连接到网络。

我当前的实现尝试获得WifiConfiguration数据来自ScanResult的功能字符串。例如,这些都是检索到的实际功能字符串:

[WPA2-PSK-CCMP][ESS]
[WPA2-PSK-CCMP+TKIP][ESS]
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]

根据一些研究,我假设这些是括号分隔的功能,并且每一项的第一项都是-分隔的字符串显示:

[Authentication Algorithm - Key Management Algorithm - Pairwise Cipher]

我解析这些数据,然后创建一个WifiConfiguration对象,然后尝试连接到它,但总是失败(addNetwork回报-1)。我究竟做错了什么?这是我的代码:

@Override
public void onItemClick(AdapterView<?> adapter, View parent, int position, long id) {
    ScanResult result = (ScanResult) adapter.getItem(position);
    WifiConfiguration config = new WifiConfiguration();

    String currentNetwork = mWifiManager.getConnectionInfo().getSSID();
    if (currentNetwork != null && currentNetwork.equals(result.SSID))
    {
        Toast.makeText(this, "Already connected", Toast.LENGTH_SHORT).show();
        return;
    }

    config.BSSID = result.BSSID;
    config.SSID = result.SSID;
    String firstCapabilities = result.capabilities.substring(1, result.capabilities.indexOf("]")-1);
    String[] capabilities = firstCapabilities.split("-");
    String auth = capabilities[0];
    String keyMgmt = capabilities[1];
    String pairwiseCipher = capabilities[2];

    int a = 0;
    if (auth.contains("EAP"))
        a |= WifiConfiguration.AuthAlgorithm.LEAP;
    else if (auth.contains("WPA"))
        a |= WifiConfiguration.AuthAlgorithm.OPEN;
    else if (auth.contains("WEP"))
        a |= WifiConfiguration.AuthAlgorithm.SHARED;
    config.allowedAuthAlgorithms.set(a);

    int k = WifiConfiguration.KeyMgmt.NONE;
    if (keyMgmt.contains("IEEE802.1X"))
        k |= WifiConfiguration.KeyMgmt.IEEE8021X;
    else if (auth.contains("WPA") && keyMgmt.contains("EAP"))
        k |= WifiConfiguration.KeyMgmt.WPA_EAP;
    else if (auth.contains("WPA") && keyMgmt.contains("PSK"))
        k |= WifiConfiguration.KeyMgmt.WPA_PSK;
    config.allowedKeyManagement.set(k);

    int c = WifiConfiguration.PairwiseCipher.NONE;
    if (pairwiseCipher.contains("CCMP"))
        c |= WifiConfiguration.PairwiseCipher.CCMP;
    if (pairwiseCipher.contains("TKIP"))
        c |= WifiConfiguration.PairwiseCipher.TKIP;
    config.allowedPairwiseCiphers.set(c);

    int networkId = mWifiManager.addNetwork(config);
    if (networkId == -1)
    {
        //always hits this line!
        Toast.makeText(this, "Failed to create network configuration", Toast.LENGTH_SHORT).show();
    }
    else
    {
        //Never reaches here!
        mWifiManager.disconnect();
        mWifiManager.enableNetwork(networkId, true);
        mWifiManager.reconnect();
    }

}

对于 WPA*,如果您未将 preSharedKey 设置为 8 个或更多字符,则会失败并返回 -1。我根本没看到你设置它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Android 中连接到加密算法未知的 WiFi 网络? 的相关文章

随机推荐

  • 在音频设备连接/断开时自动收到通知?

    每当用户连接或断开音频设备时是否可以自动收到通知 在 Vista 中 您可以使用 Core AudioIMMNotificationClient 接口 http msdn microsoft com en us library window
  • Sidekiq - 无法在 5.000 秒内获得数据库连接

    我在 os x 上开发 Rails 4 和 Sidekiq 时收到以下警告 10 13 39 worker 1 2014 09 22T07 13 39 857Z 86981 TID oug0oog10 WARN could not obta
  • 如何在OpenCart中设置配置?

    警告 require once sgweb1 minufashion system startup php function require once 无法打开流 没有这样的文件或 目录在 D inetpub vhosts sgwebgen
  • 从可访问性的角度来看,我应该更喜欢

    这个问题在这里已经有答案了 通常 在书籍 教程和一些实际网页中 我看到导航栏标记为 li a 中的 s 元素 ul 中的元素 ul li
  • 类型错误:无法连接“str”和“type”对象

    在解决我的问题之前 我已经四处寻找答案 但似乎找不到任何针对我的情况的信息 好的 基本上我通过 cmd 调用我的脚本并传入 16 个参数并使用它们来设置我拥有的一些变量 我正在创建一个自定义 html 报告供我们公司使用 我只是用这些变量来
  • pandas.read_excel() 输出“OverflowError:日期值超出范围”,而不存在日期列

    我正在尝试将一个大的 Excel 文件 400k x 40 导入到 Pandas DataFrame 中 虽然它在我的本地计算机上运行良好 但在移植到 Python 3 7 Pandas 1 2 4 和 Openpyxl 3 0 7 的 L
  • 如何在配置文件中隐藏数据库密码

    我正在开发一个 C 项目 该项目需要访问数据库以读取其输入 到目前为止 我们使用了默认用户名 postgres 和存储在基于 xml 的配置文件中的 固定明文 密码以及许多其他设置 现在我需要的是在提供配置文件时向用户隐藏密码 FYI 开发
  • gulp 构建语义用户界面非常慢

    我已经为此搜索了好几天 但运气不佳 我通过 NPM 通过 Laravel 安装安装了 Semantic UI 我修改了项目根目录中的 gulpfile js 以导入语义 UI 的构建和监视任务 var elixir require lara
  • 媒体会话兼容未在 Pre-Lollipop 上显示锁屏控件

    我在用着MediaSessionCompat来自 AppCompat 支持库修订版 22 在 Lollipop 上 我收到通知 而且锁屏的背景是专辑封面 一切都很顺利 在棒棒糖之前的设备上 锁屏上的音乐控件根本不显示 这很奇怪 我尝试了一切
  • AngularJS:使用多行写入和读取文本区域

    我不敢相信为什么我找不到这个主题的任何内容 我得到了一个表格 其中包含姓氏 输入 名字 输入 描述 文本区域 因为我想提供几行 让我们从创建一个新对象开始 好的 你输入类似的内容 姓 fox 名 peter 描述 what can I sa
  • fread():从文件读取(不对齐)会导致跳过字节

    我有一个文件 使用 C 我想使用 fread 来自 stdio h 读取它的内容并将其写入结构的成员中 在我的例子中 开头有一个 2 字节 int 后面跟着一个 4 字节 int 但是 在将文件内容正确写入结构的前两个字节变量后 它会跳过两
  • 是否可以将 Asterisk 作为支持 WebRTC 的移动应用程序的信令服务器

    是否可以将 Asterisk 作为支持 WebRTC 的移动应用程序的信令服务器 我发现我需要在node js 中创建信令服务器 我想知道 Asterisk 是否可以为我完成这项工作 此外 WebRTC 媒体是否通过信令服务器传递 或者 是
  • 在 GitLab CI 管道中使用 docker-compose

    我正在尝试使用以下内容实现 GitLab 持续集成 CI 管道 gitlab ci yml file image docker latest When using dind it s wise to use the overlayfs dr
  • Matlab 相当于 Python 的“None”

    Matlab中是否有一个关键字大致相当于None在Python中 我试图用它来标记函数的可选参数 我正在翻译以下Python代码 def f x y None if y None return g x else return h x y 进
  • Winrt StreamWriter 和 StorageFile 未完全覆盖文件

    在这里快速搜索一无所获 因此 我开始使用一些相当迂回的方法在我的 WinRT 应用程序中使用 StreamWriter 阅读效果很好 写作则不同 我看到的是 当我选择要写入的文件时 如果我选择一个新文件 那么就没有问题 该文件已按我的预期创
  • 如何在Android上创建简单的日历[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何通过 Typescript 使用全局 Node 包

    可以通过安装全局包来使用它们npm install g 如果以这种方式安装 Typescript 类型 它们也可以在全局文件夹中使用 例如 usr lib node modules在Linux系统上 当使用以下命令转译打字稿源文件时tsc
  • Spring Data JPA底层机制无实现

    我开始阅读本教程 春季启动教程 https spring io guides tutorials bookmarks 在此我读到 在模型模块下 他们实现了 POJO 和存储库接口 gt github上的教程 https github com
  • 如何使用JNI代码正确导入Android库?

    背景 我制作了一个使用 JNI 进行位图处理的小型 SDK 链接here https github com AndroidDeveloperLB AndroidJniBitmapOperations 它只有 2 个项目 一个示例项目 演示
  • 如何在 Android 中连接到加密算法未知的 WiFi 网络?

    我研究过这个问题堆栈溢出 但所有答案都指定了如何使用已知加密算法 主要是 WEP 连接到网络 在我的应用程序中 我检索可用 wifi 网络的列表 并将它们显示在ListView using WifiManager 当用户单击列表中的一项时