Source code for paradrop.airshark.airshark

from __future__ import absolute_import
from twisted.internet.task import LoopingCall
from twisted.internet.reactor import spawnProcess

from paradrop.base.output import out
from paradrop.base import settings
from paradrop.lib.utils import pdos
from paradrop.core.config.airshark import airshark_interface_manager
from .scanner import Scanner
from .analyzer import AnalyzerProcessProtocol


[docs]class AirsharkManager(object): def __init__(self): self.loop = LoopingCall(self.check_spectrum) self.wifi_interface = None self.scanner = None self.analyzer_process = AnalyzerProcessProtocol(self) self.spectrum_observers = [] self.analyzer_observers = [] airshark_interface_manager.add_observer(self)
[docs] def status(self): hardware_ready = False software_ready = False airshark_running = False if self.wifi_interface: hardware_ready = True if pdos.exists(settings.AIRSHARK_INSTALL_DIR): software_ready = True if self.analyzer_process.isRunning(): airshark_running = True return (hardware_ready, software_ready, airshark_running)
[docs] def on_interface_up(self, interface): self._stop() self.wifi_interface = interface self.scanner = Scanner(self.wifi_interface) self._start()
[docs] def on_interface_down(self, interface): self._stop() self.wifi_interface = None self.scanner = None
def _start(self): self.scanner.cmd_chanscan() self.scanner.start() if not self.analyzer_process.isRunning(): out.info("Launching airshark analyzer") cmd = [settings.AIRSHARK_INSTALL_DIR + "/analyzer", settings.AIRSHARK_INSTALL_DIR + "/specshape/specshape_v1_722N_5m.txt", "--spectrum-fd=3", "--output-fd=4"] spawnProcess(self.analyzer_process,\ cmd[0], cmd, env=None, \ childFDs={0:"w", 1:"r", 2:2, 3:"w", 4:"r"}) self.loop.start(0.2) return True def _stop(self): if self.scanner: self.scanner.stop() if self.analyzer_process.isRunning(): self.analyzer_process.stop() if self.loop.running: self.loop.stop()
[docs] def check_spectrum(self): # The bandwidth of the data is about 160k Bytes per second ts, data = self.scanner.spectrum_reader.read_samples() if ((data is not None) and (len(self.spectrum_observers) > 0 or self.analyzer_process.isRunning())): if len(self.spectrum_observers) > 0: #for (tsf, max_exp, freq, rssi, noise, max_mag, max_index, bitmap_weight, sdata) in SpectrumReader.decode(data): # for observer in self.spectrum_observers: # observer.on_spectrum_data(tsf, max_exp, freq, rssi, noise, max_mag, max_index, bitmap_weight, sdata) # Due to performance issue, we have to delegate the packet decoding task to clients # for packet in SpectrumReader.decode(data): # for observer in self.spectrum_observers: # observer.on_spectrum_data(packet) for observer in self.spectrum_observers: observer.on_spectrum_data(data) if self.analyzer_process.isRunning(): # Forward spectrum data to the airshark analyzer self.analyzer_process.feedSpectrumData(data)
# TODO: Not sure we need it or not
[docs] def read_raw_samples(self): if (self.scanner): return self.scanner.spectrum_reader.read_samples() else: return None, None
[docs] def on_analyzer_message(self, message): for observer in self.analyzer_observers: observer.on_analyzer_message(message)
[docs] def add_spectrum_observer(self, observer): if (self.spectrum_observers.count(observer) == 0): self.spectrum_observers.append(observer)
[docs] def remove_spectrum_observer(self, observer): if (self.spectrum_observers.count(observer) == 1): self.spectrum_observers.remove(observer)
[docs] def add_analyzer_observer(self, observer): if (self.analyzer_observers.count(observer) == 0): self.analyzer_observers.append(observer)
[docs] def remove_analyzer_observer(self, observer): if (self.analyzer_observers.count(observer) == 1): self.analyzer_observers.remove(observer)