当前位置:   article > 正文

c++ WlanAPI 承载网络 连接无线网络_c++ 开发ap热点

c++ 开发ap热点

最近在玩树莓派,烧录的也是win10  IOT 系统,然后想弄一个界面可以手动设置wifi热点,所以找了找windows的wlanAPI.


然后发现网上很多关于 保存了密码的无线网络 的连接方法,如:http://blog.csdn.net/lincyang/article/details/34430939这位仁兄的文章,
但是如何设置热点的几乎没有!


所以只能自己弄,麻烦的要命,其实在电脑上是不需要这么麻烦的用代码来实现的,直接用dos命令就能搞定,这只是个人的爱好和需要。dos命令就不介绍了百度一大堆!



  1. #include <windows.h>
  2. #include <wlanapi.h>
  3. #include <objbase.h>
  4. #include <wtypes.h>
  5. #include <string>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <tchar.h>
  9. // Need to link with Wlanapi.lib and Ole32.lib
  10. #pragma comment(lib, "wlanapi.lib")
  11. #pragma comment(lib, "ole32.lib")
  12. #include <atlconv.h>
  13. #include <iostream>
  14. using namespace std;
  15. #include <atlstr.h>
  16. #include <netcon.h>
  17. #include <NetCon.h>
  18. #include <locale.h>
  19. #include <WinNetWk.h>
  20. #include <netlistmgr.h>
  21. #include <ShObjIdl.h>
  22. #pragma comment (lib,"Mpr.lib")
  23. #pragma comment(lib, "oleaut32.lib")
  24. // 设置internet 连接共享(ICS)
  25. HRESULT AddSharingNet( INetSharingManager* pNSM )
  26. {
  27. INetConnection * pNC = NULL;
  28. INetSharingEveryConnectionCollection * pNSECC = NULL;
  29. // 枚举设备(即本地连接,无线网络连接。。。)
  30. HRESULT hr = pNSM->get_EnumEveryConnection( &pNSECC );
  31. if (!pNSECC)
  32. {
  33. wprintf( L"failed to get EveryConnectionCollection!\r\n" );
  34. }
  35. else // 反之获取 枚举列表成功
  36. {
  37. IEnumVARIANT * pEV = NULL;
  38. IUnknown * pUnk = NULL;
  39. hr = pNSECC->get__NewEnum( &pUnk );
  40. if (pUnk)
  41. {
  42. hr = pUnk->QueryInterface( __uuidof(IEnumVARIANT), (void**)&pEV );
  43. pUnk->Release( );
  44. }
  45. if (pEV)
  46. {
  47. VARIANT v;
  48. VariantInit( &v );// 初始化 错误 类型VARIANT(是错误可捕捉)
  49. BOOL bFoundIt = FALSE;
  50. INetSharingConfiguration * pNSC = NULL;
  51. INetSharingConfiguration * pVWifiNSC = NULL;
  52. NETCON_PROPERTIES* pVWifi = NULL;
  53. while (S_OK == pEV->Next( 1, &v, NULL ))// 枚举序列中的元素 ,返回错误值
  54. {
  55. if (V_VT( &v ) == VT_UNKNOWN)// 返回位置类型
  56. {
  57. V_UNKNOWN( &v )->QueryInterface( __uuidof(INetConnection), (void**)&pNC ); // 查询设备是否支持接口
  58. if (pNC)
  59. {
  60. NETCON_PROPERTIES* pNP = NULL;
  61. pNC->GetProperties( &pNP );// 获取设备属性
  62. setlocale( LC_ALL, "chs" );
  63. wprintf( L"pszwName--%s\n", pNP->pszwName );
  64. wprintf( L"pszwDeviceName--%s\n", pNP->pszwDeviceName );
  65. wprintf( L"Status--%d\n", pNP->Status );// 这个值是表示网络是否禁用
  66. wprintf( L"MediaType--%d\n", pNP->MediaType );
  67. wprintf( L"dwCharacter--%d\n", pNP->dwCharacter );
  68. wprintf( L"clsidThisObject--%d\n", pNP->clsidThisObject );
  69. wprintf( L"clsidUiObject--%d\n", pNP->clsidUiObject );
  70. wprintf( L"\n" );
  71. // 被共享的网络设置为公开共享
  72. USES_CONVERSION;
  73. std::string str( W2A( pNP->pszwDeviceName ) );
  74. /* 这里我是为了开一个虚拟的网络(一般电脑上都会有本地连接,无线网络这两个,而我需要设置wifi热点, 即承载网络)*/
  75. if (pNP->Status == NCS_CONNECTED && (- 1 == str.find( "Virtual" )))
  76. {
  77. hr = pNSM->get_INetSharingConfigurationForINetConnection( pNC, &pNSC );
  78. hr = pNSC->EnableSharing( ICSSHARINGTYPE_PUBLIC );
  79. pNSC->Release( );
  80. }
  81. /* 虚拟无线网络设置(本地网络或者是无线网络都可以,前提是这个网络需要是能连接上外网的,上面那个就是共享的它的外网)*/
  82. if (pNP->Status == NCS_CONNECTED && (-1 != str.find( "Virtual" )))
  83. {
  84. pVWifi = pNP;
  85. hr = pNSM->get_INetSharingConfigurationForINetConnection( pNC, &pVWifiNSC );
  86. pVWifiNSC->EnableSharing( ICSSHARINGTYPE_PRIVATE );
  87. wprintf( L"\nIs this VWifi?--%s\n\n", pVWifi->pszwDeviceName );
  88. }
  89. }
  90. }
  91. }
  92. // 因设计需要 必须要有一个 虚拟的网络 如果没有那么这个指针为空
  93. if (pVWifiNSC == NULL )
  94. {
  95. cout << "pVWifiNSC NULL" << endl;
  96. return -1;
  97. }
  98. INetSharingPortMapping * pNSPM = NULL;
  99. BSTR pszwName = pVWifi->pszwName;
  100. wprintf( L"BSTR--------------%s\n", pszwName ); // 被设置的虚拟网络
  101. pVWifiNSC->Release( );
  102. if (pNSPM)
  103. {
  104. wprintf( L"just added ........................................................!\r\n" );
  105. hr = pNSPM->Enable( );
  106. wprintf( L"just enabled port mapping!\r\n" );
  107. INetSharingPortMappingProps* pMapping = NULL;
  108. pNSPM->get_Properties( &pMapping );
  109. BSTR result = NULL;
  110. long port = 0;
  111. pMapping->get_Name( &result );
  112. pMapping->get_ExternalPort( &port );
  113. wprintf( L"NAMEEEEE::::%s\n", result );
  114. wprintf( L"exPortttttt::::%d\n", port );
  115. pNSPM->Release( );
  116. }
  117. }
  118. }
  119. return hr;
  120. }
  121. int main( )
  122. {
  123. CoInitialize( NULL );
  124. CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
  125. RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
  126. INetSharingManager * pNSM = NULL;
  127. HRESULT hr = ::CoCreateInstance( __uuidof(NetSharingManager), NULL, CLSCTX_ALL,
  128. __uuidof(INetSharingManager), (void**)&pNSM );
  129. if (!pNSM)
  130. {
  131. wprintf( L"failed to create NetSharingManager object\r\n" );
  132. }
  133. // 添加共享功能
  134. AddSharingNet( pNSM );
  135. DWORD dError = 0;
  136. DWORD dwServiceVersion = 0;
  137. HANDLE hClient = NULL;
  138. if (ERROR_SUCCESS != (dError = WlanOpenHandle(
  139. WLAN_API_VERSION,
  140. NULL,
  141. &dwServiceVersion,
  142. &hClient
  143. )))
  144. {
  145. cout << "WlanOpenHandle ret dwError = " << dError << endl;
  146. return -1;
  147. }
  148. // check service version
  149. if (WLAN_API_VERSION_MAJOR( dwServiceVersion ) < WLAN_API_VERSION_MAJOR( WLAN_API_VERSION_2_0 ))
  150. {
  151. cout << "WlanCloseHandle " << endl;
  152. WlanCloseHandle( hClient, NULL );
  153. }
  154. // 设置承载网络模式为允许
  155. BOOL bIsAllow = TRUE;
  156. WLAN_HOSTED_NETWORK_REASON dwFailedReason;
  157. DWORD dwReturnValue = WlanHostedNetworkSetProperty( hClient,
  158. wlan_hosted_network_opcode_enable,
  159. sizeof( BOOL ),
  160. &bIsAllow,
  161. &dwFailedReason,
  162. NULL );
  163. if (ERROR_SUCCESS != dwReturnValue)
  164. {
  165. cout << "WlanHostedNetworkSetProperty ret dwReturnValue" << dwReturnValue <<endl;
  166. return -1;
  167. }
  168. // dwReturnValue = WlanHostedNetworkStopUsing( hClient, &dwFailedReason, NULL );
  169. // 设置承载网络的SSID和最大连接数
  170. WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS wlanConnectionSetting;
  171. memset( &wlanConnectionSetting, 0, sizeof( WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS ) );
  172. string strSSIDInsert;
  173. cout << "设置热点名称:";
  174. cin >> strSSIDInsert;
  175. //CString strSSID = _T("chenzhen3");
  176. CString strSSID( strSSIDInsert.c_str( ) );
  177. // WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS中的SSID字段必须为ANSI类型,因此如果程序使用的是Unicode,则需要做转换。
  178. #ifdef _UNICODE
  179. WideCharToMultiByte( CP_ACP,
  180. 0,
  181. strSSID.GetBuffer( 0 ), // 保存SSID的CString类型
  182. strSSID.GetLength( ), // SSID字符串的长度
  183. (LPSTR)wlanConnectionSetting.hostedNetworkSSID.ucSSID,
  184. 32,
  185. NULL,
  186. NULL );
  187. #else
  188. memcpy(wlanConnectionSetting.hostedNetworkSSID.ucSSID, strSSID.GetBuffer(0), strlen(strSSID.GetBuffer(0)));
  189. #endif
  190. wlanConnectionSetting.hostedNetworkSSID.uSSIDLength = strlen( (const char*)wlanConnectionSetting.hostedNetworkSSID.ucSSID );
  191. wlanConnectionSetting.dwMaxNumberOfPeers = 100;
  192. dwReturnValue = WlanHostedNetworkSetProperty( hClient,
  193. wlan_hosted_network_opcode_connection_settings,
  194. sizeof( WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS ),
  195. &wlanConnectionSetting,
  196. &dwFailedReason,
  197. NULL );
  198. if (ERROR_SUCCESS != dwReturnValue)
  199. {
  200. cout << "WlanHostedNetworkSetProperty ret " << dwReturnValue << endl;
  201. return -1;
  202. }
  203. string strPass("");
  204. cout << "设置热点密码:";
  205. cin >> strPass;
  206. //CString strSecondaryKey = _T( "12345678" );
  207. CString strSecondaryKey( strPass.c_str( ) );
  208. UCHAR keyBuf[100] = { 0 };
  209. #ifdef _UNICODE
  210. WideCharToMultiByte( CP_ACP,
  211. 0,
  212. strSecondaryKey.GetBuffer( 0 ),
  213. strSecondaryKey.GetLength( ),
  214. (LPSTR)keyBuf,
  215. 100,
  216. NULL,
  217. NULL );
  218. #else
  219. memcpy( keyBuf, strSecondaryKey.GetBuffer( 0 ), strlen( strSecondaryKey.GetBuffer( 0 ) ) );
  220. #endif
  221. // 设置密码
  222. PVOID pvReserved = NULL;
  223. dwReturnValue = WlanHostedNetworkSetSecondaryKey( hClient,
  224. strlen( (const char*)keyBuf ) + 1,
  225. keyBuf,
  226. TRUE,
  227. FALSE,
  228. &dwFailedReason,
  229. pvReserved );
  230. if (ERROR_SUCCESS != dwReturnValue)
  231. {
  232. if ( ERROR_INVALID_PARAMETER == dwReturnValue )
  233. {
  234. if (hClient == NULL)
  235. {
  236. cout << "hClient == NULL" << endl;
  237. }
  238. if ( keyBuf == NULL )
  239. {
  240. cout << "keyBuf == NULL" << endl;
  241. }
  242. if (pvReserved != NULL)
  243. {
  244. cout << "pvReserved != NULL" << endl;
  245. }
  246. cout << dwReturnValue << "---"<< ERROR_INVALID_PARAMETER << endl;
  247. }
  248. return -1;
  249. }
  250. // 启用承载网络设置
  251. dwReturnValue = WlanHostedNetworkStartUsing( hClient, &dwFailedReason, NULL );
  252. if (ERROR_SUCCESS != dwReturnValue)
  253. {
  254. if (wlan_hosted_network_reason_interface_unavailable == dwFailedReason)
  255. {
  256. cout << "无线承载网络禁用" << endl;
  257. return 0;
  258. }
  259. cout << "未知失败" << endl;
  260. return -1;
  261. }
  262. // 停止Soft AP
  263. // dwReturnValue = WlanHostedNetworkStopUsing( hClient, &dwFailedReason, NULL );
  264. // if (ERROR_SUCCESS != dwReturnValue)
  265. // {
  266. // if (ERROR_INVALID_HANDLE == dwReturnValue || ERROR_INVALID_PARAMETER == dwReturnValue ||
  267. // ERROR_INVALID_STATE == dwReturnValue || ERROR_SERVICE_NOT_ACTIVE == dwReturnValue)
  268. // {
  269. // cout << dwReturnValue << endl;
  270. // }
  271. //
  272. // cout << dwReturnValue << endl;
  273. // return -1;
  274. // }
  275. // // 启用承载网络
  276. dwReturnValue = WlanHostedNetworkForceStart( hClient, &dwFailedReason, NULL );
  277. if (ERROR_SUCCESS != dwReturnValue)
  278. {
  279. cout << "ri" << endl;
  280. return -1;
  281. }
  282. system( "pause" );
  283. return 0;
  284. }




要用的可以直接拷贝,可以编译直接使用,当然这是个demo,看着不舒服的自己改改哈!

另:https://msdn.microsoft.com/en-us/library/windows/desktop/dd439506(v=vs.85).aspx  微软官方API地址!




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/252361
推荐阅读
相关标签
  

闽ICP备14008679号