在 Android 汽車作業系統 (AAOS) 中模擬網絡

本頁面介紹如何以可擴展、低維護的方式在 Android Automotive 硬體裝置上模擬不同的網路條件。這種與環境無關的網路模擬使用可在 Android Automotive 硬體設備上運行的常用 Linux 工具。

以下部分說明如何在 Android Automotive 硬體裝置上設定和執行網路模擬。

內核要求

若要在被測設備 (DUT) 上啟用網路模擬,必須在核心設定檔中設定 Linux ifbnetem模組,如下所示:

# 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 tcNetEm實用程式根據控制策略和規則來控制網路介面控制器 (NIC) 上的網路流量。

若要設定模擬,請執行以下操作:

  1. 將 DUT 和主機伺服器連接到網際網路。
  2. 透過從 NetworkSimulation.sh NetworkSimulation.sh部分提供的程式碼複製NetworkSimulation.sh腳本來建立 NetworkSimulation.sh 腳本,並將其下載到主機伺服器上。
  3. 將主機伺服器連接到 DUT。透過執行adb devices -l確保 DUT 出現在已連接裝置的清單中。

有關設定架構的說明,請參考下圖:

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"

執行模擬

若要執行網路模擬, NetworkSimulation.sh腳本檔案中的adb命令使用命令列參數來設定所需的值。

若要指定要模擬的延遲、頻寬和封包遺失,請使用下列命令列參數執行NetworkSimulation.sh腳本:

  • 延遲,以毫秒為單位指定。
  • 頻寬,以 kbit 或 mbit 為單位指定。
  • 資料包遺失,以百分比表示。

例如,要設定 300ms 延遲、100kbit 頻寬和 50% 丟包率,請執行:

bash NetworkSimulation.sh 300ms 100kbit 50%

若要設定 100ms 延遲、1mbit 頻寬和 0% 丟包率,請執行:

bash NetworkSimulation.sh 100ms 1mbit 0%

驗證模擬

執行NetworkSimulation.sh腳本後,使用 Linux pingcurl指令驗證網路模擬配置是否正確且是否如預期運作。使用ping指令驗證延遲,使用curl指令驗證頻寬。

例如,以下是使用bash NetworkSimulation.sh 100ms 500kbit 10%執行的模擬的ping的預期輸出:

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 Bps,這符合模擬中指定的 500kbit 的預期。報告的頻寬與指定值略有不同是正常的。