محاكاة الشبكات في نظام التشغيل Android Automotive OS (AAOS)

توضح هذه الصفحة كيفية محاكاة ظروف الشبكة المختلفة على أجهزة Android Automotive بطريقة قابلة للتطوير ومنخفضة الصيانة. تستخدم محاكاة الشبكة المحايدة للبيئة هذه أدوات Linux المتاحة بشكل شائع والتي يمكن تشغيلها على أجهزة Android Automotive.

تصف الأقسام التالية كيفية إعداد وتشغيل محاكاة الشبكة على أجهزة Android Automotive.

متطلبات النواة

لتمكين محاكاة الشبكة على جهاز قيد الاختبار (DUT)، يجب تكوين وحدات Linux ifb و netem في ملف تكوين kernel، كما هو موضح أدناه:

# Network simulation config fragment start
CONFIG_NET_SCH_NETEM=y
CONFIG_IFB=y
CONFIG_NET_ACT_MIRRED=y
# Network simulation config fragment end

إعداد المحاكاة

يجب إجراء جميع عمليات محاكاة الشبكة أو عمليات محاكاة الاختناق على جهاز قيد الاختبار (DUT). تستخدم هذه المحاكاة الأدوات المساعدة Linux tc و NetEm للتحكم في حركة مرور الشبكة على وحدة تحكم واجهة الشبكة (NIC) استنادًا إلى سياسة وقواعد التحكم.

لإعداد المحاكاة، قم بما يلي:

  1. قم بتوصيل DUT والخادم المضيف بالإنترنت.
  2. قم بإنشاء البرنامج النصي NetworkSimulation.sh عن طريق نسخه من الكود الموجود في قسم البرنامج النصي NetworkSimulation.sh وتنزيله على الخادم المضيف.
  3. قم بتوصيل الخادم المضيف بـ DUT. تأكد من ظهور DUT في قائمة الأجهزة المتصلة عن طريق تشغيل adb devices -l .

للحصول على توضيح لبنية الإعداد، راجع الشكل التالي:

nw-sim

الشكل 1. بنية الإعداد.

البرنامج النصي 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 باستخدام وسيطات سطر الأوامر التالية:

  • الكمون، المحدد في مللي ثانية.
  • عرض النطاق الترددي المحدد بالكيلوبت أو ميجابت.
  • فقدان الحزمة، كنسبة مئوية.

على سبيل المثال، لتعيين زمن وصول قدره 300 مللي ثانية، وعرض نطاق ترددي 100 كيلوبت، وفقدان الحزمة بنسبة 50%، قم بتشغيل:

bash NetworkSimulation.sh 300ms 100kbit 50%

لتعيين زمن وصول قدره 100 مللي ثانية وعرض نطاق ترددي قدره 1 ميجابت وخسارة الحزمة بنسبة 0%، قم بتشغيل:

bash NetworkSimulation.sh 100ms 1mbit 0%

التحقق من المحاكاة

بعد تنفيذ البرنامج النصي NetworkSimulation.sh ، تأكد من تكوين محاكاة الشبكة بشكل صحيح وتشغيلها كما هو متوقع باستخدام أوامر Linux 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 يبلغ عن فقدان الحزمة بنسبة 10% ومتوسط ​​زمن الوصول يقترب من 108 مللي ثانية، وهو ما هو متوقع لقيمة 100 مللي ثانية المحددة في المحاكاة. من الطبيعي أن يختلف زمن الاستجابة المبلغ عنه عن القيمة المحددة بمقدار صغير.

بالنسبة لنفس المثال، ما يلي هو الإخراج المتوقع لتشغيل أمر 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 يُبلغ عن متوسط ​​سرعة التنزيل عند 49220 بت في الثانية، وهو ما هو متوقع بالنسبة لـ 500 كيلوبت المحددة في المحاكاة. من الطبيعي أن يختلف النطاق الترددي المُبلغ عنه عن القيمة المحددة بمقدار صغير.