I found the other answers very useful and wanted to see how they compared with each other. Here's some LINQ code which gets the data from each and joins them. Here's a LINQPad script which contains all the nuget dependencies and usings: http://share.linqpad.net/7pxls3.linq
var adapters = await WiFiAdapter.FindAllAdaptersAsync();
var wifiAdapterResults = adapters
.SelectMany(a => a.NetworkReport.AvailableNetworks.Select(a => new
{
a.Ssid,
a.Bssid,
Ghz = Math.Round(a.ChannelCenterFrequencyInKilohertz / 1000000.0, 1),
a.NetworkRssiInDecibelMilliwatts,
a.SignalBars,
a.PhyKind,
}))
.Where(n => n.Ssid != null)
.OrderByDescending(n => n.NetworkRssiInDecibelMilliwatts);
WlanClient client = new WlanClient();
var wlanResults = client.Interfaces.SelectMany(i => i.GetNetworkBssList().Select(n => new
{
SSID = new string(Encoding.ASCII.GetChars(n.dot11Ssid.SSID, 0, (int)n.dot11Ssid.SSIDLength)),
n.linkQuality,
n.rssi,
MAC = BitConverter.ToString(n.dot11Bssid).Replace('-', ':').ToLowerInvariant(),
}))
.OrderByDescending(n => n.rssi);
wifiAdapterResults.Join(wlanResults, r => r.Bssid, r => r.MAC, (r1, r2) => Util.Merge(r1, r2)).Dump();
The Util.Merge function is a LINQPad concept, if you want to run outside of LINQPad you'll have to create the merged object yourself.
The built-in WinRT WifiAdapter is easier to call, but doesn't have a nice link quality value, only the very granular SignalBars and the rssi. The ManagedWifi library on the other hand has a 1-100 linkQuality value which seems more useful.
Hope someone else finds this useful!