Removed security field, detection is not error proof for all tools.

This commit is contained in:
Christian Kuster 2016-04-06 21:06:13 +02:00
parent 5e2ddc49ee
commit cb7743fe1c
10 changed files with 104 additions and 43 deletions

View File

@ -9,6 +9,8 @@ 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:
@ -29,6 +31,16 @@ It was tested with the following operating systems:
console.log(networks); console.log(networks);
}); });
The tool returns an array with objects, each object representing a network with the following properties:
* channel: WiFi channel
* ssid: SSID of the network (if available)
* mac: MAC Address of the network access point
* rssi: signal strength
In contrary to other wifi scanners no information about security is returned. This is due to the very different implementation
of the command line tools which do not allow a flawless detection.
## Technical background ## Technical background
The module uses command line tools for gathering the network information: The module uses command line tools for gathering the network information:

View File

@ -30,8 +30,7 @@ function parseOutput(str, callback) {
'ssid' : lines[i].substr(0, macStart).trim(), 'ssid' : lines[i].substr(0, macStart).trim(),
'mac' : elements[0].trim(), 'mac' : elements[0].trim(),
'channel' : parseInt(elements[2].trim(), 10), 'channel' : parseInt(elements[2].trim(), 10),
'rssi' : parseInt(elements[1].trim()), 'rssi' : parseInt(elements[1].trim())
'security': elements[3].trim()
}); });
} }
} }

View File

@ -32,11 +32,10 @@ function parseOutput(str, callback) {
// SSID // SSID
if (line.indexOf('ESSID:') > 0) { if (line.indexOf('ESSID:') > 0) {
network.ssid = _.trim(line.split(':')[1], '"'); network.ssid = _.trim(line.split(':')[1], '"');
} if (_.startsWith(network.ssid, '\\x00')) {
// The raspi 3 interprets a string terminator as character, it's an empty SSID
// Security network.ssid = '';
else if (_.startsWith(line.trim(), 'IE:')) { }
network.security = line.split(':')[1].trim();
} }
// Channel, an ugly thing to get it // Channel, an ugly thing to get it

View File

@ -61,12 +61,12 @@ function parseOutput(str, callback) {
// Network signal strength, identified by '%' // Network signal strength, identified by '%'
var level = parseInt(lines[t].split(':')[1].split('%')[0].trim(), 10); var level = parseInt(lines[t].split(':')[1].split('%')[0].trim(), 10);
network.signal_level = (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])) { if (regexChannel.exec(lines[t].trim())) {
network.channel = parseInt(lines[t].split(':')[1].trim()); network.channel = parseInt(lines[t].split(':')[1].trim());
} }
} }

View File

@ -31,8 +31,7 @@ function parseOutput(str, callback) {
'ssid' : _.trim(lines[i].substr(0, macStart), ' \''), 'ssid' : _.trim(lines[i].substr(0, macStart), ' \''),
'mac' : elements[0].trim(), 'mac' : elements[0].trim(),
'channel' : parseInt(elements[2].trim(), 10), 'channel' : parseInt(elements[2].trim(), 10),
'rssi' : parseInt(elements[1].trim()), 'rssi' : parseInt(elements[1].trim())
'security': 'TODO'
}); });
} }
} }

View File

@ -4,7 +4,7 @@ wlan0 Scan completed :
Frequency:2.412 GHz (Channel 1) Frequency:2.412 GHz (Channel 1)
Quality=39/70 Signal level=-71 dBm Quality=39/70 Signal level=-71 dBm
Encryption key:on Encryption key:on
ESSID:"KABA-Wifi" ESSID:"LORA-Wifi"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -66,7 +66,7 @@ wlan0 Scan completed :
Frequency:2.412 GHz (Channel 1) Frequency:2.412 GHz (Channel 1)
Quality=41/70 Signal level=-69 dBm Quality=41/70 Signal level=-69 dBm
Encryption key:on Encryption key:on
ESSID:"TenDev" ESSID:"OppDev"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -97,7 +97,7 @@ wlan0 Scan completed :
Frequency:2.412 GHz (Channel 1) Frequency:2.412 GHz (Channel 1)
Quality=42/70 Signal level=-68 dBm Quality=42/70 Signal level=-68 dBm
Encryption key:on Encryption key:on
ESSID:"TenTest" ESSID:"OppTest"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -249,7 +249,7 @@ wlan0 Scan completed :
Frequency:2.412 GHz (Channel 1) Frequency:2.412 GHz (Channel 1)
Quality=24/70 Signal level=-86 dBm Quality=24/70 Signal level=-86 dBm
Encryption key:on Encryption key:on
ESSID:"KABA-Wifi" ESSID:"LORA-Wifi"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -312,7 +312,7 @@ wlan0 Scan completed :
Frequency:2.437 GHz (Channel 6) Frequency:2.437 GHz (Channel 6)
Quality=32/70 Signal level=-78 dBm Quality=32/70 Signal level=-78 dBm
Encryption key:on Encryption key:on
ESSID:"Kaba Training" ESSID:"LORA Training"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
24 Mb/s; 36 Mb/s; 54 Mb/s 24 Mb/s; 36 Mb/s; 54 Mb/s
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
@ -336,7 +336,7 @@ wlan0 Scan completed :
Frequency:2.437 GHz (Channel 6) Frequency:2.437 GHz (Channel 6)
Quality=28/70 Signal level=-82 dBm Quality=28/70 Signal level=-82 dBm
Encryption key:on Encryption key:on
ESSID:"KABA-Wifi" ESSID:"LORA-Wifi"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -398,7 +398,7 @@ wlan0 Scan completed :
Frequency:2.437 GHz (Channel 6) Frequency:2.437 GHz (Channel 6)
Quality=28/70 Signal level=-82 dBm Quality=28/70 Signal level=-82 dBm
Encryption key:on Encryption key:on
ESSID:"TenDev" ESSID:"OppDev"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -429,7 +429,7 @@ wlan0 Scan completed :
Frequency:2.437 GHz (Channel 6) Frequency:2.437 GHz (Channel 6)
Quality=28/70 Signal level=-82 dBm Quality=28/70 Signal level=-82 dBm
Encryption key:on Encryption key:on
ESSID:"TenTest" ESSID:"OppTest"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -581,7 +581,7 @@ wlan0 Scan completed :
Frequency:2.462 GHz (Channel 11) Frequency:2.462 GHz (Channel 11)
Quality=32/70 Signal level=-78 dBm Quality=32/70 Signal level=-78 dBm
Encryption key:on Encryption key:on
ESSID:"KABA-Wifi" ESSID:"LORA-Wifi"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -643,7 +643,7 @@ wlan0 Scan completed :
Frequency:2.462 GHz (Channel 11) Frequency:2.462 GHz (Channel 11)
Quality=34/70 Signal level=-76 dBm Quality=34/70 Signal level=-76 dBm
Encryption key:on Encryption key:on
ESSID:"TenDev" ESSID:"OppDev"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -674,7 +674,7 @@ wlan0 Scan completed :
Frequency:2.462 GHz (Channel 11) Frequency:2.462 GHz (Channel 11)
Quality=33/70 Signal level=-77 dBm Quality=33/70 Signal level=-77 dBm
Encryption key:on Encryption key:on
ESSID:"TenTest" ESSID:"OppTest"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -768,7 +768,7 @@ wlan0 Scan completed :
Frequency:2.462 GHz (Channel 11) Frequency:2.462 GHz (Channel 11)
Quality=23/70 Signal level=-87 dBm Quality=23/70 Signal level=-87 dBm
Encryption key:on Encryption key:on
ESSID:"TenDev" ESSID:"OppDev"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master
@ -799,7 +799,7 @@ wlan0 Scan completed :
Frequency:2.462 GHz (Channel 11) Frequency:2.462 GHz (Channel 11)
Quality=23/70 Signal level=-87 dBm Quality=23/70 Signal level=-87 dBm
Encryption key:on Encryption key:on
ESSID:"TenTest" ESSID:"OppTest"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master Mode:Master

View File

@ -24,7 +24,7 @@ SSID 2 : EZCastec-59A02EBA
Velocidades b sicas (Mbps): 1 2 5.5 11 Velocidades b sicas (Mbps): 1 2 5.5 11
Otras velocidades (Mbps): 6 9 12 18 24 36 48 54 Otras velocidades (Mbps): 6 9 12 18 24 36 48 54
SSID 3 : KABAWL3 SSID 3 : LOLOWL3
Tipo de red : Infraestructura Tipo de red : Infraestructura
Autenticaci¢n : WPA2-Personal Autenticaci¢n : WPA2-Personal
Cifrado : CCMP Cifrado : CCMP
@ -46,7 +46,7 @@ SSID 4 : IKMGUEST
Velocidades b sicas (Mbps): 1 2 5.5 11 Velocidades b sicas (Mbps): 1 2 5.5 11
Otras velocidades (Mbps): 6 9 12 18 24 36 48 54 Otras velocidades (Mbps): 6 9 12 18 24 36 48 54
SSID 5 : KABAWL SSID 5 : LOLOWL
Tipo de red : Infraestructura Tipo de red : Infraestructura
Autenticaci¢n : WPA2-Personal Autenticaci¢n : WPA2-Personal
Cifrado : CCMP Cifrado : CCMP

View File

@ -12,8 +12,6 @@ const iwlist = require('../lib/iwlist');
describe('iwlist', () => { describe('iwlist', () => {
it('parses the output of file 1', function(done) { it('parses the output of file 1', function(done) {
iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist01_ubuntu1404.txt'), { encoding: 'utf8' }), (err, info) => { iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist01_ubuntu1404.txt'), { encoding: 'utf8' }), (err, info) => {
console.log(info);
assert.ok(info); assert.ok(info);
done(err); done(err);
}); });
@ -22,8 +20,37 @@ describe('iwlist', () => {
it('parses the output of file 2', function(done) { it('parses the output of file 2', function(done) {
iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist02_raspi.txt'), { encoding: 'utf8' }), (err, info) => { iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist02_raspi.txt'), { encoding: 'utf8' }), (err, info) => {
console.log(info);
assert.ok(info); assert.ok(info);
var ap = info[0];
assert.equal(ap.mac, 'D4:D1:84:50:76:45');
assert.equal(ap.ssid, 'gsy-97796');
assert.equal(ap.rssi, -76);
assert.strictEqual(ap.channel, 6);
ap = info[2];
assert.equal(ap.mac, '7C:B7:33:AE:3B:05');
assert.equal(ap.ssid, 'visitor-18170');
assert.equal(ap.rssi, -70);
assert.strictEqual(ap.channel, 9);
done(err);
});
});
it('parses the output of file 2', function(done) {
iwlist.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures','iwlist','iwlist03_raspi.txt'), { encoding: 'utf8' }), (err, info) => {
assert.ok(info);
var ap = info[0];
assert.equal(ap.mac, '00:35:1A:90:56:00');
assert.equal(ap.ssid, 'LORA-Wifi');
assert.equal(ap.rssi, -71);
assert.strictEqual(ap.channel, 1);
ap = info[28];
assert.equal(ap.mac, '00:35:1A:5B:45:B2');
assert.equal(ap.ssid, '');
assert.equal(ap.rssi, -89);
assert.strictEqual(ap.channel, 11);
done(err); done(err);
}); });
}); });

View File

@ -19,31 +19,31 @@ describe('netsh', function () {
var ap = info[0]; var 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.signal_level, -88.5); assert.equal(ap.rssi, -88.5);
assert.strictEqual(ap.channel, 1); assert.strictEqual(ap.channel, 1);
ap = info[22]; ap = info[22];
assert.equal(ap.mac, '00:35:1a:5b:46:7b'); assert.equal(ap.mac, '00:35:1a:5b:46:7b');
assert.equal(ap.ssid, ''); assert.equal(ap.ssid, '');
assert.equal(ap.signal_level, -90); assert.equal(ap.rssi, -90);
assert.strictEqual(ap.channel, 116); assert.strictEqual(ap.channel, 116);
ap = info[23]; ap = info[23];
assert.equal(ap.mac, '10:bd:18:ab:4d:8f'); assert.equal(ap.mac, '10:bd:18:ab:4d:8f');
assert.equal(ap.ssid, 'Network-1'); assert.equal(ap.ssid, 'Network-1');
assert.equal(ap.signal_level, -81); assert.equal(ap.rssi, -81);
assert.strictEqual(ap.channel, 6); assert.strictEqual(ap.channel, 6);
ap = info[74]; ap = info[74];
assert.equal(ap.mac, '00:f2:8b:8c:a6:8d'); assert.equal(ap.mac, '00:f2:8b:8c:a6:8d');
assert.equal(ap.ssid, 'Network-6'); assert.equal(ap.ssid, 'Network-6');
assert.equal(ap.signal_level, -87.5); assert.equal(ap.rssi, -87.5);
assert.strictEqual(ap.channel, 1); assert.strictEqual(ap.channel, 1);
ap = info[85]; ap = info[85];
assert.equal(ap.mac, '00:f2:8b:8c:a6:85'); assert.equal(ap.mac, '00:f2:8b:8c:a6:85');
assert.equal(ap.ssid, 'Network-7'); assert.equal(ap.ssid, 'Network-7');
assert.equal(ap.signal_level, -89.5); assert.equal(ap.rssi, -89.5);
assert.strictEqual(ap.channel, 1); assert.strictEqual(ap.channel, 1);
done(err); done(err);
}); });
@ -58,34 +58,55 @@ describe('netsh', function () {
var ap = info[0]; var 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.signal_level, -88.5); assert.equal(ap.rssi, -88.5);
assert.strictEqual(ap.channel, 1); assert.strictEqual(ap.channel, 1);
ap = info[22]; ap = info[22];
assert.equal(ap.mac, '00:35:1a:5b:46:7b'); assert.equal(ap.mac, '00:35:1a:5b:46:7b');
assert.equal(ap.ssid, ''); assert.equal(ap.ssid, '');
assert.equal(ap.signal_level, -90); assert.equal(ap.rssi, -90);
assert.strictEqual(ap.channel, 116); assert.strictEqual(ap.channel, 116);
ap = info[23]; ap = info[23];
assert.equal(ap.mac, '10:bd:18:ab:4d:8f'); assert.equal(ap.mac, '10:bd:18:ab:4d:8f');
assert.equal(ap.ssid, 'Network-1'); assert.equal(ap.ssid, 'Network-1');
assert.equal(ap.signal_level, -81); assert.equal(ap.rssi, -81);
assert.strictEqual(ap.channel, 6); assert.strictEqual(ap.channel, 6);
ap = info[74]; ap = info[74];
assert.equal(ap.mac, '00:f2:8b:8c:a6:8d'); assert.equal(ap.mac, '00:f2:8b:8c:a6:8d');
assert.equal(ap.ssid, 'Network-6'); assert.equal(ap.ssid, 'Network-6');
assert.equal(ap.signal_level, -87.5); assert.equal(ap.rssi, -87.5);
assert.strictEqual(ap.channel, 1); assert.strictEqual(ap.channel, 1);
ap = info[85]; ap = info[85];
assert.equal(ap.mac, '00:f2:8b:8c:a6:85'); assert.equal(ap.mac, '00:f2:8b:8c:a6:85');
assert.equal(ap.ssid, 'Network-7'); assert.equal(ap.ssid, 'Network-7');
assert.equal(ap.signal_level, -89.5); assert.equal(ap.rssi, -89.5);
assert.strictEqual(ap.channel, 1); assert.strictEqual(ap.channel, 1);
done(err); done(err);
}); });
}); });
it('parses sp locale output', function (done) {
netsh.parseOutput(fs.readFileSync(path.join(__dirname, 'fixtures', 'netsh', 'netsh_sp.txt'), {encoding: 'utf8'}), (err, info) => {
assert.ok(info);
assert.equal(info.length, 8);
console.log(info);
var ap = info[0];
assert.equal(ap.mac, '98:fc:11:b6:88:9e');
assert.equal(ap.ssid, 'CARAMANZANAS_BAJA');
assert.equal(ap.rssi, -86);
assert.strictEqual(ap.channel, 9);
ap = info[7];
assert.equal(ap.mac, '70:72:cf:af:51:e0');
assert.equal(ap.ssid, 'BOOWIFI');
assert.equal(ap.rssi, -100);
assert.strictEqual(ap.channel, 1);
done();
});
});
}); });

View File

@ -15,9 +15,13 @@ describe.skip('nmcli', () => {
console.log(info); console.log(info);
assert.ok(info); assert.ok(info);
assert.equal(info.length, 36); 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); done(err);
}); });