• iOS 直播-网速监控


    iOS 直播-网速监控

    CXNetworkSpeed.h

     1 //
     2 //  CXNetworkSpeed.h
     3 //  CXNetworkSpeedDemo
     4 //
     5 //  Created by xubaoaichiyu on 16/08/16.
     6 //  Copyright © 2016年 xubaoaichiyu All rights reserved.
     7 //
     8 
     9 
    10 
    11 #import <Foundation/Foundation.h>
    12 
    13 
    14 @interface CXNetworkSpeed : NSObject
    15 
    16 @property (nonatomic, copy, readonly) NSString * receivedNetworkSpeed;
    17 
    18 @property (nonatomic, copy, readonly) NSString * sendNetworkSpeed;
    19 
    20 + (instancetype)shareNetworkSpeed;
    21 
    22 - (void)startMonitoringNetworkSpeed;
    23 
    24 - (void)stopMonitoringNetworkSpeed;
    25 
    26 @end
    27 
    28 
    29 
    30 /**
    31  *  @{@"received":@"100kB/s"}
    32  */
    33 FOUNDATION_EXTERN NSString *const kNetworkReceivedSpeedNotification;
    34 
    35 /**
    36  *  @{@"send":@"100kB/s"}
    37  */
    38 FOUNDATION_EXTERN NSString *const kNetworkSendSpeedNotification;

    CXNetworkSpeed.m

      1 //
      2 //  CXNetworkSpeed.m
      3 //  CXNetworkSpeedDemo
      4 //
      5 //  Created by xubaoaichiyu on 16/08/16.
      6 //  Copyright © 2016年 xubaoaichiyu All rights reserved.
      7 //
      8 
      9 #import "CXNetworkSpeed.h"
     10 #include <arpa/inet.h>
     11 #include <net/if.h>
     12 #include <ifaddrs.h>
     13 #include <net/if_dl.h>
     14 
     15 /**
     16  *  @{@"received":@"100kB/s"}
     17  */
     18 NSString *const kNetworkReceivedSpeedNotification = @"kNetworkReceivedSpeedNotification";
     19 
     20 /**
     21  *  @{@"send":@"100kB/s"}
     22  */
     23 NSString *const kNetworkSendSpeedNotification = @"kNetworkSendSpeedNotification";
     24 
     25 @interface CXNetworkSpeed ()
     26 {
     27     uint32_t _iBytes;
     28     uint32_t _oBytes;
     29     uint32_t _allFlow;
     30     uint32_t _wifiIBytes;
     31     uint32_t _wifiOBytes;
     32     uint32_t _wifiFlow;
     33     uint32_t _wwanIBytes;
     34     uint32_t _wwanOBytes;
     35     uint32_t _wwanFlow;
     36 }
     37 
     38 @property (nonatomic, copy) NSString * receivedNetworkSpeed;
     39 
     40 @property (nonatomic, copy) NSString * sendNetworkSpeed;
     41 
     42 @property (nonatomic, strong) NSTimer * timer;
     43 
     44 @end
     45 
     46 @implementation CXNetworkSpeed
     47 
     48 static CXNetworkSpeed * instance = nil;
     49 
     50 + (instancetype)shareNetworkSpeed{
     51     if(instance == nil){
     52     static dispatch_once_t onceToken ;
     53     dispatch_once(&onceToken, ^{
     54         instance = [[self alloc] init] ;
     55     }) ;
     56     }
     57     return instance;
     58     
     59 }
     60 
     61 + (instancetype)allocWithZone:(struct _NSZone *)zone{
     62     
     63     if(instance == nil){
     64     static dispatch_once_t onceToken;
     65     dispatch_once(&onceToken, ^{
     66         
     67         instance = [super allocWithZone:zone];
     68         
     69     });
     70     }
     71     return instance;
     72 }
     73 
     74 -(instancetype)init{
     75     
     76     static dispatch_once_t onceToken;
     77     dispatch_once(&onceToken, ^{
     78         instance = [super init];
     79         _iBytes = _oBytes = _allFlow = _wifiIBytes = _wifiOBytes = _wifiFlow = _wwanIBytes = _wwanOBytes = _wwanFlow = 0;
     80     });
     81     return instance;
     82     
     83 }
     84 
     85 - (void)startMonitoringNetworkSpeed{
     86     if(_timer)
     87         [self stopMonitoringNetworkSpeed];
     88     _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(netSpeedNotification) userInfo:nil repeats:YES];
     89 }
     90 
     91 - (void)stopMonitoringNetworkSpeed{
     92     if ([_timer isValid]) {
     93         [_timer invalidate];
     94     }
     95 }
     96 
     97 - (void)netSpeedNotification{
     98     [self checkNetworkflow];
     99 }
    100 
    101 -(NSString *)bytesToAvaiUnit:(int)bytes
    102 {
    103     if(bytes < 10)
    104     {
    105         return [NSString stringWithFormat:@"0KB"];
    106     }
    107     else if(bytes >= 10 && bytes < 1024 * 1024) // KB
    108     {
    109         return [NSString stringWithFormat:@"%.1fKB", (double)bytes / 1024];
    110     }
    111     else if(bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024)   // MB
    112     {
    113         return [NSString stringWithFormat:@"%.1fMB", (double)bytes / (1024 * 1024)];
    114     }
    115     else    // GB
    116     {
    117         return [NSString stringWithFormat:@"%.1fGB", (double)bytes / (1024 * 1024 * 1024)];
    118     }
    119 }
    120 
    121 
    122 -(void)checkNetworkflow
    123 {
    124     struct ifaddrs *ifa_list = 0, *ifa;
    125     if (getifaddrs(&ifa_list) == -1)
    126     {
    127         return ;
    128     }
    129     
    130     uint32_t iBytes     = 0;
    131     uint32_t oBytes     = 0;
    132     uint32_t allFlow    = 0;
    133     uint32_t wifiIBytes = 0;
    134     uint32_t wifiOBytes = 0;
    135     uint32_t wifiFlow   = 0;
    136     uint32_t wwanIBytes = 0;
    137     uint32_t wwanOBytes = 0;
    138     uint32_t wwanFlow   = 0;
    139 //    struct timeval32 time;
    140     
    141     for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)
    142     {
    143         if (AF_LINK != ifa->ifa_addr->sa_family)
    144             continue;
    145         
    146         if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))
    147             continue;
    148         
    149         if (ifa->ifa_data == 0)
    150             continue;
    151         
    152         // network flow
    153         if (strncmp(ifa->ifa_name, "lo", 2))
    154         {
    155             struct if_data *if_data = (struct if_data *)ifa->ifa_data;
    156             iBytes += if_data->ifi_ibytes;
    157             oBytes += if_data->ifi_obytes;
    158             allFlow = iBytes + oBytes;
    159         }
    160         
    161         //wifi flow
    162         if (!strcmp(ifa->ifa_name, "en0"))
    163         {
    164             struct if_data *if_data = (struct if_data *)ifa->ifa_data;
    165             wifiIBytes += if_data->ifi_ibytes;
    166             wifiOBytes += if_data->ifi_obytes;
    167             wifiFlow    = wifiIBytes + wifiOBytes;
    168         }
    169         
    170         //3G and gprs flow
    171         if (!strcmp(ifa->ifa_name, "pdp_ip0"))
    172         {
    173             struct if_data *if_data = (struct if_data *)ifa->ifa_data;
    174             wwanIBytes += if_data->ifi_ibytes;
    175             wwanOBytes += if_data->ifi_obytes;
    176             wwanFlow    = wwanIBytes + wwanOBytes;
    177         }
    178     }
    179     freeifaddrs(ifa_list);
    180     
    181 
    182     if (_iBytes != 0) {
    183         self.receivedNetworkSpeed = [[self bytesToAvaiUnit:iBytes - _iBytes] stringByAppendingString:@"/s"];
    184         [[NSNotificationCenter defaultCenter] postNotificationName:kNetworkReceivedSpeedNotification object:@{@"received":self.receivedNetworkSpeed}];
    185     }
    186     
    187     _iBytes = iBytes;
    188     
    189     if (_oBytes != 0) {
    190         self.sendNetworkSpeed = [[self bytesToAvaiUnit:oBytes - _oBytes] stringByAppendingString:@"/s"];
    191         [[NSNotificationCenter defaultCenter] postNotificationName:kNetworkSendSpeedNotification object:@{@"send":self.sendNetworkSpeed}];
    192     }
    193     _oBytes = oBytes;
    194 }
    195 @end
  • 相关阅读:
    一个随机数生成函数
    HTTP Post请求过程详解
    md5加密算法c语言版
    android popupwindow 自定义视图
    android 获取顶部状态栏的高度
    android 显示和隐藏输入框
    android tablayout + recycleview 简单使用
    jetpack paging使用
    android 自定义控件 属性配置
    vueLazyload 图片懒加载
  • 原文地址:https://www.cnblogs.com/xubaoaichiyu/p/5819385.html
Copyright © 2020-2023  润新知