# 安卓
基于 linux 的原理,通过 cat /proc/进程id/net/dev
拿到网卡数据;
间隔一秒 分别拿到两次发送数据量、接受数据量 ( sendNum_pre
recNum_pre
)
然后计算数据差,得到网速
def getAndroidNet(self, wifi=True): | |
"""Get Android send/recv data, unit:KB wlan0/rmnet0""" | |
net = 'wlan0' if wifi else 'rmnet0' | |
cmd = f'cat /proc/{self.pid}/net/dev |{d.filterType()} {net}' | |
output_pre = adb.shell(cmd=cmd, deviceId=self.deviceId) | |
m_pre = re.search(r'{}:\s*(\d+)\s*\d+\s*\d+\s*\d+\s*\d+\s*\d+\s*\d+\s*\d+\s*(\d+)'.format(net), output_pre) | |
sendNum_pre = round(float(float(m_pre.group(2)) / 1024), 2) | |
recNum_pre = round(float(float(m_pre.group(1)) / 1024), 2) | |
time.sleep(1) | |
output_final = adb.shell(cmd=cmd, deviceId=self.deviceId) | |
m_final = re.search(r'{}:\s*(\d+)\s*\d+\s*\d+\s*\d+\s*\d+\s*\d+\s*\d+\s*\d+\s*(\d+)'.format(net), output_final) | |
sendNum_final = round(float(float(m_final.group(2)) / 1024), 2) | |
recNum_final = round(float(float(m_final.group(1)) / 1024), 2) | |
sendNum = round(float(sendNum_final - sendNum_pre), 2) | |
recNum = round(float(recNum_final - recNum_pre), 2) | |
return sendNum, recNum |
# IOS
间隔 3 秒拿到数据,基于 instrument
def getPerformance(self, perfTpe: DataType): | |
if perfTpe == DataType.NETWORK: | |
perf = Performance(self.deviceId, [perfTpe]) | |
perf.start(self.pkgName, callback=self.callback) | |
time.sleep(3) | |
perf.stop() | |
perf_value = self.downflow, self.upflow | |
else: | |
perf = iosP.Performance(self.deviceId, [perfTpe]) | |
perf_value = perf.start(self.pkgName, callback=self.callback) | |
return perf_value |
def iter_network_flow(d: BaseDevice, rp: RunningProcess) -> Iterator[Any]: | |
n = 0 | |
with d.connect_instruments() as ts: | |
for nstat in ts.iter_network(): | |
# if n < 2: | |
# n += 1 | |
# continue | |
yield DataType.NETWORK, { | |
"timestamp": gen_stimestamp(), | |
"downFlow": (nstat['rx.bytes'] or 0) / 1024, | |
"upFlow": (nstat['tx.bytes'] or 0) / 1024 | |
} |