diff --git a/release/files_common b/release/files_common index 07b138de5..80ae805f6 100644 --- a/release/files_common +++ b/release/files_common @@ -278,6 +278,7 @@ selfdrive/hardware/eon/hardware.py selfdrive/hardware/tici/__init__.py selfdrive/hardware/tici/hardware.py selfdrive/hardware/tici/amplifier.py +selfdrive/hardware/tici/iwlist.py selfdrive/hardware/pc/__init__.py selfdrive/hardware/pc/hardware.py diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index e5e036e27..720fd8926 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -267,6 +267,11 @@ def getNetworkType(): return HARDWARE.get_network_type() +@dispatcher.add_method +def getNetworks(): + return HARDWARE.get_networks() + + @dispatcher.add_method def takeSnapshot(): from selfdrive.camerad.snapshot.snapshot import snapshot, jpeg_write diff --git a/selfdrive/hardware/base.py b/selfdrive/hardware/base.py index 64b7991dd..0a1976d0c 100644 --- a/selfdrive/hardware/base.py +++ b/selfdrive/hardware/base.py @@ -125,3 +125,7 @@ class HardwareBase: @abstractmethod def initialize_hardware(self): pass + + @abstractmethod + def get_networks(self): + pass diff --git a/selfdrive/hardware/eon/hardware.py b/selfdrive/hardware/eon/hardware.py index ccb1d2226..b555ae351 100644 --- a/selfdrive/hardware/eon/hardware.py +++ b/selfdrive/hardware/eon/hardware.py @@ -391,3 +391,6 @@ class Android(HardwareBase): def initialize_hardware(self): pass + + def get_networks(self): + return None diff --git a/selfdrive/hardware/pc/hardware.py b/selfdrive/hardware/pc/hardware.py index 3a2c7dcaa..69bca5b62 100644 --- a/selfdrive/hardware/pc/hardware.py +++ b/selfdrive/hardware/pc/hardware.py @@ -94,3 +94,6 @@ class Pc(HardwareBase): def initialize_hardware(self): pass + + def get_networks(self): + return None diff --git a/selfdrive/hardware/tici/hardware.py b/selfdrive/hardware/tici/hardware.py index 0fc7bc23a..ac41cbc3d 100644 --- a/selfdrive/hardware/tici/hardware.py +++ b/selfdrive/hardware/tici/hardware.py @@ -7,6 +7,7 @@ from pathlib import Path from cereal import log from selfdrive.hardware.base import HardwareBase, ThermalConfig from selfdrive.hardware.tici.amplifier import Amplifier +from selfdrive.hardware.tici import iwlist NM = 'org.freedesktop.NetworkManager' NM_CON_ACT = NM + '.Connection.Active' @@ -281,3 +282,30 @@ class Tici(HardwareBase): def initialize_hardware(self): self.amplifier.initialize_configuration() + + def get_networks(self): + r = {} + + wlan = iwlist.scan() + if wlan is not None: + r['wlan'] = wlan + + lte_info = self.get_network_info() + if lte_info is not None: + extra = lte_info['extra'] + + # ,"LTE",,,,,,,, + # ,,,,,,, + if 'LTE' in extra: + extra = extra.split(',') + try: + r['lte'] = [{ + "mcc": int(extra[3]), + "mnc": int(extra[4]), + "cid": int(extra[5], 16), + "nmr": [{"pci": int(extra[6]), "earfcn": int(extra[7])}], + }] + except (ValueError, IndexError): + pass + + return r diff --git a/selfdrive/hardware/tici/iwlist.py b/selfdrive/hardware/tici/iwlist.py new file mode 100644 index 000000000..1e7c428b4 --- /dev/null +++ b/selfdrive/hardware/tici/iwlist.py @@ -0,0 +1,35 @@ +import subprocess + + +def scan(interface="wlan0"): + result = [] + try: + r = subprocess.check_output(["iwlist", interface, "scan"], encoding='utf8') + + mac = None + for line in r.split('\n'): + if "Address" in line: + # Based on the adapter eithere a percentage or dBm is returned + # Add previous network in case no dBm signal level was seen + if mac is not None: + result.append({"mac": mac}) + mac = None + + mac = line.split(' ')[-1] + elif "dBm" in line: + try: + level = line.split('Signal level=')[1] + rss = int(level.split(' ')[0]) + result.append({"mac": mac, "rss": rss}) + mac = None + except ValueError: + continue + + # Add last network if no dBm was found + if mac is not None: + result.append({"mac": mac}) + + return result + + except Exception: + return None