<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    Linux C程序如何檢測WIFI無線USB網卡是否可用?

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    最新做一個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] == '\0') || (buff[1] == '\0'))
                    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 "\n");
    #else
                    fprintf(stderr, "Cannot parse " PROC_NET_WIRELESS "\n");
    #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] = '\0';

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

     

    RETURN_TYPE APP_WIFI_DetectDevice(void)
    {
        char command[50] = {'\0'};
        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\n");
            close(fd);
            return SYS_FAILED;
        }
        else if( 0!=(ioctl(fd, SIOCGIFFLAGS, (char*)&ifr)) )
        {
           printf("Cannot get Network Interface Flags!\n");
           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(">\n");
        close(fd);
        return  SYS_NOERROR;
    }

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全