C# 不使用OpenNetCF枚举和切换WM6中的无线配置文件

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#枚举和切换

我正在尝试枚举和切换WindowsMobile 6下的无线配置文件。我使用的是SocketMobile 650。我几乎排除了使用OpenNetCF来实现这一点,因为GetAllNetworkInterfaces()调用返回一个wifi网络接口,该接口似乎不会将自己宣传为WirelessZeroConfigNetworkInterface(或者甚至是WirelessNetworkInterface)

所以,我现在回到API调用。我的问题是:在不使用OpenNetCF的情况下,如何使用c#枚举和切换无线配置文件?

对不起,“插入代码”似乎不能很好地处理长代码列表,因此代码看起来很糟糕。请将它们复制/粘贴到编辑器中,然后重新格式化

第(1)、(2)、(3)项非常简单——它们只是类/结构/导出函数的定义。第(4)项是所有魔法发生的地方——但我无法将其插入此处(太长),所以我将其复制到PasteBin(链接在下面)。如果您有任何问题,请告诉我-我会尽力帮助您-但想法是使用DeviceIoControl低级功能与适配器通信


请看一下代码。我不认为你能编译它们,但是它们应该能让你知道引擎盖下发生了什么。免责声明-我在5-6年前写的,现在我会做完全不同的:)

C++DLL的L> >P > C++包装:

公共类wifidlwrapper { 私有类dll函数 { [DllImport(“ewf.dll”)] 内部静态外部bool TurnWlanOn()

枚举NDIS_802_11_WEP_状态 { Ndis802 11我们将受到处罚, 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, Ndis802 11基础设施, Ndis802 11自动未知, 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_状态 { Ndis802 11我们将受到处罚, 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, Ndis802 11基础设施, Ndis802 11自动未知, 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;