17 Commits

Author SHA1 Message Date
bc61dc2f02 New version added v1.1.1 2019-04-09 19:49:35 +02:00
5030d9f693 Package updates 2019-04-09 19:48:21 +02:00
e874b44200 Merge pull request #2 from sylvaingirardbe/remove-npm-vulnerabilities
Update packages
2019-04-08 15:04:44 +02:00
f1c0c014da Update to current version of node 2019-03-06 16:08:22 +01:00
29e715897e Update packages 2019-03-06 16:00:12 +01:00
d302473da7 Merge branch 'develop' 2016-12-09 19:13:17 +01:00
5305124084 New version added v1.1.0 2016-12-09 19:12:16 +01:00
cfacdd6438 node 4 compliant again 2016-12-09 17:53:43 +01:00
8a8005e2ef Windows fixes (work still in progress) 2016-12-09 17:04:27 +01:00
6ce58993a2 Refactoring tool detection, work in progress 2016-12-09 16:55:17 +01:00
834dc4210e Test for GitHub issue #1: removed absolute path for iwlist 2016-12-09 09:25:20 +01:00
b33de0ce94 Lint issues only 2016-06-08 19:41:44 +02:00
77da84a261 Merge branch 'develop'
# Conflicts:
#	README.md
2016-05-03 14:55:40 +02:00
26fff7e5d8 New version added v1.0.0 2016-05-03 14:53:52 +02:00
9669064662 readme.md fixed: removed nmcli 2016-04-12 17:25:00 +02:00
6f44b5b039 New version added v0.1.0 2016-04-12 17:22:28 +02:00
2caacc853a mmcli removed: using iwlist on linux systems, output was not really comparable to other tools 2016-04-12 17:22:11 +02:00
11 changed files with 1711 additions and 140 deletions

View File

@ -4,5 +4,5 @@ branches:
- master
- develop
node_js:
- "4"
- "5"
- "10"
- "11"

View File

@ -13,8 +13,6 @@ The module was inspired from Maurice Sways "[node-wifiscanner](https://github.co
had to handle much more complex network environments and also wanted to be independent of the operating
system language. The adaptions needed would have been too comprehensive for a pull request so I decided to write an own module.
**The module is currently in BETA testing, changes in functionality and interface are possible. Please report bugs on the projects GitHub page, Thanks!**
## Operating Systems
It was tested with the following operating systems:
@ -29,6 +27,12 @@ It was tested with the following operating systems:
## Usage
### Command Line
Run the script ```scan``` in the bin folder.
### Code
const scanner = require('node-wifi-scanner');
scanner.scan((err, networks) => {
@ -55,8 +59,8 @@ The module uses command line tools for gathering the network information:
* airport on Mac OS-X: `airport -s`
* netsh on Windows: `netsh wlan show networks mode=Bssid`
* iwlist (1st choice) on Linux: `iwlist scan`
* nmcli (fallback only) on Linux: `nmcli -m tabular -f SSID,BSSID,SIGNAL,FREQ device wifi`
* iwlist on Linux: `iwlist scan`
Unfortunately, Mac OS-X and Windows use the system language for the output which requires a quite
generic way of parsing the data. If you experience any troubles, please create a GitHub issue and supply

View File

@ -3,45 +3,62 @@
* Created by kc on 04.04.16.
*/
const fs = require('fs');
const exec = require('child_process').exec;
const async = require('async');
const _ = require('lodash');
// The tools
const airport = require('./lib/airport');
const iwlist = require('./lib/iwlist');
const nmcli = require('./lib/nmcli');
const netsh = require('./lib/netsh');
var scanner;
// Initializing the tools
function initTools(callback) {
fs.stat(airport.tool, function (err, stats) {
if (stats) {
return callback(null, airport);
}
fs.stat(iwlist.tool, function (err, stats) {
if (stats) {
return callback(null, iwlist);
// When a command is not found, an error is issued and async would finish. Therefore we pack
// the error into the result and check it later on.
async.parallel([
function (cb) {
exec(airport.detector, function (err) {
cb(null, {err: err, scanner: airport}
)
}
fs.stat(nmcli.tool, function (err, stats) {
if (stats) {
return callback(null, nmcli);
);
},
function (cb) {
exec(iwlist.detector, function (err) {
cb(null, {err: err, scanner: iwlist}
)
}
fs.stat(netsh.tool, function (err, stats) {
if (stats) {
return callback(null, netsh);
);
},
function (cb) {
exec(netsh.detector, function (err) {
cb(null, {err: err, scanner: netsh}
)
}
);
}
],
function (err, results) {
var res = _.find(results,
function (f) {
return !f.err
});
if (res) {
return callback(null, res.scanner);
}
callback(new Error('No scanner found'));
});
});
});
});
}
);
}
/**
* Scan the networks with the scanner detected before
* @param callback
*/
function scanNetworks(callback) {
exec(scanner.cmdLine, function (err, stdout) {
if (err) {
@ -59,7 +76,7 @@ module.exports = {
*/
scan: function (callback) {
if (!scanner) {
initTools((err, s) => {
initTools(function (err, s) {
if (err) {
return callback(err);
}

View File

@ -5,6 +5,7 @@
const tool = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport';
const cmdLine = tool + ' -s';
const detector = tool + ' -getInfo';
const macRegex = /([0-9a-zA-Z]{1}[0-9a-zA-Z]{1}[:]{1}){5}[0-9a-zA-Z]{1}[0-9a-zA-Z]{1}/;
/**
@ -30,7 +31,7 @@ function parseOutput(str, callback) {
'ssid' : lines[i].substr(0, macStart).trim(),
'mac' : elements[0].trim(),
'channel' : parseInt(elements[2].trim(), 10),
'rssi' : parseInt(elements[1].trim())
'rssi' : parseInt(elements[1].trim(), 10)
});
}
}
@ -45,5 +46,6 @@ function parseOutput(str, callback) {
module.exports = {
parseOutput: parseOutput,
cmdLine : cmdLine,
detector : detector,
tool : tool
};

View File

@ -4,8 +4,12 @@
*/
const _ = require('lodash');
const tool = '/usr/bin/iwlist';
// usually located in /usr/bin/ but as it could be at another location, allow all found in PATH (but we're in trouble
// when the default location, /usr/bin/ is not in the PATH!). GitHub issue #1
const tool = 'iwlist';
const cmdLine = tool + ' scan';
const detector = tool + ' --help';
const macRegex = /([0-9a-zA-Z]{1}[0-9a-zA-Z]{1}[:]{1}){5}[0-9a-zA-Z]{1}[0-9a-zA-Z]{1}/;
const cellRegex = /Cell [0-9]{2,} - Address:/;
@ -79,5 +83,6 @@ function parseOutput(str, callback) {
module.exports = {
parseOutput: parseOutput,
cmdLine : cmdLine,
detector : detector,
tool : tool
};

View File

@ -6,6 +6,7 @@
const systemRoot = process.env.SystemRoot || 'C:\\Windows';
const tool = systemRoot + '\\System32\\netsh.exe';
const cmdLine = tool + ' wlan show networks mode=Bssid';
const detector = tool + ' show alias';
/**
* Parsing netnsh output. Unfortunately netsh supplies the network information
@ -71,7 +72,7 @@ function parseOutput(str, callback) {
// A tricky one: the channel is the first one having just ONE number. Set only
// if the channel is not already set ("Basic Rates" can be a single number also)
if (regexChannel.exec(lines[t].trim())) {
network.channel = parseInt(lines[t].split(':')[1].trim());
network.channel = parseInt(lines[t].split(':')[1].trim(), 10);
}
}
}
@ -90,5 +91,6 @@ function parseOutput(str, callback) {
module.exports = {
parseOutput: parseOutput,
cmdLine : cmdLine,
detector : detector,
tool : tool
};

View File

@ -1,50 +0,0 @@
/**
* Scanning WiFis on Mac OS X using nmcli
* Created by kc on 04.04.16.
*/
const _ = require('lodash');
const tool = '/usr/bin/nmcli';
const cmdLine = tool + ' -m tabular -f SSID,BSSID,SIGNAL,FREQ device wifi';
const macRegex = /([0-9a-zA-Z]{1}[0-9a-zA-Z]{1}[:]{1}){5}[0-9a-zA-Z]{1}[0-9a-zA-Z]{1}/;
/**
* Parsing the output of nmcli
* @param str output of the tool
* @param callback
*/
function parseOutput(str, callback) {
var err = null;
try {
var lines = str.split('\n');
var wifis = [];
for (var i = 1, l = lines.length; i < l; i++) {
var mac = lines[i].match(macRegex);
if (!mac) {
continue;
}
var macStart = lines[i].indexOf(mac[0]);
var elements = lines[i].substr(macStart).split(/[ ]+/);
wifis.push({
'ssid' : _.trim(lines[i].substr(0, macStart), ' \''),
'mac' : elements[0].trim(),
'channel' : parseInt(elements[2].trim(), 10),
'rssi' : parseInt(elements[1].trim())
});
}
}
catch (ex) {
err = ex;
}
callback(err, wifis);
}
module.exports = {
parseOutput: parseOutput,
cmdLine : cmdLine,
tool : tool
};

1640
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "node-wifi-scanner",
"version": "0.0.5",
"version": "1.1.1",
"description": "node.js module for WiFi network detection",
"main": "index.js",
"keywords": [
@ -35,11 +35,12 @@
"test": "mocha test"
},
"dependencies": {
"lodash": "4.8.1"
"async": "2.6.2",
"lodash": "^4.17.11"
},
"devDependencies": {
"grunt": "0.4.5",
"grunt-bump": "0.7.0",
"mocha": "2.2.5"
"grunt": "^1.0.3",
"grunt-bump": "0.8.0",
"mocha": "^6.0.2"
}
}

View File

@ -1,20 +0,0 @@
SSID BSSID SIGNAL FREQUENZ
'PDANet1' 00:35:1A:90:56:06 100 2412 MHz
'ExoNet1' 00:35:1A:90:56:05 100 2412 MHz
'TEST-Wifi' 00:35:1A:90:56:00 96 2412 MHz
'OurTest' 00:35:1A:90:56:0C 96 2412 MHz
'OurDev' 00:35:1A:90:56:0B 76 2412 MHz
'PDANet1' 00:35:1A:6F:0F:46 48 2437 MHz
'TEST-Wifi' 00:35:1A:6F:0F:40 58 2437 MHz
'ExoNet1' 00:35:1A:6F:0F:45 58 2437 MHz
'OurDev' 00:35:1A:6F:0F:4B 58 2437 MHz
'OurTest' 00:35:1A:6F:0F:4C 60 2437 MHz
'TEST-Wifi' 00:F2:8B:8F:58:70 58 2462 MHz
'ExoNet1' 00:F2:8B:8F:58:75 72 2462 MHz
'PDANet1' 00:F2:8B:8F:58:76 58 2462 MHz
'PDANet1' 00:35:1A:5B:46:76 56 2412 MHz
'OurDev' 00:35:1A:5B:46:7B 48 2412 MHz
'OurDev' 00:F2:8B:8F:58:7B 58 2462 MHz
'OurTest' 00:F2:8B:8F:58:7C 72 2462 MHz
'TEST-Wifi' 00:35:1A:5B:46:70 56 2412 MHz
'OurTest' 00:35:1A:5B:46:7C 48 2412 MHz

View File

@ -1,30 +0,0 @@
/**
* nmcli unit test
* Created by kc on 04.04.16.
*/
const fs = require('fs');
const path = require('path');
const assert = require('assert');
const nmcli = require('../lib/nmcli');
describe.skip('nmcli', () => {
it('parses the output of file 1', function(done) {
nmcli.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','nmcli','nmcli01.txt'), { encoding: 'utf8' }), (err, info) => {
console.log(info);
assert.ok(info);
assert.equal(info.length, 19);
var ap = info[0];
assert.equal(ap.mac, '00:35:1A:90:56:06');
assert.equal(ap.ssid, 'PDANet1');
//assert.equal(ap.rssi, -70);
assert.strictEqual(ap.channel, 112);
done(err);
});
});
});