您的位置:首页 > 理论基础 > 计算机网络

关于实时监测网络每秒上下行流量问题

2017-12-09 09:44 246 查看
今天接到该需求,上午google了许多,cocoachina了一些,结合了前人的工作,整合了一些思路,封装了一个类,
用户监测当前每秒实时网络流量、wifi信号强弱度0-3、网络环境。现把代码发布。

.h文件

//
//  NetworkStateOrRSSI.h
//  GHZeusLibraries
//
//  Created by 郭军 on 2017/12/2.
//  Copyright © 2017年 ZJBL. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef enum {
GHNetworkErrorType = 0,
GHNetwork2GType = 1,
GHNetwork3GType = 2,
GHNetwork4GType = 3,
GHNetworkWifiType = 5
}GHNetworkType;

@interface  NSObject (NetworkStateOrRSSI)

@property (assign, nonatomic) uint32_t  nowIBytes;  //当前每秒下行流量,KB
@property (assign, nonatomic) uint32_t  nowOBytes;  //当前每秒上行流量

+ (GHNetworkType)networkType;

+ (int)wifiStrengthBars;

//开始检测,需每秒调用一次该方法,使获得nowIBytes&nowOBytes
- (void)detectionBytes;

@end


.m文件

//
//  NetworkStateOrRSSI.m
//  GHZeusLibraries
//
//  Created by 郭军 on 2017/12/2.
//  Copyright © 2017年 ZJBL. All rights reserved.
//

#import "NSObject+NetworkStateOrRSSI.h"
#include <ifaddrs.h>
#include <sys/socket.h>
#include <net/if.h>
#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@interface NSObject (bytes)
@property (assign,nonatomic) uint32_t historyIBytes;
@property (assign,nonatomic) uint32_t historyOBytes;
@property (assign,nonatomic) uint32_t oldIBytes;
@property (assign,nonatomic) uint32_t oldOBytes;
@property (assign,nonatomic) BOOL     isFirst;
@end

@implementation NSObject (bytes)

- (void)setHistoryIBytes:(uint32_t)historyIBytes
{
objc_setAssociatedObject(self, @selector(historyIBytes), [NSNumber numberWithInt:historyIBytes], OBJC_ASSOCIATION_ASSIGN);
}

- (uint32_t)historyIBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}

- (void)setHistoryOBytes:(uint32_t)historyOBytes
{
objc_setAssociatedObject(self, @selector(historyOBytes), [NSNumber numberWithInt:historyOBytes], OBJC_ASSOCIATION_ASSIGN);
}

- (uint32_t)historyOBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}

- (void)setOldIBytes:(uint32_t)oldIBytes
{
objc_setAssociatedObject(self, @selector(oldIBytes), [NSNumber numberWithInt:oldIBytes], OBJC_ASSOCIATION_ASSIGN);
}

- (uint32_t)oldIBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}

- (void)setOldOBytes:(uint32_t)oldOBytes
{
objc_setAssociatedObject(self, @selector(oldOBytes), [NSNumber numberWithInt:oldOBytes], OBJC_ASSOCIATION_ASSIGN);
}

- (uint32_t)oldOBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}

- (void)setIsFirst:(BOOL)isFirst
{
objc_setAssociatedObject(self, @selector(isFirst), @(isFirst), OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (BOOL)isFirst
{
return [objc_getAssociatedObject(self, _cmd) boolValue];
}

- (void)getInterfaceBytes
{
struct ifaddrs *ifa_list = 0, *ifa;
if (getifaddrs(&ifa_list) == -1)
{
return;
}

uint32_t iBytes = 0;
uint32_t oBytes = 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;

/* Not a loopback device. */
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;
}
}
if (!self.isFirst) {
self.historyIBytes = iBytes;
self.historyOBytes = oBytes;
self.isFirst=YES;
}

self.nowIBytes = (iBytes - self.historyIBytes)/1024 - self.oldIBytes;
self.nowOBytes = (oBytes - self.historyOBytes)/1024 - self.oldIBytes;

self.oldIBytes = (iBytes - self.historyIBytes)/1024;
self.oldOBytes = (oBytes - self.historyOBytes)/1024;

freeifaddrs(ifa_list);
}

@end

@implementation NSObject (NetworkStateOrRSSI)

- (void)setNowIBytes:(uint32_t)nowIBytes
{
objc_setAssociatedObject(self, @selector(nowIBytes), [NSNumber numberWithInt:nowIBytes], OBJC_ASSOCIATION_ASSIGN);
}

- (uint32_t)nowIBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}

- (void)setNowOBytes:(uint32_t)nowOBytes
{
objc_setAssociatedObject(self, @selector(nowOBytes), [NSNumber numberWithInt:nowOBytes], OBJC_ASSOCIATION_ASSIGN);
}

- (uint32_t)nowOBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}

+ (GHNetworkType)networkType
{
UIApplication *app = [UIApplication sharedApplication];

NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];

int type = 0;
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}
return type;
}

+ (int)wifiStrengthBars
{
UIApplication *app = [UIApplication sharedApplication];

NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];

int type = 0;
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
type = [[child valueForKeyPath:@"wifiStrengthBars"] intValue];
}
}
return type;
}

- (void)detectionBytes
{
[self getInterfaceBytes];
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: