diff --git a/src/meshcore/ble_cx.py b/src/meshcore/ble_cx.py index 0ce06d9..f1213c2 100644 --- a/src/meshcore/ble_cx.py +++ b/src/meshcore/ble_cx.py @@ -171,11 +171,19 @@ class BLEConnection: async def send(self, data): if not self.client: logger.error("Client is not connected") + if self._disconnect_callback: + await self._disconnect_callback("ble_transport_lost") return False if not self.rx_char: logger.error("RX characteristic not found") return False - await self.client.write_gatt_char(self.rx_char, bytes(data), response=True) + try: + await self.client.write_gatt_char(self.rx_char, bytes(data), response=True) + except Exception as exc: + logger.warning(f"BLE write failed: {exc}") + if self._disconnect_callback: + await self._disconnect_callback(f"ble_write_failed: {exc}") + return False async def disconnect(self): """Disconnect from the BLE device.""" diff --git a/src/meshcore/serial_cx.py b/src/meshcore/serial_cx.py index 61163bd..24aaef7 100644 --- a/src/meshcore/serial_cx.py +++ b/src/meshcore/serial_cx.py @@ -125,11 +125,18 @@ class SerialConnection: async def send(self, data): if not self.transport: logger.error("Transport not connected, cannot send data") + if self._disconnect_callback: + await self._disconnect_callback("serial_transport_lost") return size = len(data) pkt = b"\x3c" + size.to_bytes(2, byteorder="little") + data logger.debug(f"sending pkt : {pkt}") - self.transport.write(pkt) + try: + self.transport.write(pkt) + except OSError as exc: + logger.warning(f"Serial write failed: {exc}") + if self._disconnect_callback: + await self._disconnect_callback(f"serial_write_failed: {exc}") async def disconnect(self): """Close the serial connection.""" diff --git a/src/meshcore/tcp_cx.py b/src/meshcore/tcp_cx.py index 497c3b2..2a66b7f 100644 --- a/src/meshcore/tcp_cx.py +++ b/src/meshcore/tcp_cx.py @@ -137,7 +137,12 @@ class TCPConnection: size = len(data) pkt = b"\x3c" + size.to_bytes(2, byteorder="little") + data logger.debug(f"sending pkt : {pkt}") - self.transport.write(pkt) + try: + self.transport.write(pkt) + except (OSError, ConnectionResetError) as exc: + logger.warning(f"TCP write failed: {exc}") + if self._disconnect_callback: + await self._disconnect_callback(f"tcp_write_failed: {exc}") async def disconnect(self): """Close the TCP connection."""