Linux C获取 WIFI SSID

本文描述了一个项目中如何通过移植和使用iwlist源码来实现在代码内获取WiFi扫描的SSID以及相关的信号质量和信号级别。项目不仅包括了基本的SSID获取,还优化了结果,去除了空的和重复的SSID。代码示例展示了如何处理SIOCGIWAP和SIOCGIWESSID事件来提取SSID,以及处理IWEVQUAL事件来获取信号质量。
摘要由CSDN通过智能技术生成

最近有个项目,需要再代码里面实现获取wifi 扫描SSID;

查阅了大概得资料,后思路主要分两种:

1.通过system + 管道方式 +  iwlist执行,获取iwlist执行结果(网上大多数方式);

2.研究iwlist源码 + iwlist库函数获取;这里是采用这种方式;

另外此程序实现的功能还有:

1.获取保留SSID的信号质量;

2.获取保留SSID的信号级别:最大级别:5;

3.在iwlist基础上优化:

        a.去掉扫描的空的SSID;

        b.去掉重复的SSID;

一、移植iwlist

这里就不说了,可以搜一下,有很多相关资料;

二、获取SSID和相关的参数信息;

static inline void
print_scanning_my_ssid(
    struct iw_event *event, /* Extracted token */
    struct iwscan_state *state,
    struct iw_range *iw_range, /* Range info */
    int has_range)
{
    char buffer[128] = {0}; /* Temporary buffer */
    // int i = 0;

    // printf("event cmd:[0x%x]\r\n", event->cmd);
    /* Now, let's decode the event */
    switch (event->cmd)
    {

    /*SSID 个数*/
    case SIOCGIWAP:
        // printf("          Cell %02d - Address: %s\n", state->ap_num,
        //        iw_saether_ntop(&event->u.ap_addr, buffer));

        iw_saether_ntop(&event->u.ap_addr, buffer);

        state->ap_num++;

        g_wifi_kernel_info.wifi_ssid_num++;
        //printf("%s %s line %d  ssid number :[%d] \n", __FILE__, __FUNCTION__, __LINE__, g_wifi_kernel_info.wifi_ssid_num);
        
        //printf("%s %s line %d  mac buf :[%s] \n", __FILE__, __FUNCTION__, __LINE__, buffer);
        
        memcpy(g_wifi_kernel_info.wifi_MAC[g_wifi_kernel_info.wifi_ssid_num - 1], buffer, strlen(buffer));

        //printf("%s %s line %d  save ssid :[%s] \n", __FILE__, __FUNCTION__, __LINE__, g_wifi_kernel_info.wifi_ssid[g_wifi_kernel_info.wifi_ssid_num - 1]);

        
        break;

    /*处理扫描到的SSID*/
    case SIOCGIWESSID:
    {

        char essid[IW_ESSID_MAX_SIZE + 1];
        memset(essid, '\0', sizeof(essid));

        if ((event->u.essid.pointer) && (event->u.essid.length))
        {
            memcpy(essid, event->u.essid.pointer, event->u.essid.length);
            // memcpy(essid, event->u.essid.pointer, event->u.essid.length);

             memcpy(g_wifi_kernel_info.wifi_ssid[g_wifi_kernel_info.wifi_ssid_num - 1], essid, strlen(essid));
             //printf("%s %s line %d  save ssid :[%s] \n", __FILE__, __FUNCTION__, __LINE__, g_wifi_kernel_info.wifi_ssid[g_wifi_kernel_info.wifi_ssid_num - 1]);

        }

        #if 0
            if (event->u.essid.flags)
            {
                /* Does it have an ESSID index ? */
                if ((event->u.essid.flags & IW_ENCODE_INDEX) > 1)
                    printf("                    ESSID:\"%s\" [%d]\n", essid,
                        (event->u.essid.flags & IW_ENCODE_INDEX));
                else
                    printf("                    ESSID:\"%s\"\n", essid);
            }
            else
                printf("                    ESSID:off/any/hidden\n");
        #endif



        //my_wilist_deal_ssid_name(essid, strlen(essid));
    }
    break;


    /*信号质量*/
    case IWEVQUAL:
        iw_print_stats(buffer, sizeof(buffer),
                       &event->u.qual, iw_range, has_range);

        //printf("                    %s\n", buffer);

        break;

    default:
        //   printf("                    (Unknown Wireless Token 0x%04X)\n",
        //      event->cmd);
        break;

    } /* switch(event->cmd) */
}

运行结果:

wlan0     Link encap:Ethernet  HWaddr A0:ED:FB:EF:7E:01
my_iwlist.c my_iwlist_get_kernel_wifi_info line 866 第[0]次扫描完成
my_iwlist.c my_iwlist_get_kernel_wifi_info line 923  找到第一个SSID: >>> [xxxx]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951  找到新的SSID: >>> [ChinaNet-qrtq]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 866 第[1]次扫描完成
my_iwlist.c my_iwlist_get_kernel_wifi_info line 866 第[2]次扫描完成
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951  找到新的SSID: >>> [TP-LINK_AA12]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951  找到新的SSID: >>> [DIRECT-Wk-EPSON-L15150 Series]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951  找到新的SSID: >>> [TP-LINKxxxx]
>>>>>>>>>>>>>>一共获取到[5]个SSID: >>>>>>>>>>>
Cell [00]       MAC:[3C:6A:48:3F:D7:17] Quality:[2/5]   Signal:[-79 dBm]        Noise:[-96 dBm] ESSID:[XXXX]
Cell [01]       MAC:[84:74:60:90:04:A0] Quality:[0/5]   Signal:[-92 dBm]        Noise:[-96 dBm] ESSID:[ChinaNet-qrtq]
Cell [02]       MAC:[F4:6D:2F:BE:AA:12] Quality:[1/5]   Signal:[-87 dBm]        Noise:[-96 dBm] ESSID:[TP-LINK_AA12]
Cell [03]       MAC:[52:57:9C:4A:EA:16] Quality:[1/5]   Signal:[-85 dBm]        Noise:[-96 dBm] ESSID:[DIRECT-Wk-EPSON-L15150 Series]
Cell [04]       MAC:[EC:60:73:CC:6D:74] Quality:[2/5]   Signal:[-74 dBm]        Noise:[-96 dBm] ESSID:[TP-LINK_XXXX]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值