在RTC服务的开发中,我们需要测试服务在各种网络环境下的可用性,以保证用户在复杂环境下的通信体验。因此需要搭建测试环境模拟wifi/3g/4g,以及各种延迟,丢包,乱序的网络条件,验证服务在这些环境下的数据和主观体验。

对于终端来说,iOS相对方便一些,可以直接在系统设置中设定弱网模拟条件; Android相对来说就比较麻烦了,公开的方案基本上都是在win / linux下启用wifi热点供终端连接,然后再启动相应的弱网模拟工具(NEWT / ATC)等。这种方案在单人测试时表现较好,但是开发组里面每个参与测试的人都需要搭建自己的环境,不够通用。最好是能有一台专用的设备来提供模拟弱网的wifi热点,终端设备只要连接并设定自己的网络模拟参数就能进行弱网测试。

今天我们就来搭建一个便携,通用,面向开发组公开的弱网模拟测试环境,所需的硬件设备是树莓派一台,网线一根(用来连接树莓派的有线网口和交换机/路由器)。我这里用的是树莓派3B。(吃灰多年的设备终于派上用场了)。

注:如果你的树莓派跟我一样吃灰很长时间的话,请写入最新的树莓派镜像,否则后面安装软件包的时候会出现各种奇怪问题。(浪费一下午时间的血泪经验)

先来看看网络连接的拓扑图

测试设备通过wifi热点连接到树莓派,树莓派通过有线网口链接到wan

开启树莓派无线热点,提供无线接入能力,并通过有线网口链接到WAN

注:如果是最新的树莓派镜像,网口命名规则改变为mac地址相关,我们需要运行raspi-config来将命名规则更改为旧的命名方式,方便我们下面配置

1.首先安装hostapd和dnsmasq,让树莓派可以开启wifi热点,提供dhcp服务。(最好把软件源指向国内服务器,加快安装速度)

$ sudo apt install hostapd dnsmasq

2.配置wlan0 内网IP,编辑/etc/dhcpcd.conf文件,在最后添加如下内容,将树莓派无线网卡ip地址设定为10.1.0.1

interface wlan0
static ip_address=10.1.0.1/24
nohook wpa_supplicant

3.设置无线内网dhcp分配地址范围,编辑/etc/dnsmasq.conf文件,在最后添加如下内容,将dhcp分配地址范围设定为10.1.0.2~10.1.0.255,24小时有效期

interface=wlan0
dhcp-range=10.1.0.2,10.1.0.255,255.255.255.0,24h

4.设置树莓派无线热点ssid,账号密码等信息。编辑/etc/hostapd/hostpad.conf,添加如下内容:

interface=wlan0
driver=nl80211
ssid=mypi1        #无线热点ssid
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=shumeipai   #无线热点密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

5.配置转发规则,设置路由转发连接到WAN

编辑/etc/sysctl.conf,移除net.ipv4.ip_forward=1 前面的注释

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

更新iptables转发规则并保存

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

编辑/etc/rc.local,重启后自动加载转发规则

iptables-restore < /etc/iptables.ipv4.nat

6.重启服务,用手机连接mypi1热点,测试是否能正常上网

sudo service hostapd restart 
sudo service dnsmasq restart 

安装ATC,开启弱网模拟测试功能

Augmented Traffic Control(ATC) 是Facebook开源的一款网络测试模拟工具,可以让连接到测试平台的终端通过网页自由设定上下行丢包,延迟,乱序,限速等网络参数,并保存为预设配置。工具本身也预设了一些典型模拟参数如3G 4G 等。

首先是安装依赖包并开启Django project:

pip install atc_thrift atcd django-atc-api django-atc-demo-ui django-atc-profile-storage
django-admin startproject atcui
cd atcui

编辑atcui/settings.py,启用ATC:

INSTALLED_APPS = (
    ...
    # Django ATC API
    'rest_framework',
    'atc_api',
    # Django ATC Demo UI
    'bootstrap_themes',
    'django_static_jquery',
    'atc_demo_ui',
    # Django ATC Profile Storage
    'atc_profile_storage',
)

编辑atcui/urls.py,启用ATC 路由:

...
...
from django.views.generic.base import RedirectView
from django.conf.urls import include

urlpatterns = [
    ...
    # Django ATC API
    url(r'^api/v1/', include('atc_api.urls')),
    # Django ATC Demo UI
    url(r'^atc_demo_ui/', include('atc_demo_ui.urls')),
    # Django ATC profile storage
    url(r'^api/v1/profiles/', include('atc_profile_storage.urls')),
    url(r'^$', RedirectView.as_view(url='/atc_demo_ui/', permanent=False)),
]

更新Django DB:

python manage.py migrate

运行atcd,设置要模拟弱网的lan为wlan0 (默认是eth1):

sudo -E atcd --atcd-lan wlan0

编辑settings.py,设置允许通过10.1.0.1访问atcui

ALLOWED_HOSTS = ['10.1.0.1']

启动ATC UI网页

python manage.py runserver 0.0.0.0:8000

启动之后,终端连接上树莓派热点,然后访问10.1.0.1:8000(之前设置的树莓派内网地址)来设置自己的弱网模拟参数,进行弱网功能测试。

发表评论

电子邮件地址不会被公开。 必填项已用*标注