• Linux C程序如何检测WIFI无线USB网卡是否可用?


    最新做一个WIFI应用项目。如何检测WIFI USB设备是否插上了呢?特此共享。

          第一种方法,采用读取文件的方式。在linux下,任何一种设备都可看成文件。通过分析相关文件信息,可得知WIFI设备是否存在;代码示例如下:

       

    static void WIFI_Enum_Device(void)
    {
        char  buff[1024];
        FILE * fh;

        /* Check if /proc/net/wireless is available */
        fh = fopen(PROC_NET_WIRELESS, "r");


        if(fh != NULL)
        {
            /* Success : use data from /proc/net/wireless */

            /* Eat 2 lines of header */
            fgets(buff, sizeof(buff), fh);
            fgets(buff, sizeof(buff), fh);

            /* Read each device line */
            while(fgets(buff, sizeof(buff), fh))
            {
                char name[IFNAMSIZ + 1];
                char *s;

                /* Skip empty or almost empty lines. It seems that in some
                * cases fgets return a line with only a newline. */
                if((buff[0] == '') || (buff[1] == ''))
                    continue;

                /* Extract interface name */
                s = WIFI_Get_DeviceName(name, sizeof(name), buff);

                if(!s)
                {
                /* Failed to parse, complain and continue */
    #ifndef IW_RESTRIC_ENUM
                    fprintf(stderr, "Cannot parse " PROC_NET_DEV " ");
    #else
                    fprintf(stderr, "Cannot parse " PROC_NET_WIRELESS " ");
    #endif
                }
                else
                    /* Got it, save the name about this interface */

                {//we always use the first detected device when doing first time detecting
                    if(s_DeviceCount == 0)
                    {
                        if(strcmp(s_Deviceinfo.DeviceName,name))
                        {
                            memset((char *)&s_Deviceinfo, 0, sizeof(DeviceInfo_t));

                            memcpy(s_Deviceinfo.DeviceName,name,IFNAMSIZ);
                        }
                        if(strlen(s_SavedDevice) == 0)//this is the first detected device when doing first time detecting, we save it
                            memcpy(s_SavedDevice,name,IFNAMSIZ);
                    }
                    else
                    {//there is more than one device, we should use the first detected
                        if(!strcmp(s_SavedDevice,name))
                        {
                            memset((char *)&s_Deviceinfo, 0, sizeof(DeviceInfo_t));

                            memcpy(s_Deviceinfo.DeviceName,name,IFNAMSIZ);
                        }
                    }
                    s_DeviceCount++;
                }
            }

            fclose(fh);
        }
       
    }

    static char* WIFI_Get_DeviceName(char * name, /* Where to store the name */
           int nsize, /* Size of name buffer */
           char * buf) /* Current position in buffer */
    {
        char * end;

        /* Skip leading spaces */
        while(isspace(*buf))
            buf++;

    #ifndef IW_RESTRIC_ENUM
        /* Get name up to the last ':'. Aliases may contain ':' in them,
        * but the last one should be the separator */
        end = strrchr(buf, ':');
    #else
        /* Get name up to ": "
        * Note : we compare to ": " to make sure to process aliased interfaces
        * properly. Doesn't work on /proc/net/dev, because it doesn't guarantee
        * a ' ' after the ':'*/
        end = strstr(buf, ": ");
    #endif

        /* Not found ??? To big ??? */
        if((end == NULL) || (((end - buf) + 1) > nsize))
            return(NULL);

        /* Copy */
        memcpy(name, buf, (end - buf));
        name[end - buf] = '';

        /* Return value currently unused, just make sure it's non-NULL */
        return(end);
    }

    RETURN_TYPE APP_WIFI_DetectDevice(void)
    {
        char command[50] = {''};
        s_DeviceCount = 0;  //reset count
        WIFI_Enum_Device();
        s_LastDeviceCount = s_DeviceCount;
        if(s_DeviceCount > 0)
        {
            sprintf(command,"ifconfig %s up",s_Deviceinfo.DeviceName);
            system(command);  //boot up the device firstly
            return SYS_NOERROR;
        }
        else
            return SYS_FAILED;        
    }

          第二种方法,利用linux ioctl函数读取I/O接口的相关信息。

    /*****************************************************************************
    *  Name        : trid_char * APP_NetLink_GetIFFLAGS(char *NetDev )
    *  Description : Get net interface IFFLAGS
    *  Params      : NetDev
    *  Returns     : the string of the NetDev
    *  Author/date : Danny.Hu /2011.11.16
    *****************************************************************************/
    RETURN_TYPE APP_NetLink_GetIFFlags( trid_char *NetDev )
    {
        int fd = -1;
        int InterfaceFlags;
        struct ifreq ifr;
        memset(&ifr, 0, sizeof(ifr));
        strcpy(ifr.ifr_name, NetDev);
        fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (fd < 0) 
        {
            printf("Cannot get control socket ");
            close(fd);
            return SYS_FAILED;
        }
        else if( 0!=(ioctl(fd, SIOCGIFFLAGS, (char*)&ifr)) )
        {
           printf("Cannot get Network Interface Flags! ");
           close(fd);
           return SYS_FAILED;
        }
        
        InterfaceFlags = ifr.ifr_flags; 
        
        printf("<");
        if ( InterfaceFlags & IFF_UP)                        printf("Network %s is UP, ", NetDev);
        if ( InterfaceFlags & IFF_BROADCAST)     printf("Network %s is BCAST, ", NetDev);
        if ( InterfaceFlags & IFF_MULTICAST)      printf("Network %s is MCAST, ", NetDev);
        if ( InterfaceFlags & IFF_LOOPBACK)       printf("Network %s is LOOP, ", NetDev);
        if ( InterfaceFlags & IFF_POINTOPOINT)   printf("Network %s is P2P, ", NetDev);
        printf("> ");
        close(fd);
        return  SYS_NOERROR;
    }

  • 相关阅读:
    常用的知识点
    2021年度“新时代好少年”
    音频格式TDM
    DTS
    学习总结之EXTJS相关了解和问题解决篇
    java中extends和implements的区别
    开发
    程序员练级(转自酷壳)
    优秀程序员无它善假于物也
    EXTJS开发过程遇到的一些问题的小结(转自麦田守望者)
  • 原文地址:https://www.cnblogs.com/lidabo/p/5336885.html
Copyright © 2020-2023  润新知