老周今天帶大家去“掃雷”了,別當真,是掃描並連接指定無線網絡,時尚一點叫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 >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
