Skip to main content

IP CommandMic

Open protocol documentation and a Python library for integrating software with the Ethernet CommandMic used by Icom F5330D and F6330D radios.

ip-commandmic implements both ends of the connection:

  • replace the physical CommandMic with software that controls and exchanges audio with a real radio; or
  • replace the radio with software that receives controls and microphone audio from a physical CommandMic while driving its display and speaker.

The goal is a reusable integration layer—not just one microphone emulator. Projects can build radioless AllStarLink nodes, dispatch or logging systems, browser gateways, accessibility tools, automation, multi-radio controllers, or custom input devices without reimplementing the wire protocol.

This independent interoperability project is not affiliated with or endorsed by Icom Incorporated.

Status

Version 1.0.1 is stable and available from PyPI. Both endpoint roles, ordinary controls, the primary display, indicators, soft power, PTT and bidirectional low-latency audio have been tested against real hardware.

Some extended display characters, auxiliary states, key chords/accessories and advanced radio-managed functions remain under investigation. See the implementation status for the concise boundary and the feature matrix for detailed evidence coverage.

Install

The wire protocol and application-fed audio APIs have no required third-party runtime dependencies:

python -m pip install ip-commandmic

Install native audio-device support when the application needs the computer's speakers or microphone:

python -m pip install "ip-commandmic[audio]"

Python 3.11 or newer is required.

Choose an endpoint role

What is connected Library class Software becomes
Real F5330D/F6330D radio SoftwareCommandMicEndpoint The CommandMic
Physical or software CommandMic SoftwareRadioEndpoint The radio-side application

Control a real radio

from pathlib import Path
from time import monotonic, sleep
from ip_commandmic import SoftwareCommandMicEndpoint

mic = SoftwareCommandMicEndpoint(
    local_ip="192.168.0.2",
    radio_ip="192.168.0.1",
    microphone_device=None,
    enable_tx=False,
    play_rx_audio=False,
    audit_path=Path("commandmic.jsonl"),
)
mic.start()
deadline = monotonic() + 10
while not mic.state.snapshot()["controls_ready"] and monotonic() < deadline:
    sleep(0.05)
if not mic.state.snapshot()["controls_ready"]:
    raise TimeoutError("CommandMic did not become ready")
mic.key("p1", "press")
mic.key("p1", "release")
mic.stop()

Operate a physical CommandMic

from pathlib import Path
from time import monotonic, sleep
from ip_commandmic import DisplayBuffer, SoftwareRadioConfig, SoftwareRadioEndpoint

radio = SoftwareRadioEndpoint(
    SoftwareRadioConfig(local_ip="192.168.0.1", mic_ip="192.168.0.2"),
    Path("commandmic.jsonl"),
)
radio.start()
deadline = monotonic() + 10
while not radio.state.snapshot()["controls_ready"] and monotonic() < deadline:
    sleep(0.05)
if not radio.state.snapshot()["controls_ready"]:
    raise TimeoutError("CommandMic did not become ready")
radio.send_display(DisplayBuffer.from_primary_text("HELLO"))
radio.send_led("green")
radio.stop()

Applications should handle endpoint errors and keep transmit explicitly gated. The complete lifecycle, audio and state APIs are documented in the Python API guide.

What the library provides

  • Lossless TCP framing, byte stuffing, CRC and stream reassembly.
  • Typed messages and raw unknown-message preservation.
  • Startup, identity, heartbeat, reconnect and soft-power state machines.
  • Canonical controls, PTT, display, LED, backlight, gain and volume models.
  • RTP/PT125 audio: 8 kHz mono signed 16-bit big-endian PCM in 20 ms packets.
  • Bounded sources, sinks, jitter handling, recording and common-file conversion.
  • Hardware-free bidirectional conformance and sanitized regression fixtures.
  • An independent Wireshark dissector.

The protocol specification is language-independent. Python is the tested reference implementation, not a requirement for independent implementations.

Documentation

Start at the documentation index:

Documentation stays beside the source so protocol claims, implementation, fixtures and tests can be reviewed and versioned together.

Related applications

Development

python -m venv .venv
python -m pip install -e ".[audio,dev]"
python -m pytest -q

See CONTRIBUTING.md before submitting protocol mappings. Unknown bytes must remain lossless, and hardware claims require repeatable evidence with privacy-safe fixtures.

Safety

Connecting either endpoint actively sends network traffic. Disconnect the hardware endpoint being replaced. Transmit-capable testing requires explicit arming and suitable RF containment. Do not perform broad hardware fuzzing.

Raw captures, codeplugs, voice, device identifiers, proprietary software and copyrighted manuals are excluded from the public repository. See SECURITY.md, LICENSE and NOTICE.md.

Release files for ip-commandmic 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ip-commandmic 1.0.1
File Size Uploaded
ip_commandmic-1.0.1.tar.gz 206.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ip-commandmic 1.0.1
File Interpreter ABI Platform
ip_commandmic-1.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 301.7 kB

Release files / ip_commandmic-1.0.1.tar.gz

Download URL ip_commandmic-1.0.1.tar.gz
Size 206.6 kB
Tags Source
SHA-256 checksum
How to use checksums
7867060eb8720802285cab248a12fa83f16a743df2b5aebd8b1ed6ecff8d5a0f
BLAKE2b-256 checksum
How to use checksums
c9771e33767bd8477f684e0ccd89363b9e5cc97ec3d5f48f57a3da59e01f22d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.

Transparency log

Release files / ip_commandmic-1.0.1-py3-none-any.whl

Download URL ip_commandmic-1.0.1-py3-none-any.whl
Size 95.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b7af21b52cccc5c556f87f26b8f83a305acbb279450767d948be4a268417398f
BLAKE2b-256 checksum
How to use checksums
484b8464fddbc195b3f693054969379756c2853644cd7c4cd0e5178a78d5c6d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page