diff --git a/enrich.py b/enrich.py index 12d13fc..4d64161 100755 --- a/enrich.py +++ b/enrich.py @@ -183,9 +183,6 @@ def get_aps_on_channel(capture, ap_channel): if ts_hex is None: continue - # For debugging purposes, display the type_subtype value with some sarcasm - print(f"Type/Subtype Hex: {ts_hex}") - ts = int(ts_hex, 16) if ts not in (5, 8): # Probe Response or Beacon continue @@ -201,6 +198,49 @@ def get_aps_on_channel(capture, ap_channel): return len(aps) +def calculate_avg_ap_signal_strength(capture, ap_channel): + try: + ap_channel = int(ap_channel) + except ValueError: + print(f"[!] Could not parse channel number: {ap_channel}") + return 0 + + ap_signals = [] + for packet in capture: + try: + if 'radiotap' not in packet or 'wlan' not in packet: + continue + + radio = packet.radiotap + wlan = packet.wlan + + if not hasattr(radio, 'channel') or not hasattr(radio.channel, 'freq'): + continue + + packet_freq = int(radio.channel.freq) + packet_channel = get_channel_from_freq(packet_freq) + + if packet_channel != ap_channel: + continue + + # Check for beacon or probe response + ts_hex = getattr(wlan, 'type_subtype', None) + if ts_hex is None: + continue + + ts = int(ts_hex, 16) + if ts not in (5, 8): # Probe Response or Beacon + continue + + # Get signal strength + signal_strength = getattr(radio, 'dbm_antsignal', None) + if signal_strength is not None: + ap_signals.append(int(signal_strength)) + + except Exception as e: + print(f"[DEBUG] Signal strength parse error: {e}") + continue + def analyze_pcap(pcapng_path, start_ts, end_ts, ap_bssid, ap_channel): cap = pyshark.FileCapture( pcapng_path, @@ -212,6 +252,8 @@ def analyze_pcap(pcapng_path, start_ts, end_ts, ap_bssid, ap_channel): clients_on_ap = 0 clients_on_channel = 0 + aps_on_channel = 0 + avg_ap_signal = 0 try: # Filter packets manually by timestamp @@ -231,6 +273,9 @@ def analyze_pcap(pcapng_path, start_ts, end_ts, ap_bssid, ap_channel): # Placeholder: Logic will be added for: # - CongestionScore # - AvgAPSignal + + avg_ap_signal = calculate_avg_ap_signal_strength(filtered_packets, ap_channel) + # - StrongestAPSignal # - UnlinkedDevices