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以及连接结果

五连接状态变化

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在Android中调试WiFi,通常会使用wpa_supplicantwpa_cli。下面是一些总结和步骤: 1. 在设备上运行wpa_supplicant 在设备上运行wpa_supplicant,它是一个用于处理WiFi连接的后台进程。可以在终端中使用以下命令启动它: ``` wpa_supplicant -iwlan0 -Dwext -c /data/misc/wifi/wpa_supplicant.conf ``` 其中,`wlan0` 是设备的WiFi接口名称,`wext` 是驱动程序的类型,`/data/misc/wifi/wpa_supplicant.conf` 是包含WiFi配置信息的文件路径。 2. 使用wpa_cli进行WiFi连接 wpa_cli是一个命令行工具,用于与wpa_supplicant进行交互并管理WiFi连接。可以在终端中使用以下命令启动它: ``` wpa_cli -iwlan0 ``` 此时会进入wpa_cli交互模式。可以使用以下命令执行一些操作: - `scan` 扫描可用的WiFi网络 - `scan_results` 查看扫描结果 - `add_network` 添加一个新的WiFi网络配置 - `set_network` 设置WiFi网络配置 - `enable_network` 启用WiFi网络 - `disable_network` 禁用WiFi网络 - `status` 查看当前连接状态 例如,如果要连接到名为“mywifi”的WiFi网络,可以执行以下步骤: 1. 扫描可用的WiFi网络 ``` > scan ``` 2. 查看扫描结果 ``` > scan_results ``` 会显示可用的WiFi网络列表,找到名为“mywifi”的网络并记下其network id。 3. 添加一个新的WiFi网络配置 ``` > add_network ``` 会返回一个新的network id。 4. 设置WiFi网络配置 ``` > set_network <network_id> ssid "mywifi" > set_network <network_id> psk "mypassword" ``` 其中,`<network_id>` 是上一步中返回的新的network id,`mywifi` 是WiFi网络的SSID,`mypassword` 是WiFi网络的密码。 5. 启用WiFi网络 ``` > enable_network <network_id> ``` 6. 查看连接状态 ``` > status ``` 如果连接成功,会显示类似于以下内容的信息: ``` wpa_state=COMPLETED ip_address=192.168.1.100 ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值