Transport - icom-lan
Description: Python library for controlling Icom transceivers over LAN

Skip to content

# Transport

Low-level async UDP transport for the Icom LAN protocol. Most users should use `IcomRadio` instead.

## Class: `IcomTransport`

    from icom_lan import IcomTransport

Handles:

- UDP socket management via `asyncio.DatagramProtocol`
- Discovery handshake (Are You There → I Am Here → Are You Ready)
- Keep-alive ping loop (500ms interval)
- Sequence number tracking
- Retransmit request handling
- Packet queueing for consumers

### Constructor

    IcomTransport()

No parameters — the transport is configured via `connect()`.

## Methods

### `connect()`

    async def connect(self, host: str, port: int) -> None

Open UDP connection and perform discovery handshake.

Parameter | Type | Description
--- | --- | ---
`host` | `str` | Radio IP address
`port` | `int` | UDP port number

Raises: `TimeoutError` if discovery fails after 10 attempts.

### `disconnect()`

    async def disconnect(self) -> None

Close the UDP connection and stop background tasks (ping, retransmit).

### `send_tracked()`

    async def send_tracked(self, data: bytes) -> None

Send a packet with automatic sequence number assignment and tracking for retransmission.

### `receive_packet()`

    async def receive_packet(self, timeout: float = 5.0) -> bytes

Wait for the next incoming packet.

Raises: `asyncio.TimeoutError` if no packet arrives within timeout.

### `start_ping_loop()`

    def start_ping_loop(self) -> None

Start the background ping task (500ms interval).

### `start_retransmit_loop()`

    def start_retransmit_loop(self) -> None

Start the background retransmit request task (100ms interval).

## Attributes

Attribute | Type | Description
--- | --- | ---
`state` | `ConnectionState` | Current connection state
`my_id` | `int` | Local connection identifier
`remote_id` | `int` | Remote (radio) connection identifier
`send_seq` | `int` | Next outgoing tracked sequence number
`ping_seq` | `int` | Next outgoing ping sequence number
`tx_buffer` | `dict[int, bytes]` | Sent packets buffer (for retransmit)

## Enum: `ConnectionState`

    from icom_lan import ConnectionState

Value | Description
--- | ---
`DISCONNECTED` | Not connected
`CONNECTING` | Handshake in progress
`CONNECTED` | Ready for communication

## Internal Protocol Details

### Packet Handling

When a packet arrives, the transport:

1. Checks if it's a retransmit request → resends buffered packet
2. Checks if it's a ping → sends pong reply
3. Tracks sequence numbers for gap detection
4. Queues the packet for `receive_packet()` consumers

### Retransmit Logic

- Missing sequence numbers are detected by gaps in incoming seq numbers
- Retransmit requests are sent every 100ms
- After 4 failed retransmit attempts, the missing packet is abandoned
- Buffer holds up to 500 sent packets