zoukankan      html  css  js  c++  java
  • 获取当前iphone设备的流量

    通过读取系统网络接口信息,获取当前iphone设备的流量相关信息,统计的是上次开机至今的流量信息.

    1.

    导入库:SystemConfiguration.framework

    2.

    加入头文件:

    #include <ifaddrs.h>

    #include <sys/socket.h>

    #include <net/if.h>

    3.

    代码实现:

    -(NSString *)bytesToAvaiUnit:(int)bytes {

      if(bytes < 1024) // B

         {
        return [NSString stringWithFormat:@"%dB", bytes];
      }

      else if(bytes >= 1024 && bytes < 1024 * 1024) // KB 

         {
        return [NSString stringWithFormat:@"%.1fKB", (double)bytes / 1024];
      }
      else if(bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024) // MB
      {
        return [NSString stringWithFormat:@"%.2fMB", (double)bytes / (1024 * 1024)];
      }
      else // GB
      {
        return [NSString stringWithFormat:@"%.3fGB", (double)bytes / (1024 * 1024 * 1024)];
      }
    }

    //
    -(void)checkNetworkflow {

      struct ifaddrs *ifa_list = 0, *ifa;

      if (getifaddrs(&ifa_list) == -1)
      {
      return;
      }

      uint32_t iBytes = 0;

      uint32_t oBytes = 0;

      uint32_t allFlow = 0;

      uint32_t wifiIBytes = 0;

      uint32_t wifiOBytes = 0;

      uint32_t wifiFlow = 0;

      uint32_t wwanIBytes = 0;

      uint32_t wwanOBytes = 0;

      uint32_t wwanFlow = 0;

      struct timeval time ;

      for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)
      {
        if (AF_LINK != ifa->ifa_addr->sa_family)
        continue;


        if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))
        continue;


        if (ifa->ifa_data == 0)
        continue;


        // Not a loopback device.
        // network flow

        if (strncmp(ifa->ifa_name, "lo", 2))

        {

        struct if_data *if_data = (struct if_data *)ifa->ifa_data;

        iBytes += if_data->ifi_ibytes;

        oBytes += if_data->ifi_obytes;

        allFlow = iBytes + oBytes;

        time = if_data->ifi_lastchange;

        // NSLog(@"1111===%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);


        }

         //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">WIFI流量统计功能</span>

         if (!strcmp(ifa->ifa_name, "en0"))

         {
          struct if_data *if_data = (struct if_data *)ifa->ifa_data;

          wifiIBytes += if_data->ifi_ibytes;

          wifiOBytes += if_data->ifi_obytes;

          wifiFlow = wifiIBytes + wifiOBytes;

        }

        //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">3G和GPRS流量统计</span>

        if (!strcmp(ifa->ifa_name, "pdp_ip0"))

        {

          struct if_data *if_data = (struct if_data *)ifa->ifa_data;

          wwanIBytes += if_data->ifi_ibytes;

          wwanOBytes += if_data->ifi_obytes;

          wwanFlow = wwanIBytes + wwanOBytes;

          //NSLog(@"111122===%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);

        }

      }

      freeifaddrs(ifa_list);

      NSString *changeTime=[NSString stringWithFormat:@"%s",ctime(&time)];
      NSLog(@"changeTime==%@",changeTime);


      NSString *receivedBytes= [self bytesToAvaiUnit:iBytes];
      NSLog(@"receivedBytes==%@",receivedBytes);


      NSString *sentBytes = [self bytesToAvaiUnit:oBytes];
      NSLog(@"sentBytes==%@",sentBytes);


      NSString *networkFlow = [self bytesToAvaiUnit:allFlow];
      NSLog(@"networkFlow==%@",networkFlow);

      NSString *wifiReceived = [self bytesToAvaiUnit:wifiIBytes];
      NSLog(@"wifiReceived==%@",wifiReceived);


      NSString *wifiSent = [self bytesToAvaiUnit: wifiOBytes];
      NSLog(@"wifiSent==%@",wifiSent);

      NSString *wifiBytes = [self bytesToAvaiUnit:wifiFlow];
      NSLog(@"wifiBytes==%@",wifiBytes);


      NSString *wwanReceived = [self bytesToAvaiUnit:wwanIBytes];
      NSLog(@"wwanReceived==%@",wwanReceived);


      NSString *wwanSent = [self bytesToAvaiUnit:wwanOBytes];
      NSLog(@"wwanSent==%@",wwanSent);


      NSString *wwanBytes = [self bytesToAvaiUnit:wwanFlow];
      NSLog(@"wwanBytes==%@",wwanBytes);
    }

    然后在你想要知道的结果的地方调用:

      [self checkNetworkflow];

    控制台输出结果如下:

    1. 2013-03-30 23:45:33.565 Reachability[2993:707] changeTime==Sat Mar 30 09:52:09 2013
    2. 2013-03-30 23:45:33.567 Reachability[2993:707] receivedBytes==62.73MB
    3. 2013-03-30 23:45:33.569 Reachability[2993:707] sentBytes==8.22MB
    4. 2013-03-30 23:45:33.571 Reachability[2993:707] networkFlow==70.94MB
    5. 2013-03-30 23:45:33.573 Reachability[2993:707] wifiReceived==55.40MB
    6. 2013-03-30 23:45:33.575 Reachability[2993:707] wifiSent==5.41MB
    7. 2013-03-30 23:45:33.577 Reachability[2993:707] wifiBytes==60.81MB
    8. 2013-03-30 23:45:33.579 Reachability[2993:707] wwanReceived==7.33MB
    9. 2013-03-30 23:45:33.581 Reachability[2993:707] wwanSent==2.81MB
    10. 2013-03-30 23:45:33.583 Reachability[2993:707] wwanBytes==10.14MB

     

    当然你也可以只统计3G/GPRS流量统计 或者 WIFI流量统计。

     3G/GPRS流量统计

    -(int) getGprs3GFlowIOBytes
    {
        struct ifaddrs *ifa_list = 0, *ifa;
        if (getifaddrs(&ifa_list) == -1)
        {
            return 0;
        }
     
        uint32_t iBytes = 0;
        uint32_t oBytes = 0;
     
        for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)
        {
            if (AF_LINK != ifa->ifa_addr->sa_family)
                continue;
     
            if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))
                continue;
     
            if (ifa->ifa_data == 0)
                continue;
     
            if (!strcmp(ifa->ifa_name, "pdp_ip0"))
            {
                struct if_data *if_data = (struct if_data *)ifa->ifa_data;
     
                iBytes += if_data->ifi_ibytes;
                oBytes += if_data->ifi_obytes;
    			NSLog(@"%s :iBytes is %d, oBytes is %d",
    				  ifa->ifa_name, iBytes, oBytes);
            }
        }
        freeifaddrs(ifa_list);
     
    	return iBytes + oBytes;
    }

    返回的结果为byte

    WIFI流量统计功能

    - (long long int)getInterfaceBytes
    {
        struct ifaddrs *ifa_list = 0, *ifa;
        if (getifaddrs(&ifa_list) == -1)
        {
            return 0;
        }
     
        uint32_t iBytes = 0;
        uint32_t oBytes = 0;
     
        for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)
        {
            if (AF_LINK != ifa->ifa_addr->sa_family)
                continue;
     
            if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))
                continue;
     
            if (ifa->ifa_data == 0)
                continue;
     
            /* Not a loopback device. */
            if (strncmp(ifa->ifa_name, "lo", 2))
            {
                struct if_data *if_data = (struct if_data *)ifa->ifa_data;
     
                iBytes += if_data->ifi_ibytes;
                oBytes += if_data->ifi_obytes;
     
    //            NSLog(@"%s :iBytes is %d, oBytes is %d",
    //                  ifa->ifa_name, iBytes, oBytes);
            }
        }
        freeifaddrs(ifa_list);
     
        return iBytes+oBytes;
    }

     转自:http://blog.csdn.net/jinglijun/article/details/8741554

  • 相关阅读:
    java.lang.NoSuchMethodError
    asm相关内容想下载(包括 jar 包)
    Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    交通测速方式
    卡口和电子警察的区别
    Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable
    在window上安装mysql
  • 原文地址:https://www.cnblogs.com/jiangshiyong/p/3054770.html
Copyright © 2011-2022 走看看