zoukankan      html  css  js  c++  java
  • 【Win10 应用开发】扫描和连接Wi-fi网络

    老周今天带大家去“扫雷”了,别当真,是扫描并连接指定无线网络,时尚一点叫Wi-fi。

    所以,今天的任务要求你的设备至少有1张无线网卡,目前老周没看到过有N张无线网卡的设备。像笔记本、平板等设备都可以,当然最好是笔记本,因为你得编程啊;不然你捧着一台平板写代码,虽然好玩,但速度慢。不过,你的板子如果有键盘的话就没事。

    哦,想起来了,在开始今天的任务前,老周先给大家讲个故事。

    话说公元2015年6月末,微软发布了面向build 10158的SDK,你可以下载安装,你也可以不装,你可以在现有的10069上直接安装,这样在VS的项目中可以选择不同版本;不过,老周为了节约空间,就把10069的SDK卸了,然后装上10158的SDK,装完后,发现新建的通用平台项目还是默认面向10069的,当然你可以在新建项目后去修改版本号(这是官网给出的方案),可是,我如果铁了心地要用最新的SDK,这样每次新建项目后还要去改版本号,比较消耗劳动力,而且老周是玩了十年.NET的人,早已经习惯了高生产率的开发过程,比较不适应低效能开发。

    于是,老周想,反正也只是预览版,不用考虑过多,先解决眼前之事,老周希望:新建的项目会自动默认为10158,其实这不难,重点是你有胆量去修改VS安装目录下的文件。

    第1步,打开目录C:Program Files (x86)Microsoft Visual Studio 14.0Common7IDE。

    第2步,你有没有看见有两个目录:ProjectTemplates和ProjectTemplatesCache。VS的项目模板就在里面,这下子你懂了吧,对啊,直接把项目模板改掉,那么每次新建项目时就会自动用最新的版本了。我们只要改ProjectTemplates目录中的内容就可以了,ProjectTemplatesCache下的不用理它。当ProjectTemplates目录被更改后,ProjectTemplatesCache中的内容会自动更新。

    第3步,打开ProjectTemplates目录,依次找到CSharpWindows RootWindows UAP1033,因为我用C#语言,所以目录是CSharp,这目录下有几个目录,就是UAP项目的几个模板了。

    我们只需要改两个地方:项目文件的版本配置;如果项目有清单文件,就把清单文件也改一下。

    第4步,我以BlankApplication(空白应用)项目为例,用记事本打开Application.csproj文件(项目文件),然后找到第一个<PropertyGroup>节点,然后会看到这段XML:

        <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
        <TargetPlatformVersion>10.0.10158.0</TargetPlatformVersion>
        <TargetPlatformMinVersion>10.0.10158.0</TargetPlatformMinVersion>

    把以上两个版本都改为10.0.10158.0就可以了。

    保存文件时要注意,因为只有系统有改写权限,这时候你是保存不的,请打开该文件的属性-安全页,然后点击“高级”。

    然后,不要修改所有者帐号,万一你改不回来,就有损文件的安全性,保持默认的SYSTEM为所有者。点击下面的“更改权限”。

    然后把你当前登录的帐户加进去,并勾选“完全控制”权限。

    这样你就有权限修改文件了,待文件保存后,请按照上面方法,把刚才你添加的当前用户的权限删除,以确保安全。

    第4步,打开Package-managed.appxmanifest文件,即清单文件,然后把以下XML中的版本号改一下:

      <Dependencies>
        <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.10158.0" MaxVersionTested="10.0.10158.0" />
      </Dependencies>

    这样修改之后,你新建的项目就是面向10158了,其他几个如类库、Runtime组件、单元测试这些项目的修改方法也一样。

    ===========================================

    好,上面内容纯属插曲,下面开始唱主题曲。

     本任务分为两部分,第一部分是扫描无线网络;第二部分是连接。

    1、调用WiFiAdapter类的RequestAccessAsync方法,看看你有没有资格进行扫描操作。如果没有权限,那就没戏了。

    2、调用WiFiAdapter.FindAllAdaptersAsync静态方法,可以把你设备上的无线网卡全找出来,通常只有1个,如果没有无线网卡,那就别扫描了。

    3、每个WiFiAdapter对象表示一个无线网卡。此时调用WiFiAdapter实例的ScanAsync方法就可以开始扫描了。

    4、扫描完,会在WifiAdapter实例的.NetworkReport.AvailableNetworks中得到Wifi列表,每个网络都用一个WiFiAvailableNetwork对象表示,比如Ssid属性就是网络的SSID名称。

    至此,扫描阶段完成。下面是连接到指定网络。

    1、调用WifiAdapter实例的ConnectAsync方法就可以尝试连接指定的无线网络。

    2、ConnectAsync方法的第一个参数为一个WiFiAvailableNetwork实例,就是前面扫描出来的网络对象;第二个参数是一个WiFiReconnectionKind枚举类型的值,Automatic表示自动连接网络;Manual表示下次连接需要手动连接。

    3、如果wi fi网络需要密码,则在调用ConnectAsync方法时,需要指定一个PasswordCredential对象,它包含连接的密码。

    OK,理论讲完了,下面咱们实践一下。

    首先,获取表示无线网卡的WifiAdapter对象。

            WiFiAdapter wifiAdt = null;
    
            protected override async void OnNavigatedTo(NavigationEventArgs e)
            {
                // 首先你得确认一下,有没有权限扫描无线网络
                var reqres = await WiFiAdapter.RequestAccessAsync();
                if (reqres == WiFiAccessStatus.Allowed)
                {
                    // 先找一找设备上有没有无线网卡
                    // 不要禁用无线网卡,不然可能找不到适配器,你懂的
                    var adpts = await WiFiAdapter.FindAllAdaptersAsync();
                    // 就算你的设备有100张网卡,一般只要一张联网就行了
                    // 所以取出第一个适配器
                    if (adpts.Count >0)
                    {
                        wifiAdt = adpts[0];
                    }
                }
    
            }

    获取到无线适配器后,可以开始扫描。

                // 扫荡开始,请注意!
                await wifiAdt.ScanAsync();
                // 显示扫到的无线网络列表
                wifiList.ItemsSource = wifiAdt.NetworkReport.AvailableNetworks;

    wifiList是一个ListBox控件,扫描到的网络列表都显示到ListBox控件上。

    接下来,实现连接用户在ListBox中选定的无线网络。

                // 获取被选中的网络
                WiFiAvailableNetwork networkitem = wifiList.SelectedItem as WiFiAvailableNetwork;
    
                WiFiConnectionResult connectionResult;
                if (networkitem?.SecuritySettings.NetworkAuthenticationType != Windows.Networking.Connectivity.NetworkAuthenticationType.None)
                {
                    // 需要密码验证
                    if (pwdWifi.Password.Length == 0)
                    {
                        MessageDialog dlg = new MessageDialog("请输入密码。");
                        await dlg.ShowAsync();
                        return;
                    }
                    // 设置密码
                    PasswordCredential pwd = new PasswordCredential();
                    pwd.Password = pwdWifi.Password;
                    // 开始连接
                    connectionResult = await wifiAdt.ConnectAsync(networkitem, WiFiReconnectionKind.Automatic, pwd);
                }
                else
                {
                    // 无需密码,直接连上
                    connectionResult = await wifiAdt.ConnectAsync(networkitem, WiFiReconnectionKind.Automatic);
                }
    
                string msg= "";
                if (connectionResult.ConnectionStatus == WiFiConnectionStatus.Success)
                { // 如果成功
                    msg = "连接成功。";
                }
                else
                { // 要是没连上,请检讨人品
                    msg = $"连接失败,状态:{connectionResult.ConnectionStatus}";
                }

    最后,这一步,很重要,不要忘了,如果没有这一步,你是无法进行扫描和连接操作的。

    打开清单文件Package.appxmanifest,找到Capabilities节点,加入一个DeviceCapability元素,声明允许应用程序进行Wifi控制。

      <Capabilities>
        <Capability Name="internetClient" />
        <DeviceCapability Name="wifiControl"/>
      </Capabilities>

    输入完,保存清单文件。

    ===========================================

    简单的项目已经完成了,下面是见证人品的时候了。

    运行应用程序,开始扫荡你附近的无线网络。

    选择一个验证方式为None,即没有密码的;或者选一个你知道密码的网络,点击下面的“连接选中网络”按钮。

    如果人品较好,会连上。

    如果有密码,就输入密码。

    然后连接成功。

    如果人品欠佳,可能连不上。

    好了,今天的任务完成了。老周要开饭了。

    示例源码下载:http://files.cnblogs.com/files/tcjiaan/wifiSampleApp.zip

  • 相关阅读:
    【java】一种自动生成数据库文档的方法
    sublime vintage mode 按住一个键(比如 j)不会重复的问题
    SQL Service服务更换帐户后无法启动的情况(Security 4625 Type 5)
    隐藏的计划任务运行,导致账户被锁的调查方法
    nodejs 热更新页面
    数组转tree arrToTree
    compose函数
    react 类组件的生命周期
    qiankun 微应用demo
    application 'xxx' died in status LOADING_SOURCE_CODE: [qiankun] You need to export lifecycle functions in xxx entry
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/4619278.html
Copyright © 2011-2022 走看看