无线网编程之获取BSS列表

之前一直不清楚BSS的意思,BSS = Basic Service Set,基础服务集?因为WlanConnect函数有几个参数和BSS有关,得研究一下BSS。

名词:

SS=Service Set 服务集

BSS=Basic Service Set 基本服务集

ESS=Extend  Service Set 扩展服务集

IBSS=Independent Basic Service Set 独立基本服务集

SSID=Service Set Identifier 服务集标识符

BSSID=Basic Service Set Identifier 基本服务集标识符

ESSID=Extend Service Set Identifier 扩展服务集标识符

关于BSS的理解可以参考维基百科-服务集。这里稍微说下我的理解。从SSID来理解BSS,SSID通俗地理解就是无线网的名称,专业点理解就是用来标识无线网的字符串。维基说服务集SS是用来描述无线网的构成单位-一组互相有联系的无线设备,可以理解为一种服务、一种规范。SSID是这个服务集中用来标识网络的字段,是名称,是SS里的一个变量。而BSS是SS的子集,是一种更详细的规范。在后来的学习中还遇到了BSSID,这个与SSID不一样的是:SSID是一个字符串;BSSID是一个MAC地址。维基上说BSSID是AP链路层的MAC地址,而ESSID是一个最长32字节区分大小写的字符串,用来标识无线网络的名称。【是不是意味着ESSID=SSID,BSSID=MAC???】【也可以理解为SSID是顶层标识而BSSID是底层标识?】SSID是可以重复的(名称相同的无线网),而MAC是不重复的。

其它两个名词:

AP=Access Point 无线接入点(无线路由器、无线基站、开wifi共享的电脑或手机等)

WAP=Wirless Access Point = AP

Ad Hoc=WANET=Wirless Ad Hoc Network 无线随意网络/无线临时网络

一句话理解AD HOC:没有路由和交换机连接的网络,例如:笔记本的wifi

————————————分割线————————————

来看今天学习的函数

WlanGetNetworkBssList 

DWORD WINAPI WlanGetNetworkBssList(
  _In_        HANDLE hClientHandle,
  _In_        const GUID *pInterfaceGuid,
              const  PDOT11_SSID pDot11Ssid,
  _In_        DOT11_BSS_TYPE dot11BssType,
  _In_        BOOL bSecurityEnabled,
  _Reserved_  PVOID pReserved,
  _Out_       PWLAN_BSS_LIST *ppWlanBssList
);

 参数

pDot11Ssid [optional]: DOT11_SSID 结构体类型。当这个参数指定了SSID时,返回该SSID的BSS列表(这个意思时名称相同,但BSSID不同的网络吧);当这个值设置为NULL时,返回所有的BSS列表。特别地,当这个参数指定了SSID时,dot11BssType 参数必须被指定为dot11_BSS_type_infrastructure 或者 dot11_BSS_type_independent,而且bSecurityEnabled参数也必须指定(为1)。在我的电脑上测试(手机开的便携热点),dot11BssType 设置为dot11_BSS_type_infrastructure有返回值,而dot11_BSS_type_independent 没有。不过不懂_independent(独立)和_infrastructure(基础设施)的区别。。。。

dot11BssType [in]:BBS的类型。该参数是DOT11_BSS_TYPE 枚举类型。 当pDot11Ssid 设置为NULL时,该值会被忽略。

Value Meaning
dot11_BSS_type_infrastructure
An infrastructure BSS network.

值为 1

dot11_BSS_type_independent
An independent BSS (IBSS) network (an ad hoc network).

值为 2

dot11_BSS_type_any
Any BSS network.

 值为 3

bSecurityEnabled [in]:布尔类型0或1,功能不明白,只有pDot11Ssid 不是NULL的时候才有效。

ppWlanBssList [out]:WLAN_BSS_LIST 结构体类型。用来返回BSS列表。

返回值

执行成功ERROR_SUCCESS,其它

Return code Description
ERROR_INVALID_HANDLE
The handle hClientHandle was not found in the handle table.
ERROR_INVALID_PARAMETER
A parameter is incorrect. This error is returned if thehClientHandlepInterfaceGuid, or ppWlanBssListparameter is NULL. This error is returned if thepReserved is not NULL. This error is also returned if the hClientHandle, the SSID specified in the pDot11Ssidparameter, or the BSS type specified in thedot11BssType parameter is not valid.
ERROR_NDIS_DOT11_POWER_STATE_INVALID
The radio associated with the interface is turned off. The BSS list is not available when the radio is off.
ERROR_NOT_ENOUGH_MEMORY
Not enough memory is available to process this request and allocate memory for the query results.
ERROR_NOT_FOUND
The element was not found. This error is returned if the GUID of the interface to be queried that was specified in the pInterfaceGuid parameter could not be found.
ERROR_NOT_SUPPORTED
The request is not supported. This error is returned if this function was called from a Windows XP with SP3 or Wireless LAN API for Windows XP with SP2 client. This error is also returned if the WLAN AutoConfig service is disabled.
ERROR_SERVICE_NOT_ACTIVE
The WLAN AutoConfig service has not been started.
RPC_STATUS
Various error codes.

 相关类型

DOT11_BSS_TYPE枚举值

typedef enum _DOT11_BSS_TYPE { 
  dot11_BSS_type_infrastructure  = 1,
  dot11_BSS_type_independent     = 2,
  dot11_BSS_type_any             = 3
} DOT11_BSS_TYPE, *PDOT11_BSS_TYPE;

WLAN_BSS_LIST 结构体

typedef struct _WLAN_BSS_LIST {
  DWORD          dwTotalSize;
  DWORD          dwNumberOfItems;
  WLAN_BSS_ENTRY wlanBssEntries[1];
} WLAN_BSS_LIST, *PWLAN_BSS_LIST;

第三个变量是WLAN_BSS_ENTRY 结构体

typedef struct _WLAN_BSS_ENTRY {
  DOT11_SSID        dot11Ssid;
  ULONG             uPhyId;
  DOT11_MAC_ADDRESS dot11Bssid;
  DOT11_BSS_TYPE    dot11BssType;
  DOT11_PHY_TYPE    dot11BssPhyType;
  LONG              lRssi;
  ULONG             uLinkQuality;
  BOOLEAN           bInRegDomain;
  USHORT            usBeaconPeriod;
  ULONGLONG         ullTimestamp;
  ULONGLONG         ullHostTimestamp;
  USHORT            usCapabilityInformation;
  ULONG             ulChCenterFrequency;
  WLAN_RATE_SET     wlanRateSet;
  ULONG             ulIeOffset;
  ULONG             ulIeSize;
} WLAN_BSS_ENTRY, *PWLAN_BSS_ENTRY;

这里只记下我用到的几个值~

dot11Ssid是DOT11_SSID 结构体类型,结构体中ucSSID就是我们常常看到的SSID了。

dot11Bssid是DOT11_MAC_ADDRESS 类型(不是结构体吧,官网貌似打错了),而这个类型是这样定义的

typedef UCHAR DOT11_MAC_ADDRESS[6];
typedef DOT11_MAC_ADDRESS* PDOT11_MAC_ADDRESS;

是UCHAR数组类型。这个值就是无线网接入点的MAC地址了,我用手机开热点,该值就是我手机的MAC地址。

dot11BssType是 DOT11_BSS_TYPE 枚举类型,其值有

typedef enum _DOT11_BSS_TYPE { 
  dot11_BSS_type_infrastructure  = 1,
  dot11_BSS_type_independent     = 2,
  dot11_BSS_type_any             = 3
} DOT11_BSS_TYPE, *PDOT11_BSS_TYPE;

经过测试,我电脑上BSS列表该值都是1也就是dot11BssType类型。

贴代码~~任然是在之前的基础上添加的

	////////////////////////////获取BSSLIST///////////////////
	PWLAN_BSS_LIST pWlanBssList;
	PWLAN_BSS_ENTRY pWlanBssEntry;
	dwResult = WlanGetNetworkBssList(
															hClient,
															&pIfInfo->InterfaceGuid,
															NULL,//&ppAvailableNetworkList->Network[0].dot11Ssid,	//pDot11Ssid设置为NULL返回所有的BSS
															dot11_BSS_type_infrastructure,		//上一个值设置为NULL,这个值会被忽略
															1,				//pDot11Ssid不是NULL这个参数有效
															NULL,
															&pWlanBssList		//指针的指针
														);
	 if (dwResult != ERROR_SUCCESS)  {
        wprintf(L"WlanGetProfile failed with error: %un", dwResult);
        // FormatMessage can be used to find out why the function failed
        return 1;
    }
    else {
		wprintf(L"dwTotalSize: %lun", pWlanBssList->dwTotalSize);
		wprintf(L"dwNumberOfItems: %lun", pWlanBssList->dwNumberOfItems);
		for (i = 0; i < (int)  pWlanBssList->dwNumberOfItems; i++) {
			pWlanBssEntry = (PWLAN_BSS_ENTRY) &pWlanBssList->wlanBssEntries[i];
            wprintf(L"  BSS Index[%d]:t %lun", i, i);
			wprintf(L"  BSS ucSSID:t%wsn",ToWChar((char*) pWlanBssEntry->dot11Ssid.ucSSID));
			wprintf(L"  BSS dot11BssType:t%lun",pWlanBssEntry->dot11BssType);		//这个值都是dot11_BSS_type_infrastructure = 1 在后面用得上
			wprintf(L"  BSS dot11Bssid DOT11_MAC_ADDRESS:t");
			for(int j=0;j<5;j++)
			{
				wprintf(L"%x:",pWlanBssEntry->dot11Bssid[j]);
			}
			wprintf(L"%xnn",pWlanBssEntry->dot11Bssid[5]);
		}

	}

	if (pWlanBssList  != NULL) {
        WlanFreeMemory(pWlanBssList );
        pWlanBssList  = NULL;
    }

我用手机开热点,来张图~

BSS列表截图

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据