你的位置:首页 > 操作系统

[操作系统]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 : NSObject15 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 @end27 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)bytes102 {103   if(bytes < 10)104   {105     return [NSString stringWithFormat:@"0KB"];106   }107   else if(bytes >= 10 && bytes < 1024 * 1024) // KB108   {109     return [NSString stringWithFormat:@"%.1fKB", (double)bytes / 1024];110   }111   else if(bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024)  // MB112   {113     return [NSString stringWithFormat:@"%.1fMB", (double)bytes / (1024 * 1024)];114   }115   else  // GB116   {117     return [NSString stringWithFormat:@"%.1fGB", (double)bytes / (1024 * 1024 * 1024)];118   }119 }120 121 122 -(void)checkNetworkflow123 {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 flow153     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 flow162     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 flow171     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