mt7688-wiscan
Version:
A wifi access points scanning tool for MediaTek Linkit Smart 7688
167 lines (135 loc) • 3.83 kB
JavaScript
var exec = require('child_process').exec;
var defaultInterface = 'ra0',
freqs = [
'2.412',
'2.417',
'2.422',
'2.427',
'2.432',
'2.437',
'2.442',
'2.447',
'2.452',
'2.457',
'2.462',
];
var wiscan = {};
wiscan.scan = function (intf, callback) {
var child;
if (typeof intf === 'function') {
callback = intf;
intf = defaultInterface;
}
intf = intf || defaultInterface;
callback = callback || function () {};
if (typeof intf !== 'string')
return callback(new Error('intf should be a string.'));
if (!/[0-9a-zA-Z]/.test(intf.charAt(0)))
return callback(new Error('Bad intf.'));
child = exec('iwinfo ' + intf + ' scan', function (error, stdout, stderr) {
if (error) {
stderr = stderr.trim();
return callback(new Error(stderr));
}
var info = stdout,
parsed = [];
info = info.replace(/\n/g, ' ');
info = info.replace(/"/g, '');
info = info.split(' ');
info.forEach(function (char, i) {
if (char === 'ESSID' && info[i + 1] === '') info[i + 1] = 'unknown';
else if (char !== '') parsed.push(char);
});
parsed = parse(parsed);
callback(null, parsed);
});
};
wiscan.scanByEssid = function (intf, essid, callback) {
var target = null;
if (arguments.length === 2) {
callback = essid;
essid = intf;
intf = defaultInterface;
}
intf = intf || defaultInterface;
if (typeof intf !== 'string')
return callback(new Error('intf should be a string.'));
else if (typeof essid !== 'string')
return callback(new Error('essid should be a string.'));
callback = callback || function () {};
wiscan.scan(intf, function (err, infos) {
if (err) return callback(err);
infos.forEach(function (info) {
if (info.essid === essid) target = info;
});
callback(null, target);
});
};
wiscan.lqi = function (intf, essid, callback) {
if (arguments.length === 2) {
callback = essid;
essid = intf;
intf = defaultInterface;
}
intf = intf || defaultInterface;
wiscan.scanByEssid(intf, essid, function (err, info) {
if (err) return callback(err);
if (info) callback(null, info.quality);
else callback(null, null);
});
};
function parse(items) {
var parsed = [],
len = items.length,
idx = 0;
if (items.length === 0) return parsed;
items.forEach(function (c, i) {
var val;
if (c === 'Cell') {
//- [deleted: need not cell field] val = items[i+1];
//- [deleted: need not cell field] val = isNaN(parseInt(val)) ? val : parseInt(val);
parsed.push({});
} else if (c === 'Address:') {
parsed[idx].address = items[i + 1];
} else if (c === 'ESSID:') {
parsed[idx].essid = items[i + 1];
} else if (c === 'Mode:') {
parsed[idx].mode = items[i + 1];
} else if (c === 'Channel:') {
val = items[i + 1];
val = isNaN(parseInt(val)) ? val : parseInt(val);
parsed[idx].channel = val;
parsed[idx].frequency = getFrequency(val);
} else if (c === 'Signal:') {
val = items[i + 1];
val = isNaN(parseInt(val)) ? val : parseInt(val);
parsed[idx].signal = val;
} else if (c === 'Quality:') {
val = items[i + 1].split('/')[0];
val = isNaN(parseInt(val)) ? val : parseInt(val);
parsed[idx].quality = val;
} else if (c === 'Encryption:') {
var x = i + 1,
enc = '';
while (items[x] !== 'Cell') {
if (x !== len) {
enc = enc + items[x] + ' ';
x += 1;
} else {
break;
}
}
enc = enc.trim();
parsed[idx].encryption = enc;
idx += 1;
}
});
return parsed;
}
function getFrequency(ch) {
var f = freqs[ch - 1];
if (f) f = f + ' GHz';
else f = '';
return f;
}
module.exports = wiscan;