【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 >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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM