您的位置:首页 > 其它

wifi连接wpa_supplicant和wpa_cli的使用实例

2017-07-25 14:22 471 查看

一启动扫描wifi热点

#include <stdio.h>
#include <string.h>
#include "wpa_cli.h"

int main(){
printf("%s(%s:%d)......\n", __FILE__, __FUNCTION__, __LINE__);
int ret = wpa_cli_start();
if(ret){
printf("wpa_cli_start fail\n");
return 0;
}
char szContent[4][32];
char* pCmd[1] = {szContent[0]};
// 启动热点扫描
strcpy(pCmd[0], "scan");
char buf[2048];
ret = wpa_cli_cmd_function(1, pCmd, buf);
if(ret || (strncmp(buf, "FAIL", 4) == 0)){
printf("wap_cli_function scan fail\n");
return 0;
}
while(1);
return 0;
}


输出

Selected interface ‘wlan0’

OK

扫描成功;

二输出热点扫描结果

#include <stdio.h>
#include <string.h>
#include "wpa_cli.h"

int main(){
printf("%s(%s:%d)......\n", __FILE__, __FUNCTION__, __LINE__);
int ret = wpa_cli_start();
if(ret)
{
printf("wpa_cli_start fail\r\n");
return 0;
}
char szContent[4][32];
char* pCmd[1] = {szContent[0]};
// 启动热点扫描
strcpy(pCmd[0], "scan");
char buf[2048];
ret = wpa_cli_cmd_function(1, pCmd, buf);
if(ret || (strncmp(buf, "FAIL", 4) == 0)){
printf("wap_cli_function scan fail\r\n");
return 0;
}
// 添加输出扫描热点 这里的热点是以字符串的形式保存在buf里
char* pCmd_scan_result[4];
for(int i = 0; i < 4; i++){
pCmd_scan_result[i] = szContent[i];
}
strcpy(pCmd_scan_result[0], "scan_result");
ret = wpa_cli_cmd_function(1, pCmd_scan_result, buf);
printf("===========\n");
printf("\n%s\n", buf);
printf("===========\n");
while(1);
return 0;
}


三解析输出的热点字符串

是的,就是直接解析了字符串,暂时没有找到动态库中解析好的结构体。

所以这里把字符串解析到自定义的结构体当中

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "wpa_cli.h"

#define MAX_SSID_NUMBER     64

typedef struct{
char bssid[32];
char freq[6];
char level[6];
char flags[64];
char ssid[32];
}wifi_scan_item;

typedef struct{
int count;
wifi_scan_item *pitem;
}wifi_info;

static wifi_info g_info;

int main(){
printf("%s(%s:%d)......\n", __FILE__, __FUNCTION__, __LINE__);
int ret = wpa_cli_start();
if(ret)
{
printf("wpa_cli_start fail\r\n");
return 0;
}
char szContent[4][32];
char* pCmd[1] = {szContent[0]};
// 启动热点扫描
strcpy(pCmd[0], "scan");
char buf[2048];
ret = wpa_cli_cmd_function(1, pCmd, buf);
if(ret || (strncmp(buf, "FAIL", 4) == 0)){
printf("wap_cli_function scan fail\r\n");
return 0;
}
printf("===========\n");
printf("%s\n", buf);
printf("===========\n");
// 添加输出扫描热点 这里的热点是以字符串的形式保存在buf里
char* pCmd_scan_result[4];
for(int i = 0; i < 4; i++){
pCmd_scan_result[i] = szContent[i];
}
strcpy(pCmd_scan_result[0], "scan_result");
ret = wpa_cli_cmd_function(1, pCmd_scan_result, buf);
// 解析字符串
g_info.count = 0;
g_info.pitem = (wifi_scan_item *)malloc(sizeof(wifi_scan_item) * MAX_SSID_NUMBER);
wifi_scan_item* pInfo = g_info.pitem;
char* ptr = strstr(buf, "bssid / frequency / signal level / flags / ssid\n");
if(!ptr){
printf("(%d)wifi_get_ssid_info fail\r\n", __LINE__);
free(pInfo);
return 0;
}
ptr += strlen("bssid / frequency / signal level / flags / ssid\n");
if(*ptr == 0){
printf("(%d)wifi_get_ssid_info ssid 0\r\n", __LINE__);
free(pInfo);
return 0;
}
int index = 0;
char* ptr_n = NULL;
char* ptr_t = NULL;
while(1){
ptr_n = strchr(ptr, '\n');
if(!ptr_n){
printf("(%d)failed\n", __LINE__);
break;
}

for(int i = 0; i < 4; i++){
ptr_t = strchr(ptr, '\t');
if(!ptr_t){
break;
}
*ptr_t = 0;
switch(i){
case 0:
strcpy(pInfo[index].bssid, ptr);
break;
case 1:
strcpy(pInfo[index].freq, ptr);
break;
case 2:
strcpy(pInfo[index].level, ptr);
break;
case 3:
strcpy(pInfo[index].flags, ptr);
break;
}
ptr = ptr_t + 1;
}

*ptr_n = 0;
strcpy(pInfo[index].ssid, ptr);
ptr = ptr_n + 1;
index++;
}
for(int i=0; i<index; i++){
printf("[%02d]%s, %s, %s, %45s, %20s\n",
i,
pInfo[i].bssid,
pInfo[i].freq,
pInfo[i].level,
pInfo[i].flags,
pInfo[i].ssid);
}
while(1);
return 0;
}


四连接当前wifi以及连接结果

五连接状态变化

已断开/已连接/正在连接/验证失败
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: