![如何监控 USB 网络摄像头带宽使用情况?](https://linux22.com/image/830930/%E5%A6%82%E4%BD%95%E7%9B%91%E6%8E%A7%20USB%20%E7%BD%91%E7%BB%9C%E6%91%84%E5%83%8F%E5%A4%B4%E5%B8%A6%E5%AE%BD%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%EF%BC%9F.png)
我想要了解使用 USB 网络摄像头时占用的带宽量。我更喜欢命令行解决方案。
答案1
使用usb接口,它很好地概述了哪些设备使用了多少带宽:
Bus ID 1 (USB bus number 1) To device From device
Device ID 1 : 0.00 kb/s 0.00 kb/s
Device ID 2 : 0.00 kb/s 0.00 kb/s
Bus ID 2 (USB bus number 2) To device From device
Device ID 1 : 0.00 kb/s 0.00 kb/s
Device ID 4 : 141.73 kb/s 13777.68 kb/s
Device ID 5 : 9.98 kb/s 11.24 kb/s
Device ID 6 : 0.00 kb/s 0.00 kb/s
Device ID 7 : 0.00 kb/s 0.00 kb/s
Device ID 8 : 141.71 kb/s 15257.26 kb/s
像这样安装并运行它:
$ sudo apt install git cmake g++ libboost-dev libpcap-dev libboost-thread-dev libboost-system-dev
$ git clone https://github.com/aguinet/usbtop.git
$ cd usbtop
$ cmake .
$ make
$ sudo src/usbtop
答案2
我认为这可以用 wireshark 来完成。
当插入 USB 设备时,系统日志中会出现类似以下消息
2月7日 21:35:42 计算机内核:[1237.639216] usb 2-1.1.4: 使用 ehci_hcd 的新高速 USB 设备编号 8
通过这些信息,我们知道该设备插入了总线 2,设备编号为 8。
wireshark 火了
$ sudo wireshark
它会出现一个设备列表...选择与您插入设备相同的总线 ID,在本例中为“USB 总线编号 2”,然后开始捕获。
在菜单中,选择“统计数据”,然后选择“IO 图表”。
然后在图表选项中,您可以仅使用所需的设备创建过滤器。
例如:
(usb.bus_id == 2)&&(usb.device_address == 8)
在“X 轴”和“Y 轴”中调整值以获得具有“正常”值的图形,例如,刻度间隔:1 秒,单位:位/刻,并且图形应以位/秒为单位。
答案3
我编写了两个 shell 脚本来获取 USB 设备的吞吐量。如果有人想使用它,你可以在这里找到它邮政。
获取Usb文件
#!/bin/bash
COUNTER=0;
# first get USB devices
IFS=$'\n'
USBDEVICES=$( lsusb | grep -v "0000:0000" | grep -iv "hub" )
CHOOSED_DEVICE=$(zenity --list --width=700 --height=500 --title "Connected USB devices" --column="Devices" ${USBDEVICES[@]})
unset IFS
echo ${CHOOSED_DEVICE}
echo ${CHOOSED_DEVICE} | cut -d: -f 1 | read
BUS=`echo ${CHOOSED_DEVICE} | cut -d: -f 1 | cut -d\ -f 2`
DEVICE=`echo ${CHOOSED_DEVICE} | cut -d: -f 1 | cut -d\ -f 4`
let BUS=$BUS+0
echo $BUS
echo $DEVICE
# create data to pipe
let totalIN=0;
let totalOUT=0;
echo "usbmon -i ${BUS} | grep "C Bo:${BUS}:${DEVICE}" ";
usbmon -i ${BUS} | grep "C B" | grep "${BUS}:${DEVICE}" | while read garb1 garb2 garb3 status garb5 value finalGarb; do
if [[ $status =~ "Bo" ]]; then
let totalIN=$totalIN+$value
echo $totalIN > /tmp/counterUsbIN
elif [[ $status =~ "Bi" ]]; then
let totalOUT=$totalOUT+$value
echo $totalOUT > /tmp/counterUsbOUT
else
echo "discarded"
continue;
fi
done
加速Usb
#!/bin/bash -i
if [ $1 ]; then
SLEEP=$1;
else
SLEEP=1;
fi
PREV_VALUE_IN=`cat /tmp/counterUsbIN`
PREV_VALUE_OUT=`cat /tmp/counterUsbOUT`
LINECOUNT=$(tput lines);
while [ 1 ]; do
if [ $LINECOUNT -ge $(tput lines) ]; then
printf "%7s %7s \n" "IN" "OUT"
LINECOUNT=2;
else
(( LINECOUNT++ ))
fi
sleep $SLEEP
LAST_VALUE_IN=`cat /tmp/counterUsbIN`
LAST_VALUE_OUT=`cat /tmp/counterUsbOUT`
let VALUE_IN=${LAST_VALUE_IN}-${PREV_VALUE_IN}
let PREV_VALUE_IN=${LAST_VALUE_IN}
let VALUE_OUT=${LAST_VALUE_OUT}-${PREV_VALUE_OUT}
let PREV_VALUE_OUT=${LAST_VALUE_OUT}
mbytesSecIn=`echo "scale = 3; ${VALUE_IN}/${SLEEP}/1024/1024" | bc`
mbytesSecOut=`echo "scale = 3; ${VALUE_OUT}/${SLEEP}/1024/1024" | bc`
mbitsSecIn=`echo "scale = 3; ${VALUE_IN}*8/${SLEEP}/1024/1024" | bc`
mbitsSecOut=`echo "scale = 3; ${VALUE_OUT}*8/${SLEEP}/1024/1024" | bc`
printf "%7.3f %7.3f Mbytes/s %7.3f %7.3f Mbits/s\n" ${mbytesSecIn} ${mbytesSecOut} ${mbitsSecIn} ${mbitsSecOut}
done