{"id":25409222,"url":"https://github.com/smkrv/picadsb-multiplexer","last_synced_at":"2026-03-12T01:00:42.228Z","repository":{"id":277376425,"uuid":"932189349","full_name":"smkrv/picadsb-multiplexer","owner":"smkrv","description":"TCP multiplexer for MicroADSB (picADSB) USB receivers to share ADS-B data with multiple clients. Works as standalone Python app or Docker container.","archived":false,"fork":false,"pushed_at":"2025-02-24T17:08:06.000Z","size":1829,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-20T06:30:42.569Z","etag":null,"topics":["ads-b","adsb","adsb-receiver","beast","dump1090","microadsb","mode-s","picadsb"],"latest_commit_sha":null,"homepage":"https://github.com/smkrv/picadsb-multiplexer","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/smkrv.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-02-13T14:15:06.000Z","updated_at":"2025-02-24T17:08:09.000Z","dependencies_parsed_at":"2025-04-13T19:48:30.497Z","dependency_job_id":null,"html_url":"https://github.com/smkrv/picadsb-multiplexer","commit_stats":null,"previous_names":["smkrv/picadsb-multiplexer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/smkrv/picadsb-multiplexer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smkrv%2Fpicadsb-multiplexer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smkrv%2Fpicadsb-multiplexer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smkrv%2Fpicadsb-multiplexer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smkrv%2Fpicadsb-multiplexer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smkrv","download_url":"https://codeload.github.com/smkrv/picadsb-multiplexer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smkrv%2Fpicadsb-multiplexer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30410355,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T00:40:14.898Z","status":"ssl_error","status_checked_at":"2026-03-12T00:40:08.439Z","response_time":84,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ads-b","adsb","adsb-receiver","beast","dump1090","microadsb","mode-s","picadsb"],"created_at":"2025-02-16T08:20:06.804Z","updated_at":"2026-03-12T01:00:42.209Z","avatar_url":"https://github.com/smkrv.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ADS-B Multiplexer for MicroADSB | adsbPIC by Sprut\n\n\u003cimg src=\"assets/images/IMG_8767.jpg\" alt=\"MicroADSB | adsbPIC by Sprut\" style=\"width: 35%; max-width: 1140px; max-height: 960px; aspect-ratio: 19/16; object-fit: contain;\"/\u003e\u003cimg src=\"assets/images/IMG_8769.jpg\" alt=\"MicroADSB | adsbPIC by Sprut\" style=\"width: 35%; max-width: 1140px; max-height: 960px; aspect-ratio: 19/16; object-fit: contain;\"/\u003e\u003cimg src=\"assets/images/IMG_8771.jpg\" alt=\"MicroADSB | adsbPIC by Sprut\" style=\"width: 35%; max-width: 1140px; max-height: 960px; aspect-ratio: 19/16; object-fit: contain;\"/\u003e\u003cimg src=\"assets/images/IMG_8772.jpg\" alt=\"MicroADSB | adsbPIC by Sprut\" style=\"width: 35%; max-width: 1140px; max-height: 960px; aspect-ratio: 19/16; object-fit: contain;\"/\u003e\n\n\nA Docker-based TCP multiplexer for MicroADSB (adsbPIC) USB receivers that allows sharing ADS-B data with multiple clients (like dump1090).   \n\nⓘ Can also be used without Docker as a system service using Python environment only, instructions [available here](#direct-python-installation-and-usage-without-docker).\n\nIf you have a USB ADS-B receiver like this, you can easily contribute aircraft data to various flight tracking services like FlightRadar24, FlightAware, ADSBHub, OpenSky Network, ADS-B Exchange, ADSB.lol and many others. Despite its age and simplicity, MicroADSB / adsbPIC by Sprut often outperforms many cheap RTL-SDR dongles in ADS-B reception quality and stability.\n\nThe device works perfectly on Raspberry Pi and other Unix-based systems, making it an excellent choice for feeding data to popular aggregators.    \n\n## Features\n\n- Supports MicroADSB USB receivers (microADSB / adsbPIC)\n- Implements Beast Binary Format v2.0 for maximum compatibility\n- Advanced message validation using [pyModeS](https://github.com/junzis/pyModeS) library:\n  - Reliable CRC computation and verification\n  - Robust error detection\n- Dual-mode operation:\n  - TCP server for multiple client connections\n  - TCP client for forwarding data to remote servers\n- High-performance message processing:\n  - Up to 500 messages/sec on 1 GHz CPU\n  - Optimized CRC calculation\n  - Efficient memory usage (~5 MB/1k connections)\n- Real-time statistics and monitoring\n- Configurable TCP ports and device settings\n- Docker support with automatic builds\n- Proper device initialization and error handling\n- Automatic reconnection on device errors\n\n## Protocol Support\n\n### Beast Binary Format\n- Full implementation of Beast Binary Format v2.0\n- Supports all message types:\n  - Mode-S Short (DF17, 7 bytes)\n  - Mode-S Long (14 bytes)\n  - Mode-A/C with MLAT\n- Features:\n  - 6-byte precision timestamps\n  - CRC-24 validation\n  - Proper escape sequence handling\n  - Compatible with dump1090 and other tools\n\n## Device Specifications\n- Original adsbPIC creator: Joerg Bredendiek — [Sprut](https://sprut.de/electronic/pic/projekte/adsb/adsb_en.html)\n- Device: MicroADSB USB receiver (≈2010-20??)\n- Manufacturer: Miroslav Ionov\n  - MicroADSB.com (website no longer available), last archived copy on WebArchive: [September 18, 2024](https://web.archive.org/web/20240918230020/http://www.microadsb.com/)\n  - Anteni.net (active as of Feb 2025)\n- Microcontroller: PIC18F2550\n- Firmware: Joerg Bredendiek — [Sprut](https://sprut.de)\n- Maximum theoretical frame rate: 200,000 fpm\n- Practical maximum frame rate: ≈6,000 fpm\n- Communication: USB CDC (115200 baud)\n- Message format: ASCII, prefixed with '*', terminated with ';'\n\n## Requirements\n\n- Docker\n- Docker Compose (optional)\n- USB port for the MicroADSB device\n- Linux system with udev support\n\n## Quick Start\n\nⓘ Set DIP switch 1 to ON position, while keeping others OFF:\n\n```console\n 1   2   3   4  \n┌─┐ ┌─┐ ┌─┐ ┌─┐  \n│█│ │ │ │ │ │ │  \n│ │ │█│ │█│ │█│  \n└─┘ └─┘ └─┘ └─┘  \nON  OFF OFF OFF\n```\n\n### Using Docker Compose\n\n1. Create a `docker-compose.yml`:\n```yaml\nservices:\n  picadsb-multiplexer:\n    image: ghcr.io/smkrv/picadsb-multiplexer:latest\n    container_name: picadsb-multiplexer\n    restart: unless-stopped\n    devices:\n      - /dev/ttyACM0:/dev/ttyACM0\n    ports:\n      - \"31002:31002\"\n    environment:\n      - ADSB_TCP_PORT=31002\n      - ADSB_DEVICE=/dev/ttyACM0\n      - ADSB_LOG_LEVEL=INFO\n      - ADSB_REMOTE_HOST= # Indicate if required\n      - ADSB_REMOTE_PORT= # Indicate if required\n    volumes:\n      - ./logs:/app/logs\n```\n\n2. Start the service:\n```bash\ndocker-compose up -d\n```\n\n### Using Docker Run\n\n```bash\ndocker run -d \\\n    --name picadsb-multiplexer \\\n    --serial=/dev/ttyACM0:/dev/ttyACM0 \\\n    -p 31002:31002 \\\n    -e ADSB_TCP_PORT=31002 \\\n    -e ADSB_DEVICE=/dev/ttyACM0 \\\n    -e ADSB_LOG_LEVEL=INFO \\\n    -e ADSB_REMOTE_HOST=localhost \\ # Indicate if required\n    -e ADSB_REMOTE_PORT=30005 \\ # Indicate if required\n    -v $(pwd)/logs:/app/logs \\\n    ghcr.io/smkrv/picadsb-multiplexer:latest\n```\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| ADSB_TCP_PORT | TCP port for client connections | 31002 |\n| ADSB_DEVICE | Path to USB device | /dev/ttyACM0 |\n| ADSB_LOG_LEVEL | Logging level (DEBUG, INFO, WARNING, ERROR) | INFO |\n| ADSB_REMOTE_HOST | Remote server host for forwarding (optional) | |\n| ADSB_REMOTE_PORT | Remote server port for forwarding (optional) | |\n\n\n#### TCP Server Mode\n- Accepts multiple client connections\n- Ideal for feeding multiple services simultaneously\n- Example services:\n  - dump1090\n  - FlightAware\n  - ADSBHub\n  - OpenSky Network\n  - ADS-B Exchange\n  - ADSB.lol\n\n#### TCP Client Mode\n- Forwards data to a remote server\n- Maintains persistent connection\n- Automatic reconnection on failures\n- Example usage:\n```yaml\nservices:\n  picadsb-multiplexer:\n    environment:\n      - ADSB_REMOTE_HOST=feed.adsbexchange.com\n      - ADSB_REMOTE_PORT=30005\n```\n\n### Performance Tuning\n\n#### Memory Usage\n- Base footprint: ~5 MB\n- Per-client overhead: ~2 KB\n- Maximum recommended clients: 1000\n\n#### CPU Usage\n- Idle: \u003c1% on Raspberry Pi 3\n- Peak: ~5-10% at 500 msg/sec\n- CRC calculation: Optimized with lookup table\n\n### Device Permissions\n\nThe container needs access to the USB device. Make sure the device is properly mapped in the Docker configuration:\n\n```yaml\ndevices:\n  - /dev/ttyACM0:/dev/ttyACM0\n```\n\nYou might need to add udev rules on the host system:\n\n```bash\n# Create a new udev rule\necho 'SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"04d8\", ATTRS{idProduct}==\"000a\", MODE=\"0666\"' | \\\nsudo tee /etc/udev/rules.d/99-microadsb.rules\n\n# Reload udev rules\nsudo udevadm control --reload-rules\nsudo udevadm trigger\n```\n\n## Integration with dump1090\n\n### Using Docker\n\n```bash\n# Start dump1090 with network input from multiplexer\ndocker run -d \\\n    --name dump1090 \\\n    --network host \\\n    antirez/dump1090 \\\n    --net-only \\\n    --net-ri-port 31002\n```\n\n### Using Native Installation\n\n```bash\ndump1090 --net-only --net-ri-port 31002\n```\n\n## Building from Source\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/smkrv/picadsb-multiplexer.git\ncd picadsb-multiplexer\n```\n\n2. Build the Docker image:\n```bash\ndocker build -t picadsb-multiplexer .\n```\n\n## Development\n\n### Project Structure\n\n```\n.\n├── Dockerfile\n├── LICENSE\n├── README.md\n├── adsb_message_parser.py\n├── assets\n│   └── images\n│       ├── IMG_8767.jpg\n│       ├── IMG_8768.jpg\n│       ├── IMG_8769.jpg\n│       ├── IMG_8771.jpg\n│       └── IMG_8772.jpg\n├── docker-compose.yml\n├── entrypoint.sh\n├── picadsb-multiplexer.py\n├── requirements.txt\n├── .dockerignore\n└── .github\n    └── workflows\n        └── docker-publish.yml\n```\n\n### Running Tests\n\n```bash\n# Run the multiplexer in debug mode\ndocker run -it --rm \\\n    --serial=/dev/ttyACM0:/dev/ttyACM0 \\\n    -e ADSB_LOG_LEVEL=DEBUG \\\n    picadsb-multiplexer\n```\n\n## Monitoring\n\n### Logs\n\nLogs are stored in the `logs` directory:\n- `picadsb-multiplexer_YYYYMMDD_HHMMSS.log`: Detailed application log\n- Container logs can be viewed with `docker logs picadsb-multiplexer`\n\n### Statistics\n\nThe multiplexer maintains real-time statistics:\n- Messages processed\n- Messages per minute\n- Client connections\n- Error counts\n\n## Troubleshooting\n\n### Common Issues\n\n1. Device not found:\n```bash\n# Check device presence\nls -l /dev/ttyACM*\n\n# Check USB device\nlsusb | grep \"04d8:000a\"\n```\n\n2. Permission denied:\n```bash\n# Add current user to dialout group\nsudo usermod -a -G dialout $USER\n```\n\n3. Connection refused:\n```bash\n# Check if port is open\nnetstat -tuln | grep 31002\n```\n\n### Debug Mode\n\nEnable debug logging:\n```bash\ndocker-compose up -d -e ADSB_LOG_LEVEL=DEBUG\n```\n\n\n### Performance Metrics\n```\nMessages/sec: 500\nBeast conversion: 99.9%\nCRC validation: 99.9%\nBuffer usage: 2%\nActive clients: 5\nRemote connection: Connected\n```\n\n---\n\n## ADS-B Message Monitor ([adsb_message_parser.py](/adsb_message_parser.py))\n\nA real-time monitoring tool for ADS-B messages that provides a formatted display of aircraft surveillance data.\n\n### Features\n- Real-time display of ADS-B messages in a structured table format\n- Message type identification and description\n- Statistical analysis of received messages\n- Support for various ADS-B message formats (DF0, DF4, DF5, DF17, DF20)\n- Filtering of keep-alive messages\n- Session statistics with message type distribution\n\n### Usage\n```bash\npython3 adsb_message_parser.py [--host HOST] [--port PORT]\n```\n\n### Arguments\n- `--host`: Server host address (default: localhost)\n- `--port`: Server port number (default: 31002)\n\n### Example Output\n```\nADS-B Message Monitor\nConnected to localhost:31002\n\nTimestamp               | Type     | Message                     | Description\n------------------------------------------------------------------------------------------\n2025-02-14 15:03:00.012 | 28       | *28000000000000;            | Extended Squitter (DF5)\n```\n\nA real-time monitoring tool for ADS-B messages that provides a formatted display of aircraft surveillance data. Designed for quick testing and debugging of ADS-B receivers with human-readable output, message type identification, and live statistics tracking.\n\n---\n\n### Direct Python Installation and Usage (Without Docker)\n\n#### Quick Start\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/smkrv/picadsb-multiplexer/tree/main\ncd picadsb-multiplexer\n```\n\n2. Install required dependency:\n```bash\npip3 install pyserial\n```\n\n#### Device Setup (Recommended)\n\nCreate persistent device name with udev rule:\n```bash\nsudo nano /etc/udev/rules.d/99-picadsb.rules\n```\nAdd rule for automatic device recognition:\n```\nSUBSYSTEM==\"tty\", ATTRS{idVendor}==\"04d8\", ATTRS{idProduct}==\"000a\", SYMLINK+=\"ttyACM0\"\n```\nApply new rule:\n```bash\nsudo udevadm control --reload-rules\n```\n\n#### Usage\n\n#### Basic Operation\n\nStart the multiplexer:\n```bash\npython3 picadsb-multiplexer.py --port 31002 --serial /dev/ttyACM0\n```\n\n#### Testing Reception\n\nVerify data flow using included test client:\n```bash\npython3 adsb_message_parser.py [--host localhost] [--port 31002]\n```\n\n#### Integration with dump1090\n\nConnect to multiplexer using dump1090:\n```bash\ndump1090 --net-only --net-ri-port 31002\n```\n\n#### Running as System Service\n\n#### Service Setup\n\n1. Create systemd service file:\n```bash\nsudo nano /etc/systemd/system/picadsbmultiplexer.service\n```\n\n2. Configure service:\n```ini\n[Unit]\nDescription=picadsbmultiplexer TCP Bridge\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/python3 /path/to/picadsb-multiplexer.py --port 31002 --serial /dev/ttyACM0\nWorkingDirectory=/path/to/script/directory\nStandardOutput=append:/var/log/picadsbmultiplexer.log\nStandardError=append:/var/log/picadsbmultiplexer.error.log\nRestart=always\nUser=your_username\n\n[Install]\nWantedBy=multi-user.target\n```\n\n#### Service Management\n\nEnable and start:\n```bash\nsudo systemctl daemon-reload\nsudo systemctl enable picadsbmultiplexer\nsudo systemctl start picadsbmultiplexer\n```\n\nCheck status:\n```bash\nsudo systemctl status picadsbmultiplexer\n```\n\n#### Monitoring\n\n#### Log Access\n\nService logs:\n```bash\nsudo journalctl -u picadsbmultiplexer -f\n```\n\nApplication logs:\n```bash\ntail -f logs/adsb_muxer_*.log\n```\n\n---\n\n## Contributing\n\n1. Fork the repository\n2. Create your feature branch\n3. Commit your changes\n4. Push to the branch\n5. Create a Pull Request\n\n## Acknowledgments\n\n- Original adsbPIC creator \u0026 firmware by Joerg Bredendiek — [Sprut](https://sprut.de)\n- Original MicroADSB device by Miroslav Ionov\n- [dump1090](https://github.com/antirez/dump1090) project for ADS-B decoding\n- [pyModeS](https://github.com/junzis/pyModeS) The Python ADS-B/Mode-S Decoder\n\n## Legal Disclaimer and Limitation of Liability  \n\n### Software Disclaimer  \n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,   \nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A   \nPARTICULAR PURPOSE AND NONINFRINGEMENT.  \n\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   \nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   \nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER   \nDEALINGS IN THE SOFTWARE.  \n\n## 📝 License\n\nAuthor: SMKRV\n[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) - see [LICENSE](LICENSE) for details.\n\n## 💡 Support the Project\n\nThe best support is:\n- Sharing feedback\n- Contributing ideas\n- Recommending to friends\n- Reporting issues\n- Star the repository\n\nIf you want to say thanks financially, you can send a small token of appreciation in USDT:\n\n**USDT Wallet (TRC10/TRC20):**\n`TXC9zYHYPfWUGi4Sv4R1ctTBGScXXQk5HZ`\n\n*Open-source is built by community passion!* 🚀\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nMade with ❤️ for the Aviation \u0026 Radio Enthusiasts Community\n\n[Report Bug](https://github.com/smkrv/picadsb-multiplexer/issues) · [Request Feature](https://github.com/smkrv/picadsb-multiplexer/issues)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmkrv%2Fpicadsb-multiplexer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmkrv%2Fpicadsb-multiplexer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmkrv%2Fpicadsb-multiplexer/lists"}