diff --git a/src/infuse_iot/database.py b/src/infuse_iot/database.py index ee7934e..e32e0d6 100644 --- a/src/infuse_iot/database.py +++ b/src/infuse_iot/database.py @@ -112,7 +112,7 @@ def _network_key(self, network_id: int, interface: bytes, gps_time: int) -> byte try: info = load_network(network_id) except FileNotFoundError: - raise UnknownNetworkError from None + raise UnknownNetworkError(network_id) from None self._network_keys[network_id] = info["key"] base = self._network_keys[network_id] time_idx = gps_time // (60 * 60 * 24) diff --git a/src/infuse_iot/tools/native_bt.py b/src/infuse_iot/tools/native_bt.py index b385758..0ac6565 100644 --- a/src/infuse_iot/tools/native_bt.py +++ b/src/infuse_iot/tools/native_bt.py @@ -18,7 +18,7 @@ from infuse_iot.commands import InfuseCommand from infuse_iot.common import InfuseBluetoothUUID, InfuseType -from infuse_iot.database import DeviceDatabase +from infuse_iot.database import DeviceDatabase, UnknownNetworkError from infuse_iot.epacket import interface from infuse_iot.epacket.packet import ( Auth, @@ -65,7 +65,10 @@ def __init__(self, database: DeviceDatabase, server: LocalServer, bleak_mapping: self._tasks: dict[int, asyncio.Task] = {} def notification_handler(self, _characteristic: BleakGATTCharacteristic, data: bytearray): - hdr, decr = CtypeBtGattFrame.decrypt(self._db, None, bytes(data)) + try: + hdr, decr = CtypeBtGattFrame.decrypt(self._db, None, bytes(data)) + except UnknownNetworkError: + return # Correct values are annoying to get here if_addr = interface.Address(interface.Address.BluetoothLeAddr(0, 0)) rssi = 0 @@ -193,6 +196,7 @@ def __init__(self, args: argparse.Namespace): self.database = DeviceDatabase() self.server = LocalServer(default_multicast_address()) self.bleak_mapping: dict[int, BLEDevice] = {} + self.unknown_networks: set[int] = set() Console.init() async def server_handler(self): @@ -215,7 +219,14 @@ def simple_callback(self, device: BLEDevice, data: AdvertisementData): rssi = data.rssi payload = data.manufacturer_data[self.infuse_manu] - hdr, decr = CtypeBtAdvFrame.decrypt(self.database, addr.val, payload) + try: + hdr, decr = CtypeBtAdvFrame.decrypt(self.database, addr.val, payload) + except UnknownNetworkError as e: + network_id = e.args[0] + if network_id not in self.unknown_networks: + self.unknown_networks.add(network_id) + Console.log_info(f"Unknown network 0x{network_id:06x}") + return self.bleak_mapping[hdr.device_id] = device hop = HopReceived(