123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- //
- // ZFNetworkSpeedMonitor.m
- // ZFPlayer
- //
- // Copyright (c) 2016年 任子丰 ( http://github.com/renzifeng )
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
- #import "ZFNetworkSpeedMonitor.h"
- #if __has_include(<ZFPlayer/ZFPlayerLogManager.h>)
- #import <ZFPlayer/ZFPlayerLogManager.h>
- #else
- #import "ZFPlayerLogManager.h"
- #endif
- #include <arpa/inet.h>
- #include <ifaddrs.h>
- #include <net/if.h>
- #include <net/if_dl.h>
- NSString *const ZFDownloadNetworkSpeedNotificationKey = @"ZFDownloadNetworkSpeedNotificationKey";
- NSString *const ZFUploadNetworkSpeedNotificationKey = @"ZFUploadNetworkSpeedNotificationKey";
- NSString *const ZFNetworkSpeedNotificationKey = @"ZFNetworkSpeedNotificationKey";
- @interface ZFNetworkSpeedMonitor () {
- // 总网速
- uint32_t _iBytes;
- uint32_t _oBytes;
- uint32_t _allFlow;
-
- // wifi网速
- uint32_t _wifiIBytes;
- uint32_t _wifiOBytes;
- uint32_t _wifiFlow;
-
- // 3G网速
- uint32_t _wwanIBytes;
- uint32_t _wwanOBytes;
- uint32_t _wwanFlow;
- }
- @property (nonatomic, strong) NSTimer *timer;
- @end
- @implementation ZFNetworkSpeedMonitor
- - (instancetype)init {
- if (self = [super init]) {
- _iBytes = _oBytes = _allFlow = _wifiIBytes = _wifiOBytes = _wifiFlow = _wwanIBytes = _wwanOBytes = _wwanFlow = 0;
- }
- return self;
- }
- // 开始监听网速
- - (void)startNetworkSpeedMonitor {
- if (!_timer) {
- _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkNetworkSpeed) userInfo:nil repeats:YES];
- [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
- [_timer fire];
- }
- }
- // 停止监听网速
- - (void)stopNetworkSpeedMonitor {
- if ([_timer isValid]) {
- [_timer invalidate];
- _timer = nil;
- }
- }
- - (NSString *)stringWithbytes:(int)bytes {
- if (bytes < 1024) { // B
- return [NSString stringWithFormat:@"%dB", bytes];
- } else if (bytes >= 1024 && bytes < 1024 * 1024) { // KB
- return [NSString stringWithFormat:@"%.0fKB", (double)bytes / 1024];
- } else if (bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024) { // MB
- return [NSString stringWithFormat:@"%.1fMB", (double)bytes / (1024 * 1024)];
- } else { // GB
- return [NSString stringWithFormat:@"%.1fGB", (double)bytes / (1024 * 1024 * 1024)];
- }
- }
- - (void)checkNetworkSpeed {
- 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;
-
- 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;
-
- // network
- 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;
- }
-
- //wifi
- 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;
- }
-
- //3G or gprs
- 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;
- }
- }
-
- freeifaddrs(ifa_list);
- if (_iBytes != 0) {
- _downloadNetworkSpeed = [[self stringWithbytes:iBytes - _iBytes] stringByAppendingString:@"/s"];
- [[NSNotificationCenter defaultCenter] postNotificationName:ZFDownloadNetworkSpeedNotificationKey object:nil userInfo:@{ZFNetworkSpeedNotificationKey:_downloadNetworkSpeed}];
- ZFPlayerLog(@"downloadNetworkSpeed : %@",_downloadNetworkSpeed);
- }
-
- _iBytes = iBytes;
-
- if (_oBytes != 0) {
- _uploadNetworkSpeed = [[self stringWithbytes:oBytes - _oBytes] stringByAppendingString:@"/s"];
- [[NSNotificationCenter defaultCenter] postNotificationName:ZFUploadNetworkSpeedNotificationKey object:nil userInfo:@{ZFNetworkSpeedNotificationKey:_uploadNetworkSpeed}];
- ZFPlayerLog(@"uploadNetworkSpeed :%@",_uploadNetworkSpeed);
- }
-
- _oBytes = oBytes;
- }
- @end
|