模擬 Android Automotive OS (AAOS) 中的網路

本頁面說明如何在 Android 上模擬不同的網路狀況 以可擴充、低維護的方式執行 Automotive 硬體裝置。這個 跨環境診斷網路模擬使用常見的 Linux 工具 可以在 Android Automotive 硬體裝置上執行。

以下各節將說明如何設定及執行網路模擬 Android Automotive 硬體裝置。

核心規定

如要在測試的裝置 (DUT) 上啟用網路模擬功能,Linux 中 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)。這項模擬會使用 Linux tcNetEm 提供公用程式,可控制網路介面控制器的網路流量 (NIC)。

如要設定模擬,請執行下列操作:

  1. 將 DUT 和主機伺服器連上網際網路。
  2. 從提供的程式碼中複製 NetworkSimulation.sh 指令碼 在 NetworkSimulation.sh 指令碼部分中,然後下載 在主機伺服器上
  3. 將主機伺服器連線至 DUT。確認清單中出現 DUT 執行 adb devices -l

如需設定架構的插圖,請參閱下圖:

西南

圖 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 指令碼含有以下指令列引數:

  • 延遲時間 (以毫秒為單位)。
  • 以 kbit 或 mbit 為單位指定頻寬。
  • 封包遺失率 (百分比)。

舉例來說,如要將延遲時間設為 300 毫秒、設為 100 KB 和 50% 的封包遺失,請執行以下指令:

bash NetworkSimulation.sh 300ms 100kbit 50%

如要設定 100 毫秒的延遲時間、1 位元頻寬和 0% 的封包遺失,請執行以下指令:

bash NetworkSimulation.sh 100ms 1mbit 0%

驗證模擬作業

執行 NetworkSimulation.sh 指令碼後,請確認網路 模擬設定正確,且使用 Linux pingcurl 指令。使用 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 Bps, 這與模擬中指定的 500Kbit 一致這很正常 ,讓回報的頻寬與指定值不同。