我有一个应用程序可以执行大量二进制数据加载。我遇到过这样的情况:在加载某些二进制数据期间,不稳定的3G连接可能会间歇性地切断,从而导致问题。
有没有办法,使用模拟器或其他方法来测试低带宽/不稳定的连接方案?
我似乎记得Adobe Flash在他们的测试套件中有带宽模拟器。
答案 0 :(得分:6)
您可以通过使用Internet共享在Mac上创建无线网络,使用防火墙规则降低该界面,以及将iPhone连接到该网络来实现此目的。这实际上可以调试任何连接到无线网络的设备。
使用这种技术,您可以模拟非常微薄,有损或潜伏的网络。
我使用这种技术代替Apple的官方网络链接调节器有几个原因:
这使用了ipfw的dummeynet
功能。在现代版本的OS X中,ipfw在技术上已被弃用,但它仍然可以正常工作。不幸的是,pf(替换)还不支持任意数据包延迟。如果有变化,我会更新这个答案。
告诉Mac OS的内置防火墙(ipfw)以确保应用延迟的数据包(通过ipfw用语中的“dummynet”)仍然通过正常规则进行路由。这允许Internet共享继续工作:
phil@Nebula ~$ sudo sysctl -w net.inet.ip.fw.one_pass=0
net.inet.ip.fw.one_pass: 0 -> 0
配置iPhone流量通过的低质量管道(吞吐量为14Kb / s,丢包率为1%):
phil@Nebula ~$ sudo ipfw pipe 1 config bw 14KB/s
phil@Nebula ~$ sudo ipfw pipe 1 config plr 0.01
下一步会有所不同,具体取决于您是使用Mountain Lion还是以下或Mavericks。
对于Mountain Lion(10.8)或以下:
将数据包路由到管道,但仅限于通过AirPort接口的流量:
phil@Nebula ~$ sudo ipfw add 10 pipe 1 ip from any to any via en1
00010 pipe 1 ip from any to any via en1
重要:如果您使用没有物理以太网端口的Air或新MacBook Pro,则可能会将您的AirPort界面称为en0
。如果是这种情况,请将en1
替换为en0
以上。
小牛队(10.9):
检查ifconfig
的输出并查找Internet Sharing创建的网桥接口:
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether xx:xx:xx:xx:xx:xx
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en4 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 6 priority 0 path cost 0
nd6 options=1<PERFORMNUD>
media: <unknown type>
status: inactive
bridge100: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=3<RXCSUM,TXCSUM>
ether xx:xx:xx:xx:xx:xx
inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en1 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 5 priority 0 path cost 0
media: autoselect
status: active
您希望网桥接口具有IP地址;在大多数情况下,它将是bridge100
。
将数据包路由到管道中,但仅限于桥接接口上的流量:
phil@Nebula ~$ sudo ipfw add 10 pipe 1 ip from any to any via bridge100
00010 pipe 1 ip from any to any via bridge100
如果您的系统名称不同,请更改bridge100
。
您可以在上面的步骤5中更改值14KB/s
和0.01
,以模拟不同类型的网络。您还可以指定config delay 1000
以引入1000毫秒的延迟。有关更多选项,请参阅the manpage。
添加规则后,您可以继续重新配置管道。例如,要模拟接近蜂窝覆盖的边缘,请在应用运行并连接时发出此命令(95%丢包):
phil@Nebula ~$ sudo ipfw pipe 1 config plr 0.95
重新配置管道后无需再次运行sudo ipfw add 10 …
。您可以编写这些更改的脚本以模拟极其动态的网络环境。
您可以发出sudo ipfw delete 10
以使所有内容恢复正常,或者只是重新启动。
答案 1 :(得分:5)
这是一个很棒的脚本,我在OS X上使用它来限制连接速度,或者只是关闭它,对于你想要的任何域。我希望我能记住我从哪里得到它来表扬。
将代码保存到计算机上的文件中,并将其命名为“限制”。然后运行,只需在终端输入以下内容,然后从以下速度中选择一个:[full|fast|medium|slow|wwdc|off]
。
"./throttling medium"
如果您将脚本设置为限制localhost:3000和stackoverflow.com,则在浏览器(或iphone模拟器或其他)中从这些域中的任一域加载页面将响应较慢并加载文件较慢。这对于测试iphone连接错误非常有用。
答案 2 :(得分:2)
我读到有人用iPhone连接iPhone测试,手机用铝箔包裹,以减少手机信号。您可以关闭WiFi和3G,只需要Edge,然后用箔片将其衰减。听起来很粗但是......
您也可以使用iPhone 4并握在手中将两个天线短接在一起; - )
答案 3 :(得分:2)
如果你关闭3G并连接到wifi,你可以测试很多东西。
登录路由器并对iPhone的mac地址进行速率限制。 (测试慢速连接)
在下载数据的过程中将电源切换到wifi
下载时重新启动wifi路由器,以便手机连接,丢失并重新获取。 (测试不同的场景)
快乐的编码!
答案 4 :(得分:0)
嗯,低带宽很简单:关闭Wifi,关闭3G。切割连接也很简单:打开wifi,连接,关闭wifi接入点。
答案 5 :(得分:0)
我猜你可以连接到Mac(如果有的话)设置为WiFi基站(ad-hoc网络)。然后在Mac上设置“虚拟网络”带宽限制和/或高数据包丢失过滤器。
我正在做的是模拟我为Mac设置软件的速度较慢的高延迟DSL线路。
答案 6 :(得分:0)
在iPhone上你不能。一种方法是与iPhone共享您的计算机WIFI连接,但使用特殊应用程序将其降低速度。
此博客文章描述了一些方法:
http://blog.aptivate.org/2010/01/23/make-sure-your-apps-work-in-the-field/
答案 7 :(得分:0)
Chrome 38在设备模拟设置中包含network emulation。您可以选择离线,GPRS,EDGE,3G,DSL和WiFi。还模拟增加的延迟。
它不如在真实设备上测试那么准确,但设置起来要快得多。