From f812587076d02341cdd34dcc50af2de432cba380 Mon Sep 17 00:00:00 2001 From: Paul Monson Date: Thu, 11 Jan 2018 17:18:44 -0800 Subject: [PATCH] update wifi support to include pushbutton and eap --- .../CS/IoTCoreDefaultApp/App.xaml.cs | 9 +- .../IoTCoreDefaultApp.csproj | 1 + .../Presenters/NetworkPresenter.cs | 286 +++++++++------ .../Presenters/WifiListViewItemPresenter.cs | 241 +++++++++++++ .../Strings/en-US/Resources.resw | 30 ++ .../CS/IoTCoreDefaultApp/Styles.xaml | 17 +- .../UserControls/NetworkListControl.xaml | 306 ++++++++-------- .../UserControls/NetworkListControl.xaml.cs | 340 ++++++++++++------ .../CS/IoTCoreDefaultApp/Utils/Log.cs | 31 +- .../IoTCoreDefaultApp/Views/MainPage.xaml.cs | 5 +- .../IoTCoreDefaultApp/Views/OOBENetwork.xaml | 6 +- .../Views/OOBENetwork.xaml.cs | 24 +- .../Views/OOBEWelcome.xaml.cs | 4 +- .../CS/IoTCoreDefaultApp/Views/Settings.xaml | 4 +- .../IoTCoreDefaultApp/Views/Settings.xaml.cs | 23 +- .../CS/WiFiConnect_Scenario.xaml.cs | 17 +- 16 files changed, 929 insertions(+), 415 deletions(-) create mode 100644 Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/WifiListViewItemPresenter.cs diff --git a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/App.xaml.cs b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/App.xaml.cs index 629e3a9..6dc28e8 100644 --- a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/App.xaml.cs +++ b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/App.xaml.cs @@ -3,6 +3,7 @@ using IoTCoreDefaultApp.Utils; using System; +using System.Threading.Tasks; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.Devices.Enumeration; @@ -40,6 +41,7 @@ namespace IoTCoreDefaultApp // Don't try and make discoverable if this has already been done private static bool isDiscoverable = false; + public static NetworkPresenter NetworkPresenter { get; } = new NetworkPresenter(); public static bool IsBluetoothDiscoverable { @@ -71,7 +73,7 @@ namespace IoTCoreDefaultApp /// will be used such as when the application is launched to open a specific file. /// /// Details about the launch request and process. - protected override void OnLaunched(LaunchActivatedEventArgs e) + protected override async void OnLaunched(LaunchActivatedEventArgs e) { /*#if DEBUG @@ -130,6 +132,11 @@ namespace IoTCoreDefaultApp Window.Current.Activate(); Screensaver.InitializeScreensaver(); + await Task.Run(async () => + { + await App.NetworkPresenter.UpdateAvailableNetworksAsync(false); + }); + } protected override void OnActivated(IActivatedEventArgs args) diff --git a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/IoTCoreDefaultApp.csproj b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/IoTCoreDefaultApp.csproj index 0fe64e9..bd41c9f 100644 --- a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/IoTCoreDefaultApp.csproj +++ b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/IoTCoreDefaultApp.csproj @@ -125,6 +125,7 @@ + NetworkListControl.xaml diff --git a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/NetworkPresenter.cs b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/NetworkPresenter.cs index 6784715..8a271d4 100644 --- a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/NetworkPresenter.cs +++ b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/NetworkPresenter.cs @@ -1,9 +1,12 @@ // Copyright (c) Microsoft. All rights reserved. +using IoTCoreDefaultApp.Presenters; +using IoTCoreDefaultApp.Utils; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -13,6 +16,7 @@ using Windows.Devices.WiFi; using Windows.Networking; using Windows.Networking.Connectivity; using Windows.Security.Credentials; +using Windows.System.Threading; namespace IoTCoreDefaultApp { @@ -24,32 +28,48 @@ namespace IoTCoreDefaultApp private DeviceWatcher WiFiAdaptersWatcher; ManualResetEvent EnumAdaptersCompleted = new ManualResetEvent(false); - private ConcurrentDictionary NetworkNameToInfo = new ConcurrentDictionary(); - private SemaphoreSlim NetworkNameToInfoLock = new SemaphoreSlim(1, 1); + private ConcurrentDictionary AvailableNetworks = new ConcurrentDictionary(); + private SemaphoreSlim AvailableNetworksLock = new SemaphoreSlim(1, 1); private static WiFiAccessStatus? accessStatus; + private ThreadPoolTimer wifiRefreshTimer; + private TimeSpan refreshTimespan = TimeSpan.FromMinutes(5); + private TimeSpan expiredTimespan = TimeSpan.FromMinutes(7); public NetworkPresenter() { - WiFiAdaptersWatcher = DeviceInformation.CreateWatcher(WiFiAdapter.GetDeviceSelector()); - WiFiAdaptersWatcher.EnumerationCompleted += AdaptersEnumCompleted; - WiFiAdaptersWatcher.Added += AdaptersAdded; - WiFiAdaptersWatcher.Removed += AdaptersRemoved; - WiFiAdaptersWatcher.Start(); + Log.Enter(); + Task.Run(() => + { + if (TestAccess().Result) + { + WiFiAdaptersWatcher = DeviceInformation.CreateWatcher(WiFiAdapter.GetDeviceSelector()); + WiFiAdaptersWatcher.EnumerationCompleted += AdaptersEnumCompleted; + WiFiAdaptersWatcher.Added += AdaptersAdded; + WiFiAdaptersWatcher.Removed += AdaptersRemoved; + WiFiAdaptersWatcher.Start(); + } + }); + Log.Leave(); } private void AdaptersRemoved(DeviceWatcher sender, DeviceInformationUpdate args) { + Log.Enter(); WiFiAdapters.Remove(args.Id); + Log.Leave(); } private void AdaptersAdded(DeviceWatcher sender, DeviceInformation args) { + Log.Enter(); WiFiAdapters.Add(args.Id, null); + Log.Leave(); } private async void AdaptersEnumCompleted(DeviceWatcher sender, object args) { + Log.Enter(); List WiFiAdaptersID = new List(WiFiAdapters.Keys); for(int i = 0; i < WiFiAdaptersID.Count; i++) { @@ -64,10 +84,23 @@ namespace IoTCoreDefaultApp } } EnumAdaptersCompleted.Set(); + if (WiFiAdapters.Count() > 0) + { + wifiRefreshTimer = ThreadPoolTimer.CreatePeriodicTimer(Timer_Tick, refreshTimespan); + } + Log.Leave(); + } + + private void Timer_Tick(ThreadPoolTimer timer) + { + Log.Enter(); + App.NetworkPresenter.UpdateAvailableNetworksAsync(false).Wait(); + Log.Leave(); } public static string GetDirectConnectionName() { + Log.Enter(); try { var icp = NetworkInformation.GetInternetConnectionProfile(); @@ -82,11 +115,13 @@ namespace IoTCoreDefaultApp // seeing cases where NetworkInformation.GetInternetConnectionProfile() fails } + Log.Leave(); return null; } public static string GetCurrentNetworkName() { + Log.Enter(); try { var icp = NetworkInformation.GetInternetConnectionProfile(); @@ -103,11 +138,13 @@ namespace IoTCoreDefaultApp var resourceLoader = ResourceLoader.GetForCurrentView(); var msg = resourceLoader.GetString("NoInternetConnection"); + Log.Leave(); return msg; } public static string GetCurrentIpv4Address() { + Log.Enter(); try { var icp = NetworkInformation.GetInternetConnectionProfile(); @@ -138,12 +175,14 @@ namespace IoTCoreDefaultApp var resourceLoader = ResourceLoader.GetForCurrentView(); var msg = resourceLoader.GetString("NoInternetConnection"); + Log.Leave(); return msg; } // Call this method before accessing WiFiAdapters Dictionary private async Task UpdateAdapters() { + Log.Enter(); bool fInit = false; foreach (var adapter in WiFiAdapters) { @@ -170,9 +209,12 @@ namespace IoTCoreDefaultApp } } } + Log.Leave(); + } public async Task WifiIsAvailable() { + Log.Enter(); if ((await TestAccess()) == false) { return false; @@ -181,7 +223,11 @@ namespace IoTCoreDefaultApp try { EnumAdaptersCompleted.WaitOne(); - await UpdateAdapters(); + if (WiFiAdapters.Count == 0) + { + await UpdateAdapters(); + } + Log.Leave(); return (WiFiAdapters.Count > 0); } catch (Exception) @@ -190,18 +236,39 @@ namespace IoTCoreDefaultApp } } - private async Task UpdateInfo() + private DateTime LastRefresh = DateTime.MinValue; + public bool IsRefreshNeeded() { + Log.Enter(); + bool result = false; + if (DateTime.Now > (LastRefresh + expiredTimespan)) + { + result = true; + } + Log.Leave($"result={result}"); + return result; + } + + public async Task UpdateAvailableNetworksAsync(bool refreshIfNeeded) + { + Log.Enter($"refreshIfNeeded={refreshIfNeeded}"); try { - await NetworkNameToInfoLock.WaitAsync(); + await AvailableNetworksLock.WaitAsync(); if ((await TestAccess()) == false) { return false; } - NetworkNameToInfo.Clear(); + if (refreshIfNeeded && !IsRefreshNeeded()) + { + return true; + } + + LastRefresh = DateTime.Now; + + EnumAdaptersCompleted.WaitOne(); List WiFiAdaptersList = new List(WiFiAdapters.Values); foreach (var adapter in WiFiAdaptersList) { @@ -225,52 +292,69 @@ namespace IoTCoreDefaultApp continue; } + DateTime reportTime = DateTime.Now; foreach (var network in adapter.NetworkReport.AvailableNetworks) { - if (!HasSsid(NetworkNameToInfo, network.Ssid)) + if (!String.IsNullOrWhiteSpace(network.Ssid)) { - NetworkNameToInfo[network] = adapter; + if (AvailableNetworks.ContainsKey(network.Ssid)) + { + WifiListViewItemPresenter value; + AvailableNetworks.TryRemove(network.Ssid, out value); + } + + var item = new WifiListViewItemPresenter(network, adapter, reportTime); + if (AvailableNetworks.TryAdd(network.Ssid, item)) + { + await item.InitializeAsync(); + Log.Trace($"Adding {network.Ssid}"); + } + } + } + + // remove some jitter from the list when refresh is repeatedly clicked + // by remembering networks from the last 5 minutes + DateTime expireTime = DateTime.Now - TimeSpan.FromMinutes(5); + foreach(var key in AvailableNetworks.Keys) + { + if (AvailableNetworks[key].LastSeen < expireTime) + { + WifiListViewItemPresenter value; + AvailableNetworks.TryRemove(key, out value); } } } + Log.Leave(); return true; } finally { - NetworkNameToInfoLock.Release(); + AvailableNetworksLock.Release(); } } - private bool HasSsid(ConcurrentDictionary resultCollection, string ssid) + public async Task> GetAvailableNetworks(bool refreshIfNeeded) { - foreach (var network in resultCollection) - { - if (!string.IsNullOrEmpty(network.Key.Ssid) && network.Key.Ssid == ssid) - { - return true; - } - } - return false; - } - - public async Task> GetAvailableNetworks() - { - await UpdateInfo(); + Log.Enter(); + await UpdateAvailableNetworksAsync(refreshIfNeeded); try { - await NetworkNameToInfoLock.WaitAsync(); - return NetworkNameToInfo.Keys.ToList(); + await AvailableNetworksLock.WaitAsync(); + var availableNetworks = AvailableNetworks.Values.ToList(); + availableNetworks.Sort((item1, item2) => item2.AvailableNetwork.SignalBars.CompareTo(item1.AvailableNetwork.SignalBars)); + return availableNetworks; } finally { - NetworkNameToInfoLock.Release(); + AvailableNetworksLock.Release(); } } - public WiFiAvailableNetwork GetCurrentWifiNetwork() + static public string GetConnectedProfileName() { + Log.Enter(); IReadOnlyCollection connectionProfiles = null; try { @@ -299,124 +383,108 @@ namespace IoTCoreDefaultApp var firstProfile = validProfiles.First() as ConnectionProfile; - try - { - NetworkNameToInfoLock.WaitAsync().ConfigureAwait(false); - return NetworkNameToInfo.Keys.FirstOrDefault(wifiNetwork => wifiNetwork.Ssid.Equals(firstProfile.ProfileName)); - } - finally - { - NetworkNameToInfoLock.Release(); - } + Log.Leave(); + return firstProfile.ProfileName; } - public async Task ConnectToNetwork(WiFiAvailableNetwork network, bool autoConnect) + public WifiListViewItemPresenter GetCurrentWifiNetwork() { + Log.Enter(); + + try { - await NetworkNameToInfoLock.WaitAsync(); - if (network == null) + AvailableNetworksLock.WaitAsync().ConfigureAwait(false); + string connectedProfile = GetConnectedProfileName(); + if (connectedProfile != null) { - return false; + WifiListViewItemPresenter network; + AvailableNetworks.TryGetValue(connectedProfile, out network); + Log.Leave(); + return network; } - - // We need to use TryGetValue here. If we are rescanning for Wifi networks - // (ie. 'await'ing on ScanAsync() in UpdateInfo(), 'NetworkNameToInfo' may not - // have an entry described by the key'network'. - WiFiAdapter wifiAdapter; - if (!NetworkNameToInfo.TryGetValue(network, out wifiAdapter)) + else { - return false; - } - - try - { - var result = await wifiAdapter.ConnectAsync(network, autoConnect ? WiFiReconnectionKind.Automatic : WiFiReconnectionKind.Manual); - - //Call redirect only for Open Wifi - if (IsNetworkOpen(network)) - { - //Navigate to http://www.msftconnecttest.com/redirect - NavigationUtils.NavigateToScreen(typeof(WebBrowserPage), Common.GetResourceText("MicrosoftWifiConnect")); - } - - return (result.ConnectionStatus == WiFiConnectionStatus.Success); - } - catch (Exception) - { - return false; + return null; } } finally { - NetworkNameToInfoLock.Release(); + AvailableNetworksLock.Release(); } } - public void DisconnectNetwork(WiFiAvailableNetwork network) + public async Task ConnectToNetwork(WifiListViewItemPresenter network, bool autoConnect) { + Log.Enter(); + await AvailableNetworksLock.WaitAsync(); + if (network == null) + { + return WiFiConnectionStatus.UnspecifiedFailure; + } + try { - NetworkNameToInfoLock.Wait(); - NetworkNameToInfo[network].Disconnect(); + var result = await network.Adapter.ConnectAsync(network.AvailableNetwork, autoConnect ? WiFiReconnectionKind.Automatic : WiFiReconnectionKind.Manual); + + //Call redirect only for Open Wifi + if (IsNetworkOpen(network)) + { + //Navigate to http://www.msftconnecttest.com/redirect + NavigationUtils.NavigateToScreen(typeof(WebBrowserPage), Common.GetResourceText("MicrosoftWifiConnect")); + } + + Log.Leave($"LEAVE {result.ConnectionStatus}"); + return result.ConnectionStatus; } - finally + catch (Exception) { - NetworkNameToInfoLock.Release(); + return WiFiConnectionStatus.UnspecifiedFailure; } } - public static bool IsNetworkOpen(WiFiAvailableNetwork network) + public void DisconnectNetwork(WifiListViewItemPresenter network) { - return network.SecuritySettings.NetworkEncryptionType == NetworkEncryptionType.None; + Log.Enter(); + network.Adapter.Disconnect(); + Log.Leave(); + } - public async Task ConnectToNetworkWithPassword(WiFiAvailableNetwork network, bool autoConnect, PasswordCredential password) + public static bool IsNetworkOpen(WifiListViewItemPresenter network) { + Log.Enter(); + return network.AvailableNetwork.SecuritySettings.NetworkEncryptionType == NetworkEncryptionType.None; + } + + public async Task ConnectToNetworkWithPassword(WifiListViewItemPresenter network, bool autoConnect, PasswordCredential password) + { + Log.Enter(); try { - await NetworkNameToInfoLock.WaitAsync(); - if (network == null) - { - return false; - } + var result = await network.Adapter.ConnectAsync( + network.AvailableNetwork, + autoConnect ? WiFiReconnectionKind.Automatic : WiFiReconnectionKind.Manual, + password); - // We need to use TryGetValue here. If we are rescanning for Wifi networks - // (ie. 'await'ing on ScanAsync() in UpdateInfo(), 'NetworkNameToInfo' may not - // have an entry described by the key'network'. - WiFiAdapter wifiAdapter; - if (!NetworkNameToInfo.TryGetValue(network, out wifiAdapter)) - { - return false; - } - - try - { - var result = await wifiAdapter.ConnectAsync( - network, - autoConnect ? WiFiReconnectionKind.Automatic : WiFiReconnectionKind.Manual, - password); - - return (result.ConnectionStatus == WiFiConnectionStatus.Success); - } - catch (Exception) - { - return false; - } + Log.Leave($"LEAVE {result.ConnectionStatus}"); + return result.ConnectionStatus; } - finally + catch (Exception) { - NetworkNameToInfoLock.Release(); + return WiFiConnectionStatus.UnspecifiedFailure; } } private static async Task TestAccess() { + Log.Enter(); if (!accessStatus.HasValue) { accessStatus = await WiFiAdapter.RequestAccessAsync(); } + Log.Leave(); return (accessStatus == WiFiAccessStatus.Allowed); } @@ -431,6 +499,7 @@ namespace IoTCoreDefaultApp public static async Task> GetNetworkInformation() { + Log.Enter(); var networkList = new Dictionary(); try @@ -504,6 +573,7 @@ namespace IoTCoreDefaultApp var res = new List(); res.AddRange(networkList.Values); + Log.Leave(); return res; } } diff --git a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/WifiListViewItemPresenter.cs b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/WifiListViewItemPresenter.cs new file mode 100644 index 0000000..97de9ce --- /dev/null +++ b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Presenters/WifiListViewItemPresenter.cs @@ -0,0 +1,241 @@ +using IoTCoreDefaultApp.Utils; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Windows.Devices.WiFi; +using Windows.Foundation.Metadata; +using Windows.Networking.Connectivity; +using Windows.UI.Xaml; + +namespace IoTCoreDefaultApp.Presenters +{ + public class WifiListViewItemPresenter : INotifyPropertyChanged + { + private TimeSpan expiredTimespan = TimeSpan.FromMinutes(5); + + public WifiListViewItemPresenter(WiFiAvailableNetwork availableNetwork, WiFiAdapter adapter, DateTime reportTime) + { + AvailableNetwork = availableNetwork; + this.adapter = adapter; + this.LastSeen = reportTime; + } + + public async Task InitializeAsync() + { + if (!IsWpsPushButtonAvailable.HasValue) + { + IsWpsPushButtonAvailable = await Task.Run(async () => + { + return await IsWpsPushButtonAvailableAsync(); + }); + } + } + + private WiFiAdapter adapter; + public WiFiAdapter Adapter + { + get + { + return adapter; + } + } + + public void Disconnect() + { + adapter.Disconnect(); + } + + public bool? IsWpsPushButtonAvailable { get; set; } + + public bool NetworkKeyInfoVisibility + { + get + { + if ((AvailableNetwork.SecuritySettings.NetworkAuthenticationType == NetworkAuthenticationType.Open80211 && + AvailableNetwork.SecuritySettings.NetworkEncryptionType == NetworkEncryptionType.None) || + IsEapAvailable) + { + return false; + } + + return true; + } + } + + private bool usePassword = false; + public bool UsePassword + { + get + { + return usePassword; + } + set + { + usePassword = value; + OnPropertyChanged("UsePassword"); + } + } + + private bool connectAutomatically = true; + public bool ConnectAutomatically + { + get + { + return connectAutomatically; + } + set + { + connectAutomatically = value; + OnPropertyChanged("ConnectAutomatically"); + } + } + + public String Ssid + { + get + { + return availableNetwork.Ssid; + } + } + + public byte SignalBars + { + get + { + return AvailableNetwork.SignalBars; + } + } + + private string userName; + public string UserName + { + get { return userName; } + set { userName = value; OnPropertyChanged("UserName"); } + } + + private string password; + public string Password + { + get { return password; } + set { password = value; OnPropertyChanged("Password"); } + } + + private string domain; + public string Domain + { + get { return domain; } + set { domain = value; OnPropertyChanged("Domain"); } + } + + public bool IsEapAvailable + { + get + { + Log.Trace($"{availableNetwork.SecuritySettings.NetworkAuthenticationType}"); + return ((availableNetwork.SecuritySettings.NetworkAuthenticationType == NetworkAuthenticationType.Rsna) || + (availableNetwork.SecuritySettings.NetworkAuthenticationType == NetworkAuthenticationType.Wpa)); + } + } + + public async Task IsWpsPushButtonAvailableAsync() + { + return await Task.Run(async () => + { + await Task.CompletedTask; + if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 5, 0)) + { + var task = adapter.GetWpsConfigurationAsync(availableNetwork).AsTask(); + bool success = task.Wait(1000); + if (success) + { + if (task.Result.SupportedWpsKinds.Contains(WiFiWpsKind.PushButton)) + { + return true; + } + else + { + return false; + } + } + else + { + // GetWpsConfigurationAsync is not returning sometimes + // If the result isn't available let the user figure out if WPS is supported or not + Log.Trace($"GetWpsConfigurationAsync timed out: {availableNetwork.Ssid}"); + return true; + } + } + return false; + }); + } + + private WiFiAvailableNetwork availableNetwork; + public WiFiAvailableNetwork AvailableNetwork + { + get + { + return availableNetwork; + } + + private set + { + availableNetwork = value; + } + } + + private string message; + public string Message + { + get + { + return message; + } + + set + { + message = value; + OnPropertyChanged("Message"); + } + } + + private bool isMessageVisible = false; + public bool IsMessageVisible + { + get + { + return isMessageVisible; + } + + set + { + isMessageVisible = value; + OnPropertyChanged("IsMessageVisible"); + } + } + + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged(string name) + { + PropertyChangedEventHandler handler = PropertyChanged; + if (handler != null) + { + handler(this, new PropertyChangedEventArgs(name)); + } + } + + public DateTime LastSeen { get; set; } + public bool IsExpired + { + get + { + if (LastSeen + expiredTimespan < DateTime.Now) + { + return true; + } + return false; + } + } + } +} diff --git a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Strings/en-US/Resources.resw b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Strings/en-US/Resources.resw index 230a996..79402a1 100644 --- a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Strings/en-US/Resources.resw +++ b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Strings/en-US/Resources.resw @@ -766,6 +766,36 @@ Alternatively, click or tap the button below to enter your Administrator account Password + + Domain + + + WPS + + + Unspecified Failure + + + Success + + + Access Revoked + + + Invalid Credential + + + Network Not Available + + + Connection Timed Out + + + Unsupported Authentication Protocol + + + Use password + Successfully enabled Command Line Processor (cmd.exe) on your device. diff --git a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Styles.xaml b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Styles.xaml index b9974c0..d438659 100644 --- a/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Styles.xaml +++ b/Samples/IoTCoreDefaultApp/CS/IoTCoreDefaultApp/Styles.xaml @@ -59,6 +59,7 @@ +