本博客总结了examples文件下面的例子的用法,需要注意的事项以及今后编码需要用到的技巧。有些例子经过了自己的改动。

例1 4address

IEEE 802.11 (WLAN)帧的报头有四个地址字段。为了在无线分配系统(WDS)链路上透明地传输以太网数据包,IEEE 802.3(以太网)帧被封装在IEEE 802.11 (WLAN)帧中。在这种情况下,所有四个地址字段都被使用
•以太网帧的发送方
•以太网帧的接收器
•WLAN帧的发送器
•WLAN帧的接收器
以太网帧的发送方和接收方仅从传输的以太网帧复制。其余的字段允许接收方识别帧是为他准备的,并允许它向(WLAN)发送方确认帧的接收。然而,通常只需要这四个字段中的三个,因此大多数驱动程序不知道如何处理使用所有四个地址字段的帧。换句话说:WDS最重要的组成部分是支持4个地址头。

#!/usr/bin/python

"""This example shows how to enable 4-address
Warning: It works only when network manager is stopped"""

from mininet.node import Controller
from mininet.log import setLogLevel, info
from mn_wifi.link import wmediumd, _4address
from mn_wifi.cli import CLI_wifi
from mn_wifi.net import Mininet_wifi
from mn_wifi.wmediumdConnector import interference


def topology():
    "Create a network."
    net = Mininet_wifi(controller=Controller, link=wmediumd,
                       wmediumd_mode=interference, configure4addr=True)

    info("*** Creating nodes\n")
    ap1 = net.addAccessPoint('ap1', ssid="ap1-ssid", mod"g",
                             channel="1", position='30,30,0')
    ap2 = net.addAccessPoint('ap2', ssid="ap2-ssid", mode="g",
                             channel="1", position='40,60,0')
    ap3 = net.addAccessPoint('ap3', ssid="ap3-ssid", mode="g",
                             channel="1", position='50,30,0')
    sta1 = net.addStation('sta1', ip="192.168.0.1/24", position='31,32,0')
    sta2 = net.addStation('sta2', ip="192.168.0.2/24", position='32,34,0')
    sta3 = net.addStation('sta3', ip="192.168.0.3/24", position='41,62,0')
    sta4 = net.addStation('sta4', ip="192.168.0.4/24", position='42,64,0')
    sta5 = net.addStation('sta5', ip="192.168.0.5/24", position='51,32,0')
    sta6 = net.addStation('sta6', ip="192.168.0.6/24", position='52,34,0')
    c0 = net.addController('c0')

    info("*** Configuring Propagation Model\n")
    net.setPropagationModel(model="logDistance", exp=4.5)

    info("*** Configuring wifi nodes\n")
    net.configureWifiNodes()

    info("*** Adding Link\n")
    net.addLink(ap1, ap2, cls=_4address) # ap1=ap, ap2=client
    net.addLink(ap1, ap3, cls=_4address) # ap1=ap, ap3=client
    net.addLink(sta1, ap1)
    net.addLink(sta2, ap1)
    net.addLink(sta3, ap2)
    net.addLink(sta4, ap2)
    net.addLink(sta5, ap3)
    net.addLink(sta6, ap3)

    net.plotGraph(max_x=100, max_y=100)

    info("*** Starting network\n")
    net.build()
    c0.start()
    ap1.start([c0])
    ap2.start([c0])
    ap3.start([c0])

    info("*** Running CLI\n")
    CLI_wifi(net)

    info("*** Stopping network\n")
    net.stop()


if __name__ == '__main__':
    setLogLevel('info')
    topology()

运行结果:
mininet-wifi examples 官方例子详解(一)
注意事项:

  1. net参数:net = Mininet_wifi(controller=Controller, link=wmediumd,
    wmediumd_mode=interference, configure4addr=True)
  2. addLink参数:net.addLink(ap1, ap2, cls=_4address) 这时候两个ap就有主从关系:ap2是客户机。
  3. 意思是不是ap之间使用以太网连接,sta与ap之间使用wlan连接。
    mininet-wifi examples 官方例子详解(一)
    mininet-wifi examples 官方例子详解(一)

例2 active_scan

当sta需要连接特定频率(MHz),可以使用active_scan功能。
果网络使用的通道子集已知,则可以使用此选项优化扫描,使其不发生在网络不使用的通道上。示例:scan_freq=“2412 2437 2462”, freq_list=“2412 2437 2462”
mininet-wifi examples 官方例子详解(一)

#!/usr/bin/python

'This example shows how to work with active scan'

from mininet.node import Controller
from mininet.log import setLogLevel, info
from mn_wifi.node import UserAP
from mn_wifi.cli import CLI_wifi
from mn_wifi.net import Mininet_wifi


def topology():
    "Create a network."
    net = Mininet_wifi(controller=Controller, accessPoint=UserAP)

    info("*** Creating nodes\n")
    net.addStation('sta1', passwd='123456789a,123456789a', encrypt='wpa2,wpa2',
                   wlans=2, active_scan=1, scan_freq='2412,2437',
                   freq_list='2412,2437', position='5,10,0')
    net.addStation('sta2', passwd='123456789a', encrypt='wpa2',
                   active_scan=1, scan_freq='2437', freq_list='2437',
                   position='45,10,0')
    ap1 = net.addAccessPoint('ap1', ssid="ssid-1", mode="g", channel="1",
                             passwd='123456789a', encrypt='wpa2',
                             position='10,10,0')
    ap2 = net.addAccessPoint('ap2', ssid="ssid-1", mode="g", channel="6",
                             passwd='123456789a', encrypt='wpa2',
                             position='40,10,0')
    c0 = net.addController('c0')

    info("*** Configuring wifi nodes\n")
    net.configureWifiNodes()

    net.plotGraph(max_x=120, max_y=120)

    info("*** Starting network\n")
    net.build()
    c0.start()
    ap1.start([c0])
    ap2.start([c0])

    info("*** Running CLI\n")
    CLI_wifi(net)

    info("*** Stopping network\n")
    net.stop()


if __name__ == '__main__':
    setLogLevel('info')
    topology()

mininet-wifi examples 官方例子详解(一)
需要注意的是:

  1. 模拟添加了wap2加密的协议
  2. active_scan标志位设置为1

例3 adhoc

adhoc显示了如何使用adhoc模式设置实验,在这种模式下,工作站无需通过访问点而彼此连接。

#!/usr/bin/python

"""This example shows how to work in adhoc mode

sta1 <---> sta2 <---> sta3"""

import sys

from mininet.log import setLogLevel, info
from mn_wifi.link import wmediumd, adhoc
from mn_wifi.cli import CLI_wifi
from mn_wifi.net import Mininet_wifi
from mn_wifi.wmediumdConnector import interference

#adhoc shows how to set up experiments with adhoc mode,
# where stations connect to each other without passing through an access point.


def topology(autoTxPower):
    "Create a network."
    net = Mininet_wifi(link=wmediumd, wmediumd_mode=interference)

    info("*** Creating nodes\n")
    if autoTxPower:
        sta1 = net.addStation('sta1', position='10,10,0', range=100)
        sta2 = net.addStation('sta2', position='50,10,0', range=100)
        sta3 = net.addStation('sta3', position='90,10,0', range=100)
    else:
        sta1 = net.addStation('sta1', position='10,10,0')
        sta2 = net.addStation('sta2', position='50,10,0')
        sta3 = net.addStation('sta3', position='90,10,0')

    net.setPropagationModel(model="logDistance", exp=4)

    info("*** Configuring wifi nodes\n")
    net.configureWifiNodes()

    net.plotGraph(max_x=100, max_y=100)

    info("*** Creating links\n")
    net.addLink(sta1, cls=adhoc, ssid='adhocNet',
                mode='g', channel=5, ht_cap='HT40+')
    net.addLink(sta2, cls=adhoc, ssid='adhocNet',
                mode='g', channel=5)
    net.addLink(sta3, cls=adhoc, ssid='adhocNet',
                mode='g', channel=5, ht_cap='HT40+')

    info("*** Starting network\n")
    net.build()

    info("*** Running CLI\n")
    CLI_wifi(net)

    info("*** Stopping network\n")
    net.stop()


if __name__ == '__main__':
    setLogLevel('info')
    #三元表达式来确定命令行参数
    autoTxPower = True if '-a' in sys.argv else False
    topology(autoTxPower)

mininet-wifi examples 官方例子详解(一)
可以看到三个站点通过wifi同时连接。

  1. 将addLink参数cls编程adhoc
  2. autoTxPower = True if ‘-a’ in sys.argv else False 这里使用python三元表达式来根据输入是否有-a来确定传入topo的参数到底是什么,例如下面:

sudo python adhoc.py -a
mininet-wifi examples 官方例子详解(一)

加上这个参数之后,每一个sta就有一个默认的range了。因此这个例子可以学到如果给我们的网络传入外部参数,这个在协议设计优化是有很大帮助的。对于不同的协议,可以在终端使用不同的参数来更改。

相关文章: