wifi连接wpa_supplicant和wpa_cli的使用实例

一启动扫描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以及连接结果

五连接状态变化

已断开/已连接/正在连接/验证失败

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值