1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-16 08:13:30 +00:00
Files
MeshAgent/Debug/WirelessTest.js
2017-10-12 14:28:03 -07:00

158 lines
4.7 KiB
JavaScript

function _Scan()
{
var wlanInterfaces = this.Marshal.CreatePointer();
this.Native.WlanEnumInterfaces(this.Handle, 0, wlanInterfaces);
var count = wlanInterfaces.Deref().Deref(0, 4).Val;
var info = wlanInterfaces.Deref().Deref(8, 532);
var iname = info.Deref(16, 512).AnsiString;
var istate;
switch (info.Deref(528, 4).Val)
{
case 0:
istate = "NOT READY";
break;
case 1:
istate = "CONNECTED";
break;
case 2:
istate = "AD-HOC";
break;
case 3:
istate = "DISCONNECTING";
break;
case 4:
istate = "DISCONNECTED";
break;
case 5:
istate = "ASSOCIATING";
break;
case 6:
istate = "DISCOVERING";
break;
case 7:
istate = "AUTHENTICATING";
break;
default:
istate = "UNKNOWN";
break;
}
var iguid = info.Deref(0, 16);
if (this.Native.WlanScan(this.Handle, iguid, 0, 0, 0) == 0)
{
return (true);
}
else
{
return (false);
}
}
function AccessPoint(_ssid, _bssid, _rssi, _lq)
{
this.ssid = _ssid;
this.bssid = _bssid;
this.rssi = _rssi;
this.lq = _lq;
}
AccessPoint.prototype.toString = function()
{
return (this.ssid + " [" + this.bssid + "]: " + this.lq);
}
function OnNotify(NotificationData)
{
var NotificationSource = NotificationData.Deref(0, 4).Val;
var NotificationCode = NotificationData.Deref(4, 4).Val;
var dataGuid = NotificationData.Deref(8, 16);
if ((NotificationSource & 0X00000008) && (NotificationCode == 7))
{
var bss = this.Parent.Marshal.CreatePointer();
var result = this.Parent.Native.GetBSSList(this.Parent.Handle, dataGuid, 0, 3, 0, 0, bss);
if (result == 0)
{
var totalSize = bss.Deref().Deref(0, 4).Val;
var numItems = bss.Deref().Deref(4, 4).Val;
for (i = 0; i < numItems; ++i)
{
var item = bss.Deref().Deref(8 + (360 * i), 360);
var ssid = item.Deref(4, 32).String.trim();
var bssid = item.Deref(40, 6).HexString2;
var rssi = item.Deref(56, 4).Val;
var lq = item.Deref(60, 4).Val;
this.Parent.emit('Scan', new AccessPoint(ssid, bssid, rssi, lq));
}
}
}
}
function Wireless()
{
var emitterUtils = require('events').inherits(this);
this.Marshal = require('_GenericMarshal');
this.Native = this.Marshal.CreateNativeProxy("wlanapi.dll");
this.Native.CreateMethod("WlanOpenHandle");
this.Native.CreateMethod("WlanGetNetworkBssList", "GetBSSList");
this.Native.CreateMethod("WlanRegisterNotification");
this.Native.CreateMethod("WlanEnumInterfaces");
this.Native.CreateMethod("WlanScan");
this.Native.CreateMethod("WlanQueryInterface");
var negotiated = this.Marshal.CreatePointer();
var h = this.Marshal.CreatePointer();
this.Native.WlanOpenHandle(2, 0, negotiated, h);
this.Handle = h.Val;
this._NOTIFY_PROXY_OBJECT = this.Marshal.CreateCallbackProxy(OnNotify, 2);
this._NOTIFY_PROXY_OBJECT.Parent = this;
var PrevSource = this.Marshal.CreatePointer();
var result = this.Native.WlanRegisterNotification(this.Handle, 0X0000FFFF, 0, this._NOTIFY_PROXY_OBJECT.Callback, this._NOTIFY_PROXY_OBJECT.State, 0, PrevSource);
emitterUtils.createEvent('Scan');
emitterUtils.addMethod('Scan', _Scan);
this.GetConnectedNetwork = function ()
{
var interfaces = this.Marshal.CreatePointer();
this.Native.WlanEnumInterfaces(this.Handle, 0, interfaces);
var count = interfaces.Deref().Deref(0, 4).Val;
var info = interfaces.Deref().Deref(8, 532);
var iname = info.Deref(16, 512).AnsiString;
var istate = info.Deref(528, 4).IntVal;
if(info.Deref(528, 4).IntVal == 1) // CONNECTED
{
var dataSize = this.Marshal.CreatePointer();
var pData = this.Marshal.CreatePointer();
var valueType = this.Marshal.CreatePointer();
var iguid = info.Deref(0, 16);
var retVal = this.Native.WlanQueryInterface(this.Handle, iguid, 7, 0, dataSize, pData, valueType);
if (retVal == 0)
{
var associatedSSID = pData.Deref().Deref(524, 32).String;
var bssid = pData.Deref().Deref(560, 6).HexString;
var lq = pData.Deref().Deref(576, 4).IntVal;
return (new AccessPoint(associatedSSID, bssid, 0, lq));
}
}
throw ("GetConnectedNetworks: FAILED (not associated to a network)");
};
return (this);
}
module.exports = new Wireless();