iOS 直播-網速監控,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