14赞
232
当前位置:  开发笔记 > 编程语言 > 正文

rssi参数获取_如何获取WlanGetNetworkBssList函数返回值的Rssi值

这些结构定义和构造函数在我的代码中工作,来自WlanGetAvailableNetworkList,它是不完整的,并不完全解析结构

这些结构定义和构造函数在我的代码中工作,来自WlanGetAvailableNetworkList,它是不完整的,并不完全解析结构,但它确实得到了RSSI。

[StructLayout(LayoutKind.Sequential)]

public struct WLAN_AVAILABLE_NETWORKS_LIST

{

public UInt32 NumberOfNetworks;

//Current Not used by Native System, can be used to indicate desired network

public UInt32 CurrentNetwork;

//one per network found

public WLAN_AVAILABLE_NETWORK[] Available_Network;

//input for constructor

private IntPtr p;

public WLAN_AVAILABLE_NETWORKS_LIST(IntPtr _p)

{

IntPtr pn = new IntPtr();

// TODO: Complete member initialization

this.p = _p;

this.NumberOfNetworks = (UInt32)Marshal.ReadInt32(p);

this.CurrentNetwork = (UInt32)Marshal.ReadInt32(p, 4);

this.Available_Network = new WLAN_AVAILABLE_NETWORK[NumberOfNetworks];

for (int i = 0; i

{

pn = (IntPtr)(p.ToInt32() + 8 + (628 * i));

//Available_Network[i] = (WLAN_AVAILABLE_NETWORK)Marshal.PtrToStructure(pn, typeof(WLAN_AVAILABLE_NETWORK));

Available_Network[i].strProfileName = Marshal.PtrToStringUni(pn);

Available_Network[i].SSID = new dot11_SSID(new IntPtr(pn.ToInt32() + 512));

Available_Network[i].dot11BssType = (DOT11_BSS_TYPE)Marshal.ReadInt32(pn, 512 + 36);

Available_Network[i].uNumberOfBssids = (UInt32)Marshal.ReadInt32(pn, 512+36+4);

Available_Network[i].wlanSignalQuality = (UInt32)Marshal.ReadInt32(pn, 512 + 36 + 5*4+32+4);

}

}

}WLAN_AVAILABLE_NETWORK的结构

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

public struct WLAN_AVAILABLE_NETWORK //size = 628

{

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

public string strProfileName;//size 512

public dot11_SSID SSID;//size 36

public DOT11_BSS_TYPE dot11BssType; // size 4

public UInt32 uNumberOfBssids; // 4

//public bool bNetworkConnectable; // 4

//public UInt32 wlanNotConnectableReason; // 4

//public UInt32 uNumberOfPhyTypes; // 4

public DOT11_PHY_TYPE[] dot11PhyTypes; // max is 8, size is 8*4 = 32

//public UInt32[] dot11PhyTypes; // max is 8, size is 8*4 = 32

//public bool bMorePhyTypes;// 4

public UInt32 wlanSignalQuality; // size 4

//A percentage value that represents the signal quality of the network. WLAN_SIGNAL_QUALITY is of type ULONG. This member contains a value between 0 and 100. A value of 0 implies an actual RSSI signal strength of -100 dbm. A value of 100 implies an actual RSSI signal strength of -50 dbm. You can calculate the RSSI signal strength value for wlanSignalQuality values between 1 and 99 using linear interpolation.

//public bool bSecurityEnabled;// 4

public DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;// 4

public DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;// 4

//public UInt32 dot11DefaultAuthAlgorithm;// 4

//public UInt32 dot11DefaultCipherAlgorithm;// 4

//public UInt32 dwFlags;// 4

//public UInt32 dwReserved;// 4

}我无法使Marshal.PtrToStructure工作。

这是调用WlanGetAvailableNetworkList的函数

public static WLAN_AVAILABLE_NETWORKS_LIST GetAvailNetworkList()

{

UInt32 _dwflags = 3;

IntPtr handle = GetClientHandle();

IntPtr pGuid = GetCurrentInterfaceGuidPointer();

IntPtr _ppAvailNetworkList = new IntPtr();

uint error = WlanGetAvailableNetworkList(handle, pGuid, _dwflags, IntPtr.Zero, out _ppAvailNetworkList);

if (error != 0)

{

Console.WriteLine("WlanEnumerated function in GetAvailNetworkPointer() failed... inspect error number" + error);

}

else

{

// It worked

}

WLAN_AVAILABLE_NETWORKS_LIST TempNetworkList = new WLAN_AVAILABLE_NETWORKS_LIST(_ppAvailNetworkList);

WlanFreeMemory(pGuid);

CloseClientHandle(handle);

return TempNetworkList;

}以及确认有RSSI值的NUINT测试。

[Test]

public void GetAvailNetworkReturnsRSSI()

{

WiFiApi.WLAN_AVAILABLE_NETWORKS_LIST networklist = WiFiApi.GetAvailNetworkList();

for (int i = 0; i

{

string SSIDstr = new string(networklist.Available_Network[i].SSID.SSID);

Console.Write("Network " + i + " ");

Console.Write(SSIDstr);

Console.Write(" RSSI = " + networklist.Available_Network[i].wlanSignalQuality);

Console.Write(" dbM = " + ((int)(networklist.Available_Network[i].wlanSignalQuality/2)-100));

Console.WriteLine(" ");

if (0 != networklist.Available_Network[i].SSID.SSID_Length)

{

Assert.LessOrEqual((int)networklist.Available_Network[i].wlanSignalQuality, 100);

Assert.Greater((int)networklist.Available_Network[i].wlanSignalQuality, 0);

}

}

}



推荐阅读
author-avatar
mobiledu2502901583
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有