From d9e1e77747d97ff004ae3182169897217a41ffc3 Mon Sep 17 00:00:00 2001 From: zprjk Date: Thu, 2 Sep 2021 01:25:56 +0100 Subject: [PATCH] improve wifiNetworks detection (win) capable of identify multiple access points (BSSIDs) for the same Network(SSID). --- lib/wifi.js | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/lib/wifi.js b/lib/wifi.js index 9157bd4..2c280be 100644 --- a/lib/wifi.js +++ b/lib/wifi.js @@ -417,28 +417,35 @@ function wifiNetworks(callback) { let cmd = 'chcp 65001 && netsh wlan show networks mode=Bssid'; exec(cmd, util.execOptsWin, function (error, stdout) { - const parts = stdout.toString('utf8').split(os.EOL + os.EOL + 'SSID '); - parts.shift(); + const ssidParts = stdout.toString('utf8').split(os.EOL + os.EOL + 'SSID '); + ssidParts.shift(); - parts.forEach(part => { - const lines = part.split(os.EOL); - if (lines && lines.length >= 8 && lines[0].indexOf(':') >= 0) { - let bssid = lines[4].split(':'); - bssid.shift(); - bssid = bssid.join(':').trim().toLowerCase(); - const channel = lines[7].split(':').pop().trim(); - const quality = lines[5].split(':').pop().trim(); - result.push({ - ssid: lines[0].split(':').pop().trim(), - bssid, - mode: '', - channel: channel ? parseInt(channel, 10) : null, - frequency: wifiFrequencyFromChannel(channel), - signalLevel: wifiDBFromQuality(quality), - quality: quality ? parseInt(quality, 10) : null, - security: [lines[2].split(':').pop().trim()], - wpaFlags: [lines[3].split(':').pop().trim()], - rsnFlags: [] + ssidParts.forEach(ssidPart => { + const ssidLines = ssidPart.split(os.EOL); + if (ssidLines && ssidLines.length >= 8 && ssidLines[0].indexOf(':') >= 0) { + const bssidsParts = ssidPart.split('BSSID '); + bssidsParts.shift(); + + bssidsParts.forEach((bssidPart) => { + const bssidLines = bssidPart.split(os.EOL); + const bssidLine = bssidLines[0].split(':'); + bssidLine.shift(); + const bssid = bssidLine.join(':').trim().toLowerCase(); + const channel = bssidLines[3].split(':').pop().trim(); + const quality = bssidLines[1].split(':').pop().trim(); + + result.push({ + ssid: ssidLines[0].split(':').pop().trim(), + bssid, + mode: '', + channel: channel ? parseInt(channel, 10) : null, + frequency: wifiFrequencyFromChannel(channel), + signalLevel: wifiDBFromQuality(quality), + quality: quality ? parseInt(quality, 10) : null, + security: [ssidLines[2].split(':').pop().trim()], + wpaFlags: [ssidLines[3].split(':').pop().trim()], + rsnFlags: [] + }); }); } });