c语言:读取文件中的指定内容

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013485792/article/details/52303033

      项目中要求从wifi的状态文件中提取出rssi字段的值,还有一个前提条件:必须与hwaddr(手机的MAC地址)一一对应。

wifi状态文件sta_info如下:

# cat /proc/wlan0-vap0/sta_info
-- STA info table -- (active: 1)
 1: stat_info...
    state: 405
    AuthAlgrthm: 0
    ieee8021x_ctrlport: 0
    hwaddr: c06394e1468b
    bssrateset: 82848b960c1218243048606c
    aid: 1
    tx_bytes: 369918
    rx_bytes: 62005
    tx_pkts: 333
    rx_pkts: 901
    tx_fail: 0
    tx_avarage:    0
    rx_avarage:    0
    dz_queue_len: 0
    rssi: 62 (62 56)
    expired_time: 294
    sleep: yes
    current_tx_rate: MCS7 65
    current_rx_rate: MCS4 39
    rx_bw: 20M
    tx_bw: 20M
    hp_level: 0
    QoS Enable: 1
    APSD bitmap: 0x0
    tx_ra_bitmap: 0x000f0000
    Chip Vendor: Broadcom
    link_time: 4 min 44 sec 
    ht_cap: 0c181bff00000000000000000000000000000000000000000000
    11n MIMO ps: no limit
    Is_8K_AMSDU: 1
    amsdu_level: 7895
    diffAmpduSz: 0xffffffff
    aggre mthd: AMPDU
    ht beamformee: N
    ht beamformer: N
    Activate Tx beamforming : N
    ipmc_num: 1
    mcmac: 01005e0000fb
    bSleep: 01
    bDrop: 00
    FW bDrop: 00
    ht_ie: none
    wireless mode: BGN
      我写了一个get_wifi_signal_intensity(const char* mac,char *intenstiy)函数,传入mac地址,输出信号强度值intenstiy,从而实现需求。get_wifi_signal_intensity函数实现如下:

#include "stdio.h"
#include "stdlib.h"
#include "ctype.h"


static void get_wifi_signal_intensity(const char* mac,char *intenstiy)
{
    char dstmac[32] = {0};
    int i = 0;
    int found_mac = 0;
    int rssi = 0, dBm = 0;
    FILE * fp = NULL;
    char filename[64] = {0};
    char line[128] = {0};
	
    sprintf(filename,"/proc/wlan0-vap0/sta_info");   
	
    if ( mac && (fp = fopen(filename, "r")) )
    {
    	sscanf(mac,"%2s-%2s-%2s-%2s-%2s-%2s",dstmac,dstmac+2,dstmac+4,dstmac+6,dstmac+8,dstmac+10);
	for(i=0;i<strlen(dstmac);i++)
	{
	    dstmac[i] = tolower(dstmac[i]);
	}
		
        while(!feof(fp))
        {
            if (NULL == fgets (line, sizeof (line), fp))
            {
                /* Error or EOF */
                break;
            }

            if ( found_mac )
            {
                if( strstr(line,"rssi:") )
                {
                    sscanf(line, "%*s %d", &rssi);
                    break;
                }
                else
                {
                    continue;
                }
            }
            if( strstr(line,"hwaddr:") && strstr(line,dstmac) )
            {
                found_mac = 1;
            }
        }

        fclose(fp);
    }

    if (rssi <= 0)
        dBm = -100;
    else if (rssi >= 100)
        dBm = -50;
    else
        dBm = (rssi / 2) - 100;

    sprintf(intenstiy, "%d", dBm);
	
    printf("MAC is %s,dstmac is %s,rssi is %d,intenstiy is %d",mac,dstmac,rssi,intenstiy);
}

运行结果:

调用函数:get_wifi_signal_intensity("C0-63-94-E1-46-8B",intenstiy)
打印结果:MAC is C0-63-94-E1-46-8B,dstmac is c06394e1468b,rssi is 62,intenstiy is -69

函数实现的功能:
    输入一个MAC地址,格式为C0-63-94-E1-46-8B:1)函数中会去掉MAC中‘-’并将字母全转为小写;2)用转换得到的dstmac 逐行匹配文件内容,直到完全匹配上;3)开始往下在文件中查找rssi字段,并读出来;4)将rssi字段解析出来,只需字段中的数字部分;5)将rssi按对应关系转换成wifi信号强度值intenstiy。

展开阅读全文

没有更多推荐了,返回首页