WEC7,使用连接管理器api连接wifi [英] WEC7, connect wifi using connection manager api

查看:144
本文介绍了WEC7,使用连接管理器api连接wifi的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,


我们的操作系统(WEC7)包含连接管理器,因此我们必须使用连接管理器api连接到wifi。重启后,我们的系统应自动重新连接到接入点。


使用屏幕连接管理器建立连接后,我使用 CmGetConnectionConfig(SSID)检索配置,pConfig和& cbSize)
并将配置存储在一个文件中(大约2千字节,其中大部分包含xml信息)。




重新启动后,我使用此文件填充Config结构,如下代码所示:


#define SSID L" Connectify-me"


< pre class ="prettyprint"> CM_CONNECTION_DETAILS * pDetails = NULL;
CM_SESSION_HANDLE myhandle = CmCreateSession();
CM_CONNECTION_HANDLE hConnection = NULL;
CM_RESULT结果;
CM_CONNECTION_CONFIG * pConfig = NULL;
DWORD cbConfigSize = 10;

unsigned char * ptr =(unsigned char *)pConfig;
FILE * fp = _wfopen(L" \\flashdisk \\wifi.txt",L" rb");
if(fp){
fseek(fp,0,SEEK_END);
cbConfigSize = ftell(fp);
fseek(fp,0,SEEK_SET);
pConfig =(CM_CONNECTION_CONFIG *)LocalAlloc(0,cbConfigSize);
int numread = 0;
if(pConfig)
numread = fread(pConfig,1,cbConfigSize,fp);
fclose(fp);
}

if(pConfig){
result = CmAddConnectionConfig(SSID,pConfig,cbConfigSize);
LocalFree(pConfig);
}

睡眠(5000);

for(result = CmGetFirstCandidateConnection(myhandle,NULL,CMSO_DEFAULT,& hConnection); result == CMRE_SUCCESS;
result = CmGetNextCandidateConnection(myhandle,& hConnection)){
DWORD dwError = GetConnectionDetailsByHandle(hConnection,& pDetails);
if(dwError == 0){
if(memcmp(& pDetails-> Type,& CM_CSP_WIFI_TYPE,sizeof(CM_CONNECTION_TYPE))== 0){
if(wcscmp( pDetails-> szName,SSID)== 0){
result = CmAcquireConnection(hConnection);
int aa = 0;
}
}
}
}
CmCloseSession(myhandle);
}


 DWORD GetConnectionDetailsByHandle(CM_CONNECTION_HANDLE hConnection,CM_CONNECTION_DETAILS ** ppDetails)
{
DWORD dwError = ERROR_SUCCESS;
CM_RESULT结果= CMRE_INSUFFICIENT_BUFFER;
CM_CONNECTION_DETAILS * pDetails = NULL;
DWORD dwDetailSize = 255;
//获取连接详细信息。
for(int i = 0; i< MAX_TRY_COUNT_FOR_INSUFFICIENT_BUFFER&& result == CMRE_INSUFFICIENT_BUFFER; i ++){
LocalFree(pDetails);
pDetails =(CM_CONNECTION_DETAILS *)LocalAlloc(0,dwDetailSize);
if(pDetails)
result = CmGetConnectionDetailsByHandle(hConnection,pDetails,& dwDetailSize);
}
* ppDetails = pDetails;
pDetails = NULL;
LocalFree(pDetails);
return dwError;
}

  CmAddConnectionConfig(SSID,pConfig,cbConfigSize)返回CMRE_SUCCESS,但CmAcquireConnection (hConnection)返回CMRE_CONNECTION_ACQUIRE_FAILED。


在wifi连接对话框中的屏幕上我看到FAILED与ssid关联。


当我查看注册表HKLM时\Comm\Connmgr \Settings \Connections \ sid我看到字段数据0比使用屏幕连接对话框建立连接时要大得多(3088与2280相比)。


出了什么问题?


还有另一种方法可以自动重新连接到接入点吗?


欢迎任何想法!


谢谢!

解决方案

你好,


经过多次试验后,我想我已找到问题的原因:


 在xml-part中我得到的配置 CmGetConnectionDetailsByHandle密码是受保护的


    < keyType> passPhrase< / keyType>

    < protected> true< / protected>


我认为CmAcquireConnection确实不知道如何处理受保护的密钥。


Hello,

our OS (WEC7) contains connection manager so we have to use connection manager api to make connection to wifi. Our system should reconnect automatically to an access point after reboot.

After establishing a connection using onscreen connection manager I retrieve configuration with CmGetConnectionConfig(SSID, pConfig, &cbSize) and store the configuration in a file (it is about 2 kilobytes, most of them contains xml-information).


After reboot I use this file to populate a Config struct, according following code:

#define SSID L"Connectify-me"

    CM_CONNECTION_DETAILS *pDetails = NULL;
    CM_SESSION_HANDLE myhandle = CmCreateSession(); 
    CM_CONNECTION_HANDLE hConnection = NULL;
    CM_RESULT result;
    CM_CONNECTION_CONFIG* pConfig = NULL;
    DWORD cbConfigSize = 10;

    unsigned char * ptr = (unsigned char *)pConfig;
    FILE * fp = _wfopen(L"\\flashdisk\\wifi.txt",L"rb");
    if (fp) {
      fseek(fp,0,SEEK_END);
      cbConfigSize = ftell(fp);
      fseek(fp,0,SEEK_SET);
      pConfig = (CM_CONNECTION_CONFIG*)LocalAlloc(0, cbConfigSize);
      int numread = 0;
      if (pConfig) 
         numread = fread(pConfig,1,cbConfigSize,fp);
      fclose(fp);
    }
 
    if (pConfig) {      
      result = CmAddConnectionConfig(SSID,pConfig,cbConfigSize);
      LocalFree(pConfig);
    }
 
    Sleep(5000);

    for (result = CmGetFirstCandidateConnection(myhandle, NULL, CMSO_DEFAULT, &hConnection);result==CMRE_SUCCESS;
              result = CmGetNextCandidateConnection(myhandle, &hConnection)) {
      DWORD dwError = GetConnectionDetailsByHandle(hConnection, &pDetails);
      if (dwError==0) {
        if (memcmp(&pDetails->Type, &CM_CSP_WIFI_TYPE, sizeof(CM_CONNECTION_TYPE)) == 0) {
          if (wcscmp(pDetails->szName,SSID) == 0) {
            result = CmAcquireConnection(hConnection);
            int aa = 0;
          }
        }
      }
    }
    CmCloseSession(myhandle);
  }

DWORD GetConnectionDetailsByHandle(CM_CONNECTION_HANDLE hConnection, CM_CONNECTION_DETAILS** ppDetails)
{
    DWORD dwError = ERROR_SUCCESS;
    CM_RESULT result = CMRE_INSUFFICIENT_BUFFER;
    CM_CONNECTION_DETAILS* pDetails = NULL;
    DWORD dwDetailSize = 255;
    // Get the connection details.
    for (int i = 0; i < MAX_TRY_COUNT_FOR_INSUFFICIENT_BUFFER && result == CMRE_INSUFFICIENT_BUFFER; i++) {
      LocalFree(pDetails);
      pDetails = (CM_CONNECTION_DETAILS *)LocalAlloc(0, dwDetailSize);
      if (pDetails)
        result = CmGetConnectionDetailsByHandle(hConnection,pDetails,&dwDetailSize);
    }
    *ppDetails = pDetails;
    pDetails = NULL;
    LocalFree(pDetails);
    return dwError;
}

 CmAddConnectionConfig(SSID,pConfig,cbConfigSize) returns CMRE_SUCCESS, but CmAcquireConnection(hConnection) returns CMRE_CONNECTION_ACQUIRE_FAILED.

On screen in wifi connect dialog Ii see FAILED TO ASSOCIATE WITH ssid.

When I have a look into registry HKLM\Comm\Connmgr\Settings\Connections\ssid I see that field Data 0 is much larger (3088 compared to 2280) than it is when the connection is establised using on screen connection dialog.

What is going wrong ?

Is there another way for automatic reconnection to an access point ?

Any ideas welcome !

Thank you !

解决方案

Hello,

after many trials I think I have found the reason for the problem:

 in the xml-part of the configuration that I get with CmGetConnectionDetailsByHandle the password is protected

    <keyType>passPhrase</keyType>
    <protected>true</protected>

I think that CmAcquireConnection does not know how to deal with protected keys.


这篇关于WEC7,使用连接管理器api连接wifi的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆