A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
wifi_intrastructure_link.py
Go to the documentation of this file.
1 import math
2 import ns.wifi
3 import ns.network
4 import goocanvas
5 from visualizer.base import Link, transform_distance_canvas_to_simulation
6 
7 class WifiLink(Link):
8  def __init__(self, parent_canvas_item, sta, dev):
9  self.node1 = sta
10  self.dev = dev
11  self.node2 = None # ap
12  self.canvas_item = goocanvas.Group(parent=parent_canvas_item)
13  self.invisible_line = goocanvas.Polyline(parent=self.canvas_item,
14  line_width=25.0,
15  visibility=goocanvas.ITEM_HIDDEN)
16  self.visible_line = goocanvas.Polyline(parent=self.canvas_item,
17  line_width=1.0,
18  stroke_color_rgba=0xC00000FF,
19  line_dash=goocanvas.LineDash([2.0, 2.0 ]))
20  self.invisible_line.props.pointer_events = (goocanvas.EVENTS_STROKE_MASK
21  |goocanvas.EVENTS_FILL_MASK
22  |goocanvas.EVENTS_PAINTED_MASK)
23  self.canvas_item.set_data("pyviz-object", self)
24  self.canvas_item.lower(None)
25  self.set_ap(None)
26 
27  def set_ap(self, ap):
28  if ap is self.node2:
29  return
30  if self.node2 is not None:
31  self.node2.remove_link(self)
32  self.node2 = ap
33  if self.node2 is None:
34  self.canvas_item.set_property("visibility", goocanvas.ITEM_HIDDEN)
35  else:
36  self.node2.add_link(self)
37  self.canvas_item.set_property("visibility", goocanvas.ITEM_VISIBLE)
38  self.update_points()
39 
40  def update_points(self):
41  if self.node2 is None:
42  return
43  pos1_x, pos1_y = self.node1.get_position()
44  pos2_x, pos2_y = self.node2.get_position()
45  points = goocanvas.Points([(pos1_x, pos1_y), (pos2_x, pos2_y)])
46  self.visible_line.set_property("points", points)
47  self.invisible_line.set_property("points", points)
48 
49  def destroy(self):
50  self.canvas_item.destroy()
51  self.node1 = None
52  self.node2 = None
53 
54  def tooltip_query(self, tooltip):
55  pos1_x, pos1_y = self.node1.get_position()
56  pos2_x, pos2_y = self.node2.get_position()
57  dx = pos2_x - pos1_x
58  dy = pos2_y - pos1_y
59  d = transform_distance_canvas_to_simulation(math.sqrt(dx*dx + dy*dy))
60  mac = self.dev.GetMac()
61  tooltip.set_text(("WiFi link between STA Node %i and AP Node %i; distance=%.2f m.\n"
62  "SSID: %s\n"
63  "BSSID: %s")
64  % (self.node1.node_index, self.node2.node_index, d,
65  mac.GetSsid(), mac.GetBssid()))
66 
67 
68 class WifiLinkMonitor(object):
69  def __init__(self, dummy_viz):
70  self.access_points = {} # bssid -> node
71  self.stations = [] # list of (sta_netdevice, viz_node, wifi_link)
72 
73  def scan_nodes(self, viz):
74  for (sta_netdevice, viz_node, wifi_link) in self.stations:
75  wifi_link.destroy()
76 
77  self.access_points = {}
78  self.stations = []
79 
80  for node in viz.nodes.itervalues():
81  ns3_node = ns.network.NodeList.GetNode(node.node_index)
82  for devI in range(ns3_node.GetNDevices()):
83  dev = ns3_node.GetDevice(devI)
84  if not isinstance(dev, ns.wifi.WifiNetDevice):
85  continue
86  wifi_mac = dev.GetMac()
87  if isinstance(wifi_mac, ns.wifi.StaWifiMac):
88  wifi_link = WifiLink(viz.links_group, node, dev)
89  self.stations.append((dev, node, wifi_link))
90  elif isinstance(wifi_mac, ns.wifi.ApWifiMac):
91  bssid = ns.network.Mac48Address.ConvertFrom(dev.GetAddress())
92  self.access_points[str(bssid)] = node
93  #print "APs: ", self.access_points
94  #print "STAs: ", self.stations
95 
97  for (sta_netdevice, viz_node, wifi_link) in self.stations:
98  if not sta_netdevice.IsLinkUp():
99  wifi_link.set_ap(None)
100  continue
101  bssid = str(sta_netdevice.GetMac().GetBssid())
102  if bssid == '00:00:00:00:00:00':
103  wifi_link.set_ap(None)
104  continue
105  ap = self.access_points[bssid]
106  wifi_link.set_ap(ap)
107 
108  def update_view(self, viz):
109  for (dummy_sta_netdevice, dummy_viz_node, wifi_link) in self.stations:
110  if wifi_link is not None:
111  wifi_link.update_points()
112 
113 
114 def register(viz):
115  link_monitor = WifiLinkMonitor(viz)
116  viz.connect("simulation-periodic-update", link_monitor.simulation_periodic_update)
117  viz.connect("update-view", link_monitor.update_view)
118  viz.connect("topology-scanned", link_monitor.scan_nodes)
def transform_distance_canvas_to_simulation
Definition: base.py:68