【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.0\Common7\IDE。
第2步,你有没有看见有两个目录:ProjectTemplates和ProjectTemplatesCache。VS的项目模板就在里面,这下子你懂了吧,对啊,直接把项目模板改掉,那么每次新建项目时就会自动用最新的版本了。我们只要改ProjectTemplates目录中的内容就可以了,ProjectTemplatesCache下的不用理它。当ProjectTemplates目录被更改后,ProjectTemplatesCache中的内容会自动更新。
第3步,打开ProjectTemplates目录,依次找到\CSharp\Windows Root\Windows UAP\1033,因为我用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 >)
{
wifiAdt = adpts[];
}
} }
获取到无线适配器后,可以开始扫描。
// 扫荡开始,请注意!
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 == )
{
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
【Win10 应用开发】扫描和连接Wi-fi网络的更多相关文章
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- win10 ,本地连接无法识别网络 ,无线正常,
win10 ,本地连接无法识别网络 ,无线正常, 电脑诊断是:“此计算机上缺少一个或者多个网络协议” 1.手动设置ip 失败 2.网卡卸载驱动 ...
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
- iOS开发 - Swift实现检测网络连接状态及网络类型
一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...
- DSAPI Wifi热点的扫描与连接
使用DSAPI扫描和连接Wifi热点,支持连接隐藏的SSID. 效果演示: 代码如下: Private Wifi As New DSAPI.网络.Wifi Private Sub Button1_Cl ...
- 49.Linux-wpa_cli使用之WIFI开启,扫描热点,连接热点,断开热点,WIFI关闭(49)
本章学习内容: 1.WIFI如何开启 2.扫描热点 3.连接热点 4. 断开热点 5.关闭WIFI 本节使用的是wpa_supplicant工具,它主要包含wpa_supplicant(命令行模式)与 ...
- Win10系统进行远程桌面连接出现身份验证错误怎么办
在win10系统中,自带有远程桌面连接功能,但是有时候会遇到一些问题,比如有不少用户反映说在进行远程桌面连接的时候,出现身份验证错误的情况,导致远程连接失败,接下来给大家分享一下Win10系统进行远程 ...
- win10无线网连接 提示无法连接到此网络
一.Win10无法连接此网络是怎么回事 对于大多数遇到无法连接此网络问题的,主要是Win10笔记本电脑用户,使用的是无线网络.而出现Win10连接其他无线网络正常,但是就是某个无线网络无法正常连接的时 ...
随机推荐
- 一张图系列——从CreateProcess到main函数的过程
整体过程如下: 需要说明两点: 1.在XP中,新进程主线程的启动,会先执行一个用户态的APC,会执行ntdll!LdrInitializeThunk进行程序执行前的一些列初始化操作.其中很重要任务就是 ...
- 使用系统自带的GCD的timer倒计时模板语句遇到的小坑。。
今天折腾了下系统gcd的 但是如果不调用这句dispatch_source_cancel()那么这个timer根本不工作....解决方法如下: 实现一个倒计时用自带的gcd如此简洁.. 原因可能是如果 ...
- 基于XML配置的spring aop增强配置和使用
在我的另一篇文章中(http://www.cnblogs.com/anivia/p/5687346.html),通过一个例子介绍了基于注解配置spring增强的方式,那么这篇文章,只是简单的说明,如何 ...
- php数据加密
<?php/** * 简单对称加密算法之加密 * @param String $string 需要加密的字串 * @param String $skey 加密EKY * @author Anyo ...
- stl文件格式解析代码--java版
代码是参考three.js中的stlLoader.js写的. 需要注意的地方,java中byte取值-128~127 package test_stl.test_entry; import java. ...
- IDT HOOK思路整理
IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后 ...
- sql SYS对象集合
select * from SYS.objects select * from SYS.all_objects select * from SYS.tables select * from SYS.c ...
- Get-FilewithExtension
1: <# 2: 用途: 3: 根据指定的路径和文件类型查找出文件,显示其完整路径以及大小 4: 使用方法: 5: Get-FilewithExtension -path path1,path2 ...
- dereverberation
Typical Approach to Dereverberation DOAs Estimating the directions of arrival of a direct source sig ...
- 网站压力负载测试工具:Web版已逝,只好送大伙单机版
前言: 最近老板资金周转出了点问题,工资好久没发了,于是暂闲置在家,静待老板弄到钱东山再起的消息: QQ群里,偶尔不时的会有人问,原来的分布式网站负载工具怎么下载不了啦?或者不能用啦?之类的问题. 我 ...