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