123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- 'use strict';
- // @ts-check
- // ==================================================================================
- // wifi.js
- // ----------------------------------------------------------------------------------
- // Description: System Information - library
- // for Node.js
- // Copyright: (c) 2014 - 2020
- // Author: Sebastian Hildebrandt
- // ----------------------------------------------------------------------------------
- // License: MIT
- // ==================================================================================
- // 9. wifi
- // ----------------------------------------------------------------------------------
-
- const os = require('os');
- const exec = require('child_process').exec;
- const util = require('./util');
-
- let _platform = process.platform;
-
- const _linux = (_platform === 'linux');
- const _darwin = (_platform === 'darwin');
- const _windows = (_platform === 'win32');
-
- function wifiDBFromQuality(quality) {
- return (parseFloat(quality) / 2 - 100);
- }
-
- function wifiQualityFromDB(db) {
- const result = 2 * (parseFloat(db) + 100);
- return result <= 100 ? result : 100;
- }
-
- function wifiFrequencyFromChannel(channel) {
- const frequencies = {
- 1: 2412,
- 2: 2417,
- 3: 2422,
- 4: 2427,
- 5: 2432,
- 6: 2437,
- 7: 2442,
- 8: 2447,
- 9: 2452,
- 10: 2457,
- 11: 2462,
- 12: 2467,
- 13: 2472,
- 14: 2484,
- 32: 5160,
- 34: 5170,
- 36: 5180,
- 38: 5190,
- 40: 5200,
- 42: 5210,
- 44: 5220,
- 46: 5230,
- 48: 5240,
- 50: 5250,
- 52: 5260,
- 54: 5270,
- 56: 5280,
- 58: 5290,
- 60: 5300,
- 62: 5310,
- 64: 5320,
- 68: 5340,
- 96: 5480,
- 100: 5500,
- 102: 5510,
- 104: 5520,
- 106: 5530,
- 108: 5540,
- 110: 5550,
- 112: 5560,
- 114: 5570,
- 116: 5580,
- 118: 5590,
- 120: 5600,
- 122: 5610,
- 124: 5620,
- 126: 5630,
- 128: 5640,
- 132: 5660,
- 134: 5670,
- 136: 5680,
- 138: 5690,
- 140: 5700,
- 142: 5710,
- 144: 5720,
- 149: 5745,
- 151: 5755,
- 153: 5765,
- 155: 5775,
- 157: 5785,
- 159: 5795,
- 161: 5805,
- 165: 5825,
- 169: 5845,
- 173: 5865,
- 183: 4915,
- 184: 4920,
- 185: 4925,
- 187: 4935,
- 188: 4940,
- 189: 4945,
- 192: 4960,
- 196: 4980
- };
- return {}.hasOwnProperty.call(frequencies, channel) ? frequencies[channel] : -1;
- }
-
- function wifiNetworks(callback) {
-
- return new Promise((resolve) => {
- process.nextTick(() => {
- let result = [];
- if (_linux) {
- let cmd = 'nmcli --terse --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list 2>/dev/null';
- exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
-
- const parts = stdout.toString().split('ACTIVE:');
- parts.shift();
- parts.forEach(part => {
- part = 'ACTIVE:' + part;
- const lines = part.split(os.EOL);
- const channel = util.getValue(lines, 'CHAN');
- const frequency = util.getValue(lines, 'FREQ').toLowerCase().replace('mhz', '').trim();
- const security = util.getValue(lines, 'SECURITY').replace('(', '').replace(')', '');
- const wpaFlags = util.getValue(lines, 'WPA-FLAGS').replace('(', '').replace(')', '');
- const rsnFlags = util.getValue(lines, 'RSN-FLAGS').replace('(', '').replace(')', '');
- result.push({
- ssid: util.getValue(lines, 'SSID'),
- bssid: util.getValue(lines, 'BSSID'),
- mode: util.getValue(lines, 'MODE'),
- channel: channel ? parseInt(channel, 10) : -1,
- frequency: frequency ? parseInt(frequency, 10) : -1,
- signalLevel: wifiDBFromQuality(util.getValue(lines, 'SIGNAL')),
- quality: parseFloat(util.getValue(lines, 'SIGNAL')),
- security: security && security !== 'none' ? security.split(' ') : [],
- wpaFlags: wpaFlags && wpaFlags !== 'none' ? wpaFlags.split(' ') : [],
- rsnFlags: rsnFlags && rsnFlags !== 'none' ? rsnFlags.split(' ') : []
- });
- });
-
- if (callback) {
- callback(result);
- }
- resolve(result);
- });
- } else if (_darwin) {
- let cmd = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s';
- exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
- const lines = stdout.toString().split(os.EOL);
- if (lines && lines.length > 1) {
- const parsedhead = util.parseHead(lines[0], 1);
- if (parsedhead.length >= 7) {
- lines.shift();
- lines.forEach(line => {
- if (line.trim()) {
- const channelStr = line.substring(parsedhead[3].from, parsedhead[3].to).trim();
- const channel = channelStr ? parseInt(channelStr, 10) : -1;
- const signalLevel = line.substring(parsedhead[2].from, parsedhead[2].to).trim();
- const securityAll = line.substring(parsedhead[6].from, 1000).trim().split(' ');
- let security = [];
- let wpaFlags = [];
- securityAll.forEach(securitySingle => {
- if (securitySingle.indexOf('(') > 0) {
- const parts = securitySingle.split('(');
- security.push(parts[0]);
- wpaFlags = wpaFlags.concat(parts[1].replace(')', '').split(','));
- }
- });
- wpaFlags = Array.from(new Set(wpaFlags));
- result.push({
- ssid: line.substring(parsedhead[0].from, parsedhead[0].to).trim(),
- bssid: line.substring(parsedhead[1].from, parsedhead[1].to).trim(),
- mode: '',
- channel,
- frequency: wifiFrequencyFromChannel(channel),
- signalLevel: signalLevel ? parseInt(signalLevel, 10) : -1,
- quality: wifiQualityFromDB(signalLevel),
- security,
- wpaFlags,
- rsnFlags: []
- });
- }
- });
- }
- }
- if (callback) {
- callback(result);
- }
- resolve(result);
- });
- } else if (_windows) {
- 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();
-
- 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();
- 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) : -1,
- frequency: wifiFrequencyFromChannel(channel),
- signalLevel: wifiDBFromQuality(quality),
- quality: quality ? parseInt(quality, 10) : -1,
- security: [lines[2].split(':').pop().trim()],
- wpaFlags: [lines[3].split(':').pop().trim()],
- rsnFlags: []
- });
- }
- });
-
- if (callback) {
- callback(result);
- }
- resolve(result);
- });
- } else {
- if (callback) {
- callback(result);
- }
- resolve(result);
- }
- });
- });
- }
-
- exports.wifiNetworks = wifiNetworks;
|