C# 不使用OpenNetCF枚举和切换WM6中的无线配置文件
我正在尝试枚举和切换WindowsMobile 6下的无线配置文件。我使用的是SocketMobile 650。我几乎排除了使用OpenNetCF来实现这一点,因为GetAllNetworkInterfaces()调用返回一个wifi网络接口,该接口似乎不会将自己宣传为WirelessZeroConfigNetworkInterface(或者甚至是WirelessNetworkInterface) 所以,我现在回到API调用。我的问题是:在不使用OpenNetCF的情况下,如何使用c#枚举和切换无线配置文件?对不起,“插入代码”似乎不能很好地处理长代码列表,因此代码看起来很糟糕。请将它们复制/粘贴到编辑器中,然后重新格式化 第(1)、(2)、(3)项非常简单——它们只是类/结构/导出函数的定义。第(4)项是所有魔法发生的地方——但我无法将其插入此处(太长),所以我将其复制到PasteBin(链接在下面)。如果您有任何问题,请告诉我-我会尽力帮助您-但想法是使用DeviceIoControl低级功能与适配器通信C# 不使用OpenNetCF枚举和切换WM6中的无线配置文件,c#,wireless,windows-mobile-6,C#,Wireless,Windows Mobile 6,我正在尝试枚举和切换WindowsMobile 6下的无线配置文件。我使用的是SocketMobile 650。我几乎排除了使用OpenNetCF来实现这一点,因为GetAllNetworkInterfaces()调用返回一个wifi网络接口,该接口似乎不会将自己宣传为WirelessZeroConfigNetworkInterface(或者甚至是WirelessNetworkInterface) 所以,我现在回到API调用。我的问题是:在不使用OpenNetCF的情况下,如何使用c#枚举和切换
请看一下代码。我不认为你能编译它们,但是它们应该能让你知道引擎盖下发生了什么。免责声明-我在5-6年前写的,现在我会做完全不同的:) C++DLL的L> >P > C++包装: 公共类wifidlwrapper { 私有类dll函数 { [DllImport(“ewf.dll”)] 内部静态外部bool TurnWlanOn() 枚举NDIS_802_11_WEP_状态 { Ndis80211我们将受到处罚, Ndis802_11 Encryption1Enabled=Ndis802_11已禁用, Ndis802_11WEPDisabled, Ndis802_11加密禁用=Ndis802_11加密禁用, Ndis802_11 Wepkey缺席, Ndis802_11 Encryption1Key缺席=Ndis802_11 WEPKey缺席, Ndis802_11不支持WEPNO, Ndis802_11加密不受支持=Ndis802_11不受支持, Ndis802_11加密2已启用, Ndis802_11加密2不存在, Ndis802_11加密3已启用, Ndis802_11加密3key不存在 }) 枚举NDIS_802_11_网络_基础设施 { Ndis802_11IBSS, Ndis80211基础设施, Ndis80211自动未知, Ndis802_11InfrastructureMax//不是实值,定义为上限 }) 枚举NDIS_802_11_网络类型 { Ndis802_11FH, NDIS80211ds, Ndis802_11OFDM5,//为OFDM 5G和2.4G添加了新类型 Ndis802\u 11OFDM24, Ndis802_11NetworkTypeMax//不是实类型,定义为上限 }) [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)] 结构APInfo { [Marshallas(UnmanagedType.ByValTStr,SizeConst=40)] 公共字符串_ssid;//AP的ssid
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string _mac; // MAC address of the AP
//[MarshalAs(UnmanagedType.U4)]
public int _rssi; // signal strength in dB
//[MarshalAs(UnmanagedType.U4)]
public uint _wepStatus;
[MarshalAs(UnmanagedType.I4)]
public NDIS_802_11_NETWORK_INFRASTRUCTURE _networkInfrastructure;
[MarshalAs(UnmanagedType.I4)]
public NDIS_802_11_NETWORK_TYPE _networkType;
[MarshalAs(UnmanagedType.U4)]
public uint BeaconPeriod; // units are Kusec
[MarshalAs(UnmanagedType.U4)]
public uint DSConfig; // Frequency, units are kHz
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] _rates; // MSDN: Each byte describes a single rate in units of 0.5 Mbps
}
公共类访问点
{
//如果功率电平(单位:dBm)低于此值,则信号较弱
const int STRONG_WEEK_dBm_THRESHOLD=-70
public static bool IsSignalWeak(int SignalStrengthdBm)
{
return SignalStrengthdBm < STRONG_WEEK_dBm_THRESHOLD;
}
internal AccessPoint(APInfo apInfo)
{
_ssid = apInfo._ssid;
_mac = apInfo._mac;
_rssi = apInfo._rssi;
_wepStatus = apInfo._wepStatus;
_networkInfrastructure = apInfo._networkInfrastructure;
_networkType = apInfo._networkType;
BeaconPeriod = apInfo.BeaconPeriod;
DSConfig = apInfo.DSConfig;
_rates = apInfo._rates;
}
private string _ssid; // SSID of the AP
private string _mac; // MAC address of the AP
private int _rssi; // signal strength in dB
private uint _wepStatus;
private NDIS_802_11_NETWORK_INFRASTRUCTURE _networkInfrastructure;
private NDIS_802_11_NETWORK_TYPE _networkType;
private uint BeaconPeriod; // units are Kusec
private uint DSConfig; // Frequency, units are kHz
private byte[] _rates; // MSDN: Each byte describes a single rate in units of 0.5 Mbps
public bool IsEncrypted
{
get
{
return _wepStatus != 0;
}
}
/// <summary>
/// Beacon Interval in ms
/// </summary>
public ulong BeaconInterval
{
get { return BeaconPeriod; }
}
/// <summary>
/// Frequency in MHz
/// </summary>
public ulong Frequency
{
get { return (DSConfig / 1000); }
}
/// <summary>
/// Supported Rates by AP. Part of them belongs to Basic Rate Set.
/// </summary>
public string Rates
{
get
{
Array.Sort(_rates);
string basicRateSet = "", notBasicRateSet = "";
for (int i = 0; i < _rates.Length; i++)
{
if (_rates[i] == 0)
continue;
// Each supported rate from the BSSBasicRateSet is encoded as a byte with the most significant bit (bit 7) set to 1.
if ((_rates[i] & (1 << 7)) > 0)
basicRateSet += ((_rates[i] - 128) / 2).ToString() + "; ";
// Rates that are not included in the BSSBasicRateSet are encoded with the most significant bit set to zero.
else
notBasicRateSet += (_rates[i] / 2).ToString() + "; ";
}
return "BSSBasicRateSet: {" + basicRateSet + "}. other: {" + notBasicRateSet + "}";
}
}
/// <summary>
/// Number of wireless channel
/// </summary>
public ulong Channel
{
get
{
ulong centralFreqMHz = DSConfig / 1000;
if (centralFreqMHz > 2400 && centralFreqMHz < 2500) // then this is 802.11b/g
{
/*
Regional allocated use of 802.11b/g channels
1 to 11 -- North America (USA and Canada)
1 to 13 -- Austria, Belgium, Denmark, Finland, France, Germany, Greece, Iceland, Ireland, Italy, Liechtenstein, Luxembourg, Netherlands, Norway, Portugal, Spain, Sweden, Switzerland, United Kingdom.
1 to 14 -- Japan, China, Hong Kong, Philippines, Taiwan, Thailand, Singapore, South Korea
*/
switch (centralFreqMHz)
{
case 2412:
return 1;
case 2417:
return 2;
case 2422:
return 3;
case 2427:
return 4;
case 2432:
return 5;
case 2437:
return 6;
case 2442:
return 7;
case 2447:
return 8;
case 2452:
return 9;
case 2457:
return 10;
case 2462:
return 11;
case 2467:
return 12;
case 2472:
return 13;
case 2484:
return 14;
default:
return 0;
}
}
else if (centralFreqMHz > 5100 && centralFreqMHz < 5900) // this is 802.11a
{
switch (centralFreqMHz)
{
case 5170:
return 34;
case 5180:
return 36;
case 5190:
return 38;
case 5200:
return 40;
case 5210:
return 42;
case 5220:
return 44;
case 5230:
return 46;
case 5240:
return 48;
case 5260:
return 52;
case 5280:
return 56;
case 5300:
return 60;
case 5320:
return 64;
case 5500:
return 100;
case 5520:
return 104;
case 5540:
return 108;
case 5560:
return 112;
case 5580:
return 116;
case 5600:
return 120;
case 5620:
return 124;
case 5640:
return 128;
case 5660:
return 132;
case 5680:
return 136;
case 5700:
return 140;
case 5745:
return 149;
case 5765:
return 153;
case 5785:
return 157;
case 5805:
return 161;
default:
return 0;
}
}
else
return 0;
}
}
/// <summary>
/// SSID of the AP
/// </summary>
public string SSID
{
get { return _ssid; }
}
/// <summary>
/// MAC address "XX-XX-XX-XX-XX-XX"
/// </summary>
public string MAC
{
get { return _mac; }
}
/// <summary>
/// Signal strength in dB
/// </summary>
public int SignalStrength
{
get { return (int)_rssi; }
}
/// <summary>
/// MSDN:
/// Specifies a WEP/WPA/WPA2 encryption requirement. A value of 0 indicates that privacy is disabled.
/// A value of 1 indicates that privacy is enabled.
/// </summary>
public string WEP
{
get { return (_wepStatus == 0 ? "WEP disabled" : "WEP enabled"); }
}
/// <summary>
/// Indicates the physical layer for the AP
/// </summary>
public string NetworkType
{
get
{
if (_networkType == NDIS_802_11_NETWORK_TYPE.Ndis802_11FH)
return "frequency-hopping spread-spectrum PHY";
else if (_networkType == NDIS_802_11_NETWORK_TYPE.Ndis802_11DS)
return "direct-sequence spread-spectrum PHY";
else if (_networkType == NDIS_802_11_NETWORK_TYPE.Ndis802_11OFDM24)
return "OFDM 2.4 GHz";
else if (_networkType == NDIS_802_11_NETWORK_TYPE.Ndis802_11OFDM5)
return "OFDM 5 GHz";
else
return "PHY is not FH, nor DS";
}
}
/// <summary>
/// Indicates current network mode for AP
/// </summary>
public string NetworkMode
{
get
{
if (_networkInfrastructure == NDIS_802_11_NETWORK_INFRASTRUCTURE.Ndis802_11IBSS)
return "IBSS (ad hoc) mode";
else if (_networkInfrastructure == NDIS_802_11_NETWORK_INFRASTRUCTURE.Ndis802_11Infrastructure)
return "Infrastructure (ESS) mode";
else if (_networkInfrastructure == NDIS_802_11_NETWORK_INFRASTRUCTURE.Ndis802_11AutoUnknown)
return "Automatic network mode";
else
return "not specified";
}
}
}
//1.初始化适配器:CreateFile(NDISUIO_设备名称,-在g_NdisAdapter处完成)
//2.禁用WZC
//3.重新绑定适配器
//4.打开适配器
外部“C”EWF_API BOOL WINAPI ConnectToAdapter()
{
进入
try
{
return g_NdisAdapter.FindWirelessAdapter();
}
catch (NdisException* e)
{
LOG_EXCEPTION(e);
return FALSE;
}
LEAVE;
return TRUE;
try
{
if (FALSE == g_NdisAdapter.FindWirelessAdapter())
return FALSE;
if (false == g_NdisAdapter.DisableWZC_Driver())
g_NdisAdapter.DisableWZC_API();
g_NdisAdapter.RebindAdapter();
g_NdisAdapter.OpenDevice();
}
catch (NdisException* e)
{
LOG_EXCEPTION(e);
return FALSE;
}
LEAVE;
return TRUE;
}
外部“C”EWF_API BOOL WINAPI TurnWlanOn()
{
返回g_NdisAdapter.TurnWlanOn();
}
外部“C”EWF_API BOOL WINAPI DisconnectFromAdapter()
{
进入;
尝试
{
g_NdisAdapter.Disassociate();
}
捕获(NdisException*e)
{
日志例外(e);
返回FALSE;} } 外部“C”EWF_API BOOL StartScan() { 进入; g_NdisAdapter.ScanForAPs() } 外部“C”EWF_API BOOL GetAPsList(APInfo*pAPs、int maxAPs、int*foundAPs) { 进入; BOOL res=假
try
{
res = g_NdisAdapter.GetAPList(pAPs, maxAPs, foundAPs);
}
catch (NdisException* e)
{
LOG_EXCEPTION(e);
return FALSE;
}
LEAVE;
return TRUE;
}
外部“C”EWF_API布尔连接到AP(int maxWaitTimeSeconds,const wchar_t*ssid,布尔为wepenable,const wchar_t*wepKey)
{
char-cSSID[33],cWepKey[30];
localFunctionCT2A(ssid、cSSID、sizeof(cSSID));
localFunctionCT2A(wepKey、cWepKey、sizeof(cWepKey))
ENTER_FUNC(“SSID=“对不起,看来“插入代码”无法很好地处理长代码列表,因此代码看起来很糟糕。请将它们复制/粘贴到编辑器中,然后重新格式化
第(1)、(2)、(3)项非常简单-它们只是类/结构/导出函数的定义。第(4)项是所有魔术发生的地方-但我无法将其插入此处(太长),因此我将其复制到PasteBin(链接如下)。如果您有任何问题,请告诉我-我会尽力帮助您-但想法是使用DeviceIoControl低级功能与适配器通信
请看一看这些代码。我不认为您能够编译它们,但是它们应该能让您了解引擎盖下发生了什么。免责声明-我在5-6年前写过它们,现在我会做完全不同的事情:)
C++DLL的L> >P > C++包装:
公共类wifidlwrapper
{
私有类dll函数
{
[DllImport(“ewf.dll”)]
内部静态外部bool TurnWlanOn()
枚举NDIS_802_11_WEP_状态
{
Ndis80211我们将受到处罚,
Ndis802_11 Encryption1Enabled=Ndis802_11已禁用,
Ndis802_11WEPDisabled,
Ndis802_11加密禁用=Ndis802_11加密禁用,
Ndis802_11 Wepkey缺席,
Ndis802_11 Encryption1Key缺席=Ndis802_11 WEPKey缺席,
Ndis802_11不支持WEPNO,
Ndis802_11加密不受支持=Ndis802_11不受支持,
Ndis802_11加密2已启用,
Ndis802_11加密2不存在,
Ndis802_11加密3已启用,
Ndis802_11加密3key不存在
})
枚举NDIS_802_11_网络_基础设施
{
Ndis802_11IBSS,
Ndis80211基础设施,
Ndis80211自动未知,
Ndis802_11InfrastructureMax//不是实值,定义为上限
})
枚举NDIS_802_11_网络类型
{
Ndis802_11FH,
NDIS80211ds,
Ndis802_11OFDM5,//为OFDM 5G和2.4G添加了新类型
Ndis802\u 11OFDM24,
Ndis802_11网络类型最大//否
try
{
if (FALSE == g_NdisAdapter.FindWirelessAdapter())
return FALSE;
if (false == g_NdisAdapter.DisableWZC_Driver())
g_NdisAdapter.DisableWZC_API();
g_NdisAdapter.RebindAdapter();
g_NdisAdapter.OpenDevice();
}
catch (NdisException* e)
{
LOG_EXCEPTION(e);
return FALSE;
}
LEAVE;
return TRUE;
LEAVE;
return TRUE;
return TRUE;
try
{
res = g_NdisAdapter.GetAPList(pAPs, maxAPs, foundAPs);
}
catch (NdisException* e)
{
LOG_EXCEPTION(e);
return FALSE;
}
LEAVE;
return TRUE;
ENTER_FUNC("SSID = " << cSSID << ", wep enabled = " << isWepEnabled << ", wep key = '" << cWepKey << "'");
g_NdisAdapter.Disassociate();
Sleep(2000);
ResetEvent(g_NdisConnectedEvent);
g_NdisAdapter.ConnectToAP(cSSID, isWepEnabled, cWepKey);
if (WAIT_OBJECT_0 != WaitForSingleObject(g_NdisConnectedEvent, maxWaitTimeSeconds*1000))
{
LOG("Did not get CONNECTED event from NDIS...");
return FALSE;
}
LEAVE;
return TRUE;