این صفحه نحوه شبیهسازی شرایط مختلف شبکه در دستگاههای سختافزاری اندروید اتوموبیل را به روشی مقیاسپذیر و کمهزینه شرح میدهد. این شبیهسازی شبکه مستقل از محیط، از ابزارهای لینوکس رایج موجود که میتوانند روی دستگاههای سختافزاری اندروید اتوموبیل اجرا شوند، استفاده میکند.
بخشهای زیر نحوه راهاندازی و اجرای شبیهسازی شبکه در دستگاههای سختافزاری اندروید اتو را شرح میدهند.
نیاز هسته
برای فعال کردن شبیهسازی شبکه روی دستگاه تحت آزمایش (DUT)، ماژولهای ifb و netem لینوکس باید در فایل پیکربندی هسته، مطابق شکل زیر، پیکربندی شوند:
# Network simulation config fragment start
CONFIG_NET_SCH_NETEM=y
CONFIG_IFB=y
CONFIG_NET_ACT_MIRRED=y
# Network simulation config fragment end
راهاندازی شبیهسازی
تمام شبیهسازیهای شبکه یا شبیهسازیهای کنترل سرعت باید روی دستگاه تحت آزمایش (DUT) انجام شوند. این شبیهسازی از ابزارهای لینوکس tc و NetEm برای کنترل ترافیک شبکه روی کنترلکننده رابط شبکه (NIC) بر اساس سیاستها و قوانین کنترلی استفاده میکند.
برای تنظیم شبیهسازی، موارد زیر را انجام دهید:
- DUT و سرور میزبان را به اینترنت وصل کنید.
- اسکریپت
NetworkSimulation.shرا با کپی کردن آن از کد ارائه شده در بخش اسکریپتNetworkSimulation.shایجاد کرده و آن را در سرور میزبان دانلود کنید. - سرور میزبان را به DUT متصل کنید. با اجرای دستور
adb devices -lمطمئن شوید که DUT در لیست دستگاههای متصل ظاهر میشود.
برای نمایش معماری نصب، به شکل زیر مراجعه کنید:

شکل ۱. معماری راهاندازی.
اسکریپت NetworkSimulation.sh
فایل اسکریپت NetworkSimulation.sh شامل دستورات adb است که شبیهسازی شبکه را اجرا میکنند. موارد زیر را در فایلی به نام NetworkSimulation.sh کپی کنید:
#!/bin/bash
latency=$1
bandwidth=$2
packetloss=$3
# root device and set it to permissive mode
adb root
adb shell setenforce 0
#Clear the current tc control
adb shell tc qdisc del dev ifb0 root
adb shell ip link set dev ifb0 down
adb shell tc qdisc del dev wlan0 ingress
adb shell tc qdisc del dev wlan0 root
# Create a virtual device for ingress
adb shell ip link set dev wlan0 up
adb shell ip link set dev ifb0 up
adb shell tc qdisc del dev wlan0 clsact
adb shell tc qdisc add dev wlan0 handle ffff: ingress
adb shell tc filter add dev wlan0 parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0
# Throttle upload bandwidth / latency / packet loss
adb shell tc qdisc add dev wlan0 root handle 1: htb default 11
adb shell tc class add dev wlan0 parent 1: classid 1:1 htb rate "$bandwidth"
adb shell tc class add dev wlan0 parent 1:1 classid 1:11 htb rate "$bandwidth"
adb shell tc qdisc add dev wlan0 parent 1:11 handle 10: netem delay "$latency" loss "$packetloss"
# Throttle download bandwidth
adb shell tc qdisc add dev ifb0 root handle 1: htb default 10
adb shell tc class add dev ifb0 parent 1: classid 1:1 htb rate "$bandwidth"
adb shell tc class add dev ifb0 parent 1:1 classid 1:10 htb rate "$bandwidth"
اجرای شبیهسازی
برای اجرای شبیهسازی شبکه، دستورات adb در فایل اسکریپت NetworkSimulation.sh از آرگومانهای خط فرمان برای تنظیم مقادیر استفاده میکنند.
برای مشخص کردن تأخیر، پهنای باند و از دست دادن بستهای که میخواهید شبیهسازی کنید، اسکریپت NetworkSimulation.sh را با آرگومانهای خط فرمان زیر اجرا کنید:
- تأخیر، مشخص شده بر حسب میلیثانیه.
- پهنای باند، که بر حسب کیلوبیت یا مگابیت مشخص میشود.
- از دست رفتن بسته، به صورت درصد.
برای مثال، برای تنظیم تأخیر ۳۰۰ میلیثانیه، پهنای باند ۱۰۰ کیلوبیت و ۵۰٪ اتلاف بسته، دستور زیر را اجرا کنید:
bash NetworkSimulation.sh 300ms 100kbit 50%
برای تنظیم تأخیر ۱۰۰ میلیثانیه، پهنای باند ۱ مگابیت و ۰٪ از دست دادن بستهها، دستور زیر را اجرا کنید:
bash NetworkSimulation.sh 100ms 1mbit 0%
تأیید شبیهسازی
پس از اجرای اسکریپت NetworkSimulation.sh ، با استفاده از دستورات ping و curl لینوکس، تأیید کنید که شبیهسازی شبکه به درستی پیکربندی شده و مطابق انتظار اجرا میشود. از دستور ping برای تأیید تأخیر و از دستور curl برای تأیید پهنای باند استفاده کنید.
برای مثال، خروجی مورد انتظار ping برای شبیهسازی اجرا شده با bash NetworkSimulation.sh 100ms 500kbit 10% به صورت زیر است:
BUILD:/ # ping -c 20 www.google.com PING www.google.com (172.217.5.100) 56(84) bytes of data. 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=1 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=2 ttl=119 time=105 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=3 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=5 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=6 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=7 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=9 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=10 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=11 ttl=119 time=185 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=12 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=13 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=14 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=15 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=16 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=17 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=18 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=19 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=20 ttl=119 time=103 ms --- www.google.com ping statistics --- 20 packets transmitted, 18 received, 10% packet loss, time 19040ms rtt min/avg/max/mdev = 103.394/108.307/185.756/18.791 ms
این مثال نشان میدهد که ping اتلاف بسته را در ۱۰٪ و میانگین تأخیر نزدیک به ۱۰۸ میلیثانیه گزارش میدهد، که مطابق با مقدار ۱۰۰ میلیثانیه مشخصشده در شبیهسازی است. طبیعی است که تأخیر گزارششده با مقدار مشخصشده کمی متفاوت باشد.
برای همان مثال، خروجی مورد انتظار از اجرای دستور curl به صورت زیر است.
BUILD:/sdcard/DCIM # curl https://images-assets.nasa.gov/image/PIA15416/PIA15416~orig.jpg -o foo.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6598k 100 6598k 0 0 49220 0 0:02:17 0:02:17 --:--:-- 47574
این مثال نشان میدهد که curl میانگین سرعت دانلود را ۴۹۲۲۰ بیت بر ثانیه گزارش میدهد، که مطابق انتظار برای ۵۰۰ کیلوبیت مشخص شده در شبیهسازی است. طبیعی است که پهنای باند گزارش شده با مقدار مشخص شده کمی متفاوت باشد.