43 Commits

Author SHA1 Message Date
0f1a6d6661 New version added v1.1.3 2023-01-24 21:39:02 +01:00
9d42fb9b5e Improving mac OS part 2023-01-24 21:35:10 +01:00
0fe7bd8eed Merge remote-tracking branch 'origin/master'
# Conflicts:
#	package.json
2023-01-24 21:26:35 +01:00
a8416e1a27 Merge pull request #19 from soitgoes/auditfix
Auditfix
2023-01-24 21:25:59 +01:00
d7715d1cdf Merge remote-tracking branch 'origin/master' 2023-01-24 21:24:40 +01:00
36e1f8ffaf Merge pull request #15 from soitgoes/master
Accomodate for apples elimination of BSSID from airport results
2023-01-24 21:24:15 +01:00
cf885a3bdd Dependency updates only 2023-01-24 21:23:10 +01:00
ba0bfc7d42 upgrade npm modules causing audit flags 2022-12-21 10:25:35 -06:00
d0f22a8ed2 Remove unused var 2022-01-08 11:28:21 -06:00
a021a5d469 Accomodate for apples elimination of BSSID from airport results 2022-01-08 11:24:23 -06:00
9fe4300976 npm changed package.json 2019-10-27 15:08:32 +01:00
8eeb0a9827 Updated version in package.json 2019-10-27 14:35:22 +01:00
d140e224c9 ReadMe updated 2019-10-27 14:21:45 +01:00
ef25a7fb7c info that you need to be superuser in linux in order to see all wifi networks 2019-09-21 15:49:06 +02:00
32b516e302 Dependency updates, some code cleaned up 2019-09-21 11:56:22 +02:00
d1eac84058 Merge pull request #8 from aydogankaragoz/master
Fixed channel NaN issue for 5Ghz networks.
2019-09-21 11:21:45 +02:00
50090aecda Update iwlist.js 2019-09-11 16:59:05 +03:00
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
de5cde2ca9 New version added v0.0.5 2016-04-07 14:39:08 +02:00
7cf077d527 Windows Bugfix 2016-04-07 14:38:42 +02:00
253b375923 Another tags added 2016-04-07 13:25:28 +02:00
f22300b438 Build status added 2016-04-07 13:19:42 +02:00
a15dd29c53 travis added, package.json fixes 2016-04-07 13:14:27 +02:00
d01b3cc124 New version added v0.0.4 2016-04-07 06:20:37 +02:00
31d80834a7 npm and node version where to strict 2016-04-07 06:20:18 +02:00
1aff4ba049 Installation info added 2016-04-06 22:02:32 +02:00
4f693c9859 New version added v0.0.3 2016-04-06 21:48:38 +02:00
18 changed files with 3403 additions and 234 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.idea .idea
node_modules node_modules
/yarn.lock

8
.travis.yml Normal file
View File

@ -0,0 +1,8 @@
language: node_js
branches:
only:
- master
- develop
node_js:
- "10"
- "11"

View File

@ -1,6 +1,9 @@
/** /**
* Grunt file for node-wifi-scanner * Grunt file for the ZigBeeSiteSurvey
* *
* grunt update
* Updates the local common files with the ones from the editor project
* Create a new bugfix version (x.y.++): * Create a new bugfix version (x.y.++):
* grunt v:patch * grunt v:patch
* *
@ -10,7 +13,7 @@
* Create a new major version (++.0.0) * Create a new major version (++.0.0)
* grunt v:major * grunt v:major
* *
* Created by kc on 06.04.16 * Created by kc on 27.06.15.
*/ */
module.exports = function (grunt) { module.exports = function (grunt) {
@ -26,43 +29,18 @@ module.exports = function (grunt) {
commitFiles: ['-a'], commitFiles: ['-a'],
tagName: 'v%VERSION%', tagName: 'v%VERSION%',
tagMessage: 'Version %VERSION%', tagMessage: 'Version %VERSION%',
push: true, push: false,
pushTo: 'git@github.com:ancasicolica/ZigBeeSiteSurvey.git',
gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d', gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d',
globalReplace: false, globalReplace: false,
prereleaseName: false, prereleaseName: false,
regExp: false regExp: false
} }
},
zip: {
'make': {
src: ['./**/**'],
dest: '../ZigBeeSiteSurvey_x.y.z_OS_.zip',
compression: 'DEFLATE'
}
},
compress: {
main: {
options: {
archive: 'dist/ZigBeeSiteSurvey-' + grunt.file.readJSON('package.json').version + '-Win-x64.zip'
},
files: [{
src: ['*.js', 'LICENSE', '*.json', 'node.exe', '*.md', 'lib/**', 'node_modules/**', 'public/**', 'routes/**', 'views/**'],
dest: 'ZigBeeSiteSurvey-' + grunt.file.readJSON('package.json').version + '-Win-x64'
}]
}
} }
}); });
grunt.loadNpmTasks('grunt-bump'); grunt.loadNpmTasks('grunt-bump');
grunt.loadNpmTasks('grunt-zip');
grunt.loadNpmTasks('grunt-contrib-compress');
grunt.registerTask('minify', ['concat', 'uglify:js']);
grunt.registerTask('v:patch', ['bump:patch']); grunt.registerTask('v:patch', ['bump:patch']);
grunt.registerTask('v:minor', ['bump:minor']); grunt.registerTask('v:minor', ['bump:minor']);
grunt.registerTask('v:major', ['bump:major']); grunt.registerTask('v:major', ['bump:major']);
grunt.registerTask('make', ['zip:make']);
}; };

View File

@ -1,5 +1,9 @@
#node-wifi-scanner #node-wifi-scanner
[![Build Status](https://travis-ci.org/ancasicolica/node-wifi-scanner.svg?branch=master)](https://travis-ci.org/ancasicolica/node-wifi-scanner)
[![npm](https://img.shields.io/npm/v/node-wifi-scanner.svg)]()
[![npm](https://img.shields.io/npm/dt/node-wifi-scanner.svg)](https://www.npmjs.com/package/node-wifi-scanner)
This module for node.js scans available wifi networks. The main purpose was to enhance my node.js based This module for node.js scans available wifi networks. The main purpose was to enhance my node.js based
[ZigBee Site Survey Tool](http://ancasicolica.github.io/ZigBeeSiteSurvey/) with WiFi coexistence charts. This tool [ZigBee Site Survey Tool](http://ancasicolica.github.io/ZigBeeSiteSurvey/) with WiFi coexistence charts. This tool
claims to be compatible with current versions of Mac OS-X, Windows and Linux so I'll fix bugs as fast as possible. claims to be compatible with current versions of Mac OS-X, Windows and Linux so I'll fix bugs as fast as possible.
@ -9,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 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. 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 ## Operating Systems
It was tested with the following operating systems: It was tested with the following operating systems:
@ -19,8 +21,18 @@ It was tested with the following operating systems:
* Ubuntu 14.04 * Ubuntu 14.04
* Raspbian "Jessie" * Raspbian "Jessie"
## Installation
npm i node-wifi-scanner
## Usage ## Usage
### Command Line
Run the script ```scan``` in the bin folder.
### Code
const scanner = require('node-wifi-scanner'); const scanner = require('node-wifi-scanner');
scanner.scan((err, networks) => { scanner.scan((err, networks) => {
@ -35,7 +47,7 @@ The tool returns an array with objects, each object representing a network with
* channel: WiFi channel * channel: WiFi channel
* ssid: SSID of the network (if available) * ssid: SSID of the network (if available)
* mac: MAC Address of the network access point * mac: MAC Address of the network access point (if available, otherwise empty string)
* rssi: signal strength * rssi: signal strength
In contrary to other wifi scanners no information about security is returned. This is due to the very different implementation In contrary to other wifi scanners no information about security is returned. This is due to the very different implementation
@ -47,13 +59,29 @@ The module uses command line tools for gathering the network information:
* airport on Mac OS-X: `airport -s` * airport on Mac OS-X: `airport -s`
* netsh on Windows: `netsh wlan show networks mode=Bssid` * netsh on Windows: `netsh wlan show networks mode=Bssid`
* iwlist (1st choice) on Linux: `iwlist scan` * iwlist on Linux: `iwlist scan`
* nmcli (fallback only) on Linux: `nmcli -m tabular -f SSID,BSSID,SIGNAL,FREQ device wifi`
Unfortunately, Mac OS-X and Windows use the system language for the output which requires a quite 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 generic way of parsing the data. If you experience any troubles, please create a GitHub issue and supply
the output of the tool. the output of the tool.
## Limits of the tool
There is no such thing as perfect software and this is all the more true when the tools used require different
access rights depending on
the operating system. Please note the following restrictions
before using this tool in a productive system.
**Linux**: iwlist does only return all found networks if run as sudo! Otherwise you'll
get only the network you're connected to.
**Windows**: there are some network cards which do not
return the MAC address and other parameters of the found networks. In this case
the "found" networks are ignored as there is no valuable data. If you have this effect
on your system, please provide as many information about your system (PC manufacturer, network
card, OS,...) as available. Thanks
## Licence ## Licence
The MIT License (MIT) The MIT License (MIT)
@ -77,3 +105,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@ -5,7 +5,7 @@
* Created by kc on 04.04.16. * Created by kc on 04.04.16.
*/ */
var scanner = require('../index'); const scanner = require('../index');
scanner.scan((err, output) => { scanner.scan((err, output) => {
if (err) { if (err) {

View File

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

View File

@ -5,45 +5,43 @@
const tool = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport'; const tool = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport';
const cmdLine = tool + ' -s'; 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}/;
/** /**
* Parsing the output of airport (Mac OS X) * Parsing the output of airport (Mac OS X)
* @param str output of the tool * @param str output of the tool
* @param callback * @param callback
*/ */
function parseOutput(str, callback) { function parseOutput(str, callback) {
var err = null; let err = null;
let wifis = [];
try { try {
var lines = str.split('\n'); let lines = str.split('\n');
var wifis = [];
for (var i = 1, l = lines.length; i < l; i++) { for (let i = 1, l = lines.length; i < l; i++) {
var mac = lines[i].match(macRegex); if (lines[i] === '') continue;
if (!mac) { let elements = lines[i].substring(51).split(/[ ]+/);
continue;
}
var macStart = lines[i].indexOf(mac[0]);
var elements = lines[i].substr(macStart).split(/[ ]+/);
wifis.push({ wifis.push({
'ssid' : lines[i].substr(0, macStart).trim(), 'ssid' : lines[i].substring(0, 32).trim(),
'mac' : elements[0].trim(), 'mac' : '', // There is no more mac on a mac
'channel' : parseInt(elements[2].trim(), 10), 'channel': parseInt(elements[1].trim(), 10),
'rssi' : parseInt(elements[1].trim()) 'rssi' : parseInt(elements[0].trim(), 10)
}); });
} }
} }
catch (ex) { catch (ex) {
err = ex; err = ex;
} }
finally {
callback(err, wifis); callback(err, wifis);
} }
}
module.exports = { module.exports = {
parseOutput: parseOutput, parseOutput: parseOutput,
cmdLine : cmdLine, cmdLine : cmdLine,
detector : detector,
tool : tool tool : tool
}; };

View File

@ -4,26 +4,31 @@
*/ */
const _ = require('lodash'); 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 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 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:/; const cellRegex = /Cell [0-9]{2,} - Address:/;
/** /**
* Parsing the output of iwlist, tool having a lot of different faces :-( * Parsing the output of iwlist, tool having a lot of different faces :-(
* @param str output of the tool * @param str output of the tool
* @param callback * @param callback
*/ */
function parseOutput(str, callback) { function parseOutput(str, callback) {
var err = null; let err = null;
var wifis = []; let wifis = [];
try { try {
var blocks = str.split(cellRegex); let blocks = str.split(cellRegex);
blocks.forEach(block => { blocks.forEach(block => {
var network = {}; let network = {};
var lines = block.split('\n'); let lines = block.split('\n');
if (macRegex.exec(lines[0])) { if (macRegex.exec(lines[0])) {
// First line is the mac address (always! (?)) // First line is the mac address (always! (?))
network.mac = lines[0].trim(); network.mac = lines[0].trim();
@ -39,8 +44,8 @@ function parseOutput(str, callback) {
} }
// Channel, an ugly thing to get it // Channel, an ugly thing to get it
else if (_.startsWith(line.trim(), 'Frequency:')) { else if (_.startsWith(line.trim(), 'Channel:')) {
network.channel = parseInt(_.trim(line, ' )').split(/Channel/)[1], 10); network.channel = parseInt(_.trim(line, ' )').split(/:/)[1]);
} }
// Another ugly thing, the signal which can have different formats, even worse als // Another ugly thing, the signal which can have different formats, even worse als
@ -49,15 +54,14 @@ function parseOutput(str, callback) {
if (line.indexOf('Quality') > -1) { if (line.indexOf('Quality') > -1) {
// This is a "Quality=40/70 Signal level=-70 dBm" line // This is a "Quality=40/70 Signal level=-70 dBm" line
network.rssi = parseInt(line.substr(line.indexOf('Signal level') + 13), 10); network.rssi = parseInt(line.substr(line.indexOf('Signal level') + 13), 10);
} } else {
else {
// This is a "Signal level=60/100" line // This is a "Signal level=60/100" line
var elements = line.split('='); let elements = line.split('=');
elements.forEach(e => { elements.forEach(e => {
if (e.indexOf('/') > 0) { if (e.indexOf('/') > 0) {
// that's our part // that's our part
var parts = e.split('/'); let parts = e.split('/');
var level = Math.floor(100 * parseInt(parts[0], 10) / parseInt(parts[1], 10)); let level = Math.floor(100 * parseInt(parts[0], 10) / parseInt(parts[1], 10));
network.rssi = level / 2 - 100; network.rssi = level / 2 - 100;
} }
}) })
@ -79,5 +83,6 @@ function parseOutput(str, callback) {
module.exports = { module.exports = {
parseOutput: parseOutput, parseOutput: parseOutput,
cmdLine : cmdLine, cmdLine : cmdLine,
detector : detector,
tool : tool tool : tool
}; };

View File

@ -6,6 +6,7 @@
const systemRoot = process.env.SystemRoot || 'C:\\Windows'; const systemRoot = process.env.SystemRoot || 'C:\\Windows';
const tool = systemRoot + '\\System32\\netsh.exe'; const tool = systemRoot + '\\System32\\netsh.exe';
const cmdLine = tool + ' wlan show networks mode=Bssid'; const cmdLine = tool + ' wlan show networks mode=Bssid';
const detector = tool + ' show alias';
/** /**
* Parsing netnsh output. Unfortunately netsh supplies the network information * Parsing netnsh output. Unfortunately netsh supplies the network information
@ -14,13 +15,17 @@ const cmdLine = tool + ' wlan show networks mode=Bssid';
* an approach of analyzing the structure of the output * an approach of analyzing the structure of the output
*/ */
function parseOutput(str, callback) { function parseOutput(str, callback) {
var blocks = str.split('\n\n'); let blocks = str.split('\n\n');
var wifis = []; let wifis = [];
var err = null; let err = null;
try { try {
if (blocks.length < 2) {
// 2nd try, with \r\n
blocks = str.split('\r\n\r\n')
}
if (!blocks || blocks.length === 1) { if (!blocks || blocks.length === 1) {
// No WiFis found // No WiFis found
return []; return callback(null, []);
} }
// Each block has the same structure, while some parts might be available and others // Each block has the same structure, while some parts might be available and others
@ -35,18 +40,18 @@ function parseOutput(str, callback) {
// Channel : 6 // Channel : 6
// Basic rates (MBit/s) : 1 2 5.5 11 // Basic rates (MBit/s) : 1 2 5.5 11
// Other rates (MBit/s) : 6 9 12 18 24 36 48 54 // Other rates (MBit/s) : 6 9 12 18 24 36 48 54
for (var i = 1, l = blocks.length; i < l; i++) { for (let i = 1, l = blocks.length; i < l; i++) {
var network = {}; let network = {};
var lines = blocks[i].split('\n'); let lines = blocks[i].split('\n');
var regexChannel = /[a-zA-Z0-9()\s]+:[\s]*[0-9]+$/g; let regexChannel = /[a-zA-Z0-9()\s]+:[\s]*[0-9]+$/g;
if (!lines || lines.length < 2) { if (!lines || lines.length < 2) {
continue; continue;
} }
// First line is always the SSID (which can be empty) // First line is always the SSID (which can be empty)
var ssid = lines[0].substring(lines[0].indexOf(':') + 1).trim(); let ssid = lines[0].substring(lines[0].indexOf(':') + 1).trim();
for (var t = 1, n = lines.length; t < n; t++) { for (let t = 1, n = lines.length; t < n; t++) {
if (lines[t].split(':').length === 7) { if (lines[t].split(':').length === 7) {
// This is the mac address, use this one as trigger for a new network // This is the mac address, use this one as trigger for a new network
if (network.mac) { if (network.mac) {
@ -56,18 +61,16 @@ function parseOutput(str, callback) {
ssid: ssid, ssid: ssid,
mac : lines[t].substring(lines[t].indexOf(':') + 1).trim() mac : lines[t].substring(lines[t].indexOf(':') + 1).trim()
}; };
} } else if (lines[t].indexOf('%') > 0) {
else if (lines[t].indexOf('%') > 0) {
// Network signal strength, identified by '%' // Network signal strength, identified by '%'
var level = parseInt(lines[t].split(':')[1].split('%')[0].trim(), 10); let level = parseInt(lines[t].split(':')[1].split('%')[0].trim(), 10);
network.rssi = (level / 2) - 100; network.rssi = (level / 2) - 100;
} } else if (!network.channel) {
else if (!network.channel) {
// A tricky one: the channel is the first one having just ONE number. Set only // 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 the channel is not already set ("Basic Rates" can be a single number also)
if (regexChannel.exec(lines[t].trim())) { if (regexChannel.exec(lines[t].trim())) {
network.channel = parseInt(lines[t].split(':')[1].trim()); network.channel = parseInt(lines[t].split(':')[1].trim(), 10);
} }
} }
} }
@ -86,5 +89,6 @@ function parseOutput(str, callback) {
module.exports = { module.exports = {
parseOutput: parseOutput, parseOutput: parseOutput,
cmdLine : cmdLine, cmdLine : cmdLine,
detector : detector,
tool : tool 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
};

3219
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +1,46 @@
{ {
"name": "node-wifi-scanner", "name": "node-wifi-scanner",
"version": "0.0.2", "version": "1.1.3",
"description": "node.js module for WiFi network detection", "description": "node.js module for WiFi network detection",
"main": "index.js", "main": "index.js",
"keywords": [ "keywords": [
"WiFi", "WiFi",
"Node.js", "Node.js",
"scanner" "scanner",
"airport",
"netsh",
"iwlist",
"nmcli"
], ],
"author": { "author": {
"name": "Christian Kuster, CH-8342 Wernetshausen", "name": "Christian Kuster, CH-8342 Wernetshausen",
"email": "info@kusti.ch", "email": "info@kusti.ch",
"url": "http://www.kusti.ch/" "url": "http://www.kusti.ch/"
}, },
"homepage": "http://www.ferropoly.ch/", "homepage": "https://github.com/ancasicolica/node-wifi-scanner",
"bugs": {
"url": "https://github.com/ancasicolica/node-wifi-scanner/issues",
"email": "info@ancasicolica.ch"
},
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/ancasicolica/node-wifi-scanner.git" "url": "https://github.com/ancasicolica/node-wifi-scanner.git"
}, },
"engines": { "engines": {
"node": ">= 4.4.0", "node": ">= 4.0.0",
"npm": ">= 2.14.0" "npm": ">= 2.0.0"
}, },
"scripts": { "scripts": {
"test": "mocha test" "test": "mocha test"
}, },
"dependencies": { "dependencies": {
"lodash": "4.8.1" "async": "3.2.4",
"lodash": "4.17.21"
}, },
"devDependencies": { "devDependencies": {
"grunt": "0.4.5", "grunt": "1.5.3",
"grunt-bump": "0.7.0" "grunt-bump": "0.8.0",
"mocha": "10.2.0"
} }
} }

View File

@ -16,8 +16,8 @@ describe('airport', () => {
assert.ok(info); assert.ok(info);
assert.equal(info.length, 36); assert.equal(info.length, 36);
var ap = info[0]; let ap = info[0];
assert.equal(ap.mac, '00:35:1a:90:56:03'); assert.equal(ap.mac, '');
assert.equal(ap.ssid, 'OurTest'); assert.equal(ap.ssid, 'OurTest');
assert.equal(ap.rssi, -70); assert.equal(ap.rssi, -70);
assert.strictEqual(ap.channel, 112); assert.strictEqual(ap.channel, 112);
@ -49,7 +49,7 @@ describe('airport', () => {
assert.ok(info); assert.ok(info);
assert.equal(info.length, 4); assert.equal(info.length, 4);
var ap = info[0]; let ap = info[0];
assert.equal(ap.mac, '7c:b7:33:ae:3b:06'); assert.equal(ap.mac, '7c:b7:33:ae:3b:06');
assert.equal(ap.ssid, 'Raupo'); assert.equal(ap.ssid, 'Raupo');
assert.equal(ap.rssi, -80); assert.equal(ap.rssi, -80);

View File

@ -1,5 +1,5 @@
SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group) SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
OurTest 00:35:1a:90:56:03 -70 112 Y CH WPA2(PSK/AES/AES) OurTest -70 112 Y CH WPA2(PSK/AES/AES)
OurDev 00:35:1a:90:56:04 -70 112 Y CH WPA2(PSK/AES/AES) OurDev 00:35:1a:90:56:04 -70 112 Y CH WPA2(PSK/AES/AES)
PDANet1 00:35:1a:90:56:09 -70 112 Y CH WPA2(PSK/AES/AES) PDANet1 00:35:1a:90:56:09 -70 112 Y CH WPA2(PSK/AES/AES)
TEST-Wifi 00:35:1a:90:56:0f -70 112 Y CH WPA2(PSK/AES/AES) TEST-Wifi 00:35:1a:90:56:0f -70 112 Y CH WPA2(PSK/AES/AES)

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

@ -22,7 +22,7 @@ describe('iwlist', () => {
assert.ok(info); assert.ok(info);
var ap = info[0]; let ap = info[0];
assert.equal(ap.mac, 'D4:D1:84:50:76:45'); assert.equal(ap.mac, 'D4:D1:84:50:76:45');
assert.equal(ap.ssid, 'gsy-97796'); assert.equal(ap.ssid, 'gsy-97796');
assert.equal(ap.rssi, -76); assert.equal(ap.rssi, -76);
@ -40,7 +40,7 @@ describe('iwlist', () => {
iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist03_raspi.txt'), { encoding: 'utf8' }), (err, info) => { iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist03_raspi.txt'), { encoding: 'utf8' }), (err, info) => {
assert.ok(info); assert.ok(info);
var ap = info[0]; let ap = info[0];
assert.equal(ap.mac, '00:35:1A:90:56:00'); assert.equal(ap.mac, '00:35:1A:90:56:00');
assert.equal(ap.ssid, 'LORA-Wifi'); assert.equal(ap.ssid, 'LORA-Wifi');
assert.equal(ap.rssi, -71); assert.equal(ap.rssi, -71);

View File

@ -16,7 +16,7 @@ describe('netsh', function () {
assert.ok(info); assert.ok(info);
assert.equal(info.length, 86); assert.equal(info.length, 86);
var ap = info[0]; let ap = info[0];
assert.equal(ap.mac, '00:f2:8b:8c:a6:88'); assert.equal(ap.mac, '00:f2:8b:8c:a6:88');
assert.equal(ap.ssid, ''); assert.equal(ap.ssid, '');
assert.equal(ap.rssi, -88.5); assert.equal(ap.rssi, -88.5);
@ -55,7 +55,7 @@ describe('netsh', function () {
assert.ok(info); assert.ok(info);
assert.equal(info.length, 86); assert.equal(info.length, 86);
var ap = info[0]; let ap = info[0];
assert.equal(ap.mac, '00:f2:8b:8c:a6:88'); assert.equal(ap.mac, '00:f2:8b:8c:a6:88');
assert.equal(ap.ssid, ''); assert.equal(ap.ssid, '');
assert.equal(ap.rssi, -88.5); assert.equal(ap.rssi, -88.5);
@ -93,8 +93,8 @@ describe('netsh', function () {
netsh.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures', 'netsh', 'netsh_sp.txt'), {encoding: 'utf8'}), (err, info) => { netsh.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures', 'netsh', 'netsh_sp.txt'), {encoding: 'utf8'}), (err, info) => {
assert.ok(info); assert.ok(info);
assert.equal(info.length, 8); assert.equal(info.length, 8);
console.log(info);
var ap = info[0]; let ap = info[0];
assert.equal(ap.mac, '98:fc:11:b6:88:9e'); assert.equal(ap.mac, '98:fc:11:b6:88:9e');
assert.equal(ap.ssid, 'CARAMANZANAS_BAJA'); assert.equal(ap.ssid, 'CARAMANZANAS_BAJA');
assert.equal(ap.rssi, -86); assert.equal(ap.rssi, -86);

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);
});
});
});