| .cursor/commands | ||
| .dockerignore | ||
| .env | ||
| .gitignore | ||
| .version_info | ||
| auth_token.py | ||
| ble_pairing_helper.py | ||
| ble_scan_helper.py | ||
| debug_ble_connection.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| enums.py | ||
| install.ps1 | ||
| install.sh | ||
| migrate_config.py | ||
| packet_capture.py | ||
| README.md | ||
| requirements.txt | ||
| scan_meshcore_network.py | ||
| uninstall.sh | ||
MeshCore Packet Capture
A standalone Python script for capturing and analyzing packets from MeshCore companion radios. The script connects to MeshCore devices via Bluetooth Low Energy (BLE), serial, or TCP connection, captures incoming packets, and outputs structured data to console, file, and MQTT broker.
Based on the original meshcoretomqtt project by Cisien and uses the official meshcore Python package.
Quick Start
Install
bash <(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)
Uninstall
bash <(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/uninstall.sh)
Features
- Packet Capture: Captures incoming packets from MeshCore devices
- Connection Types: Supports BLE, serial, and TCP connections
- Packet Analysis: Parses packet headers, routes, payloads, and metadata
- RF Data: Captures signal quality metrics (SNR, RSSI)
- Multi-Broker MQTT: Supports up to 4 MQTT brokers simultaneously
- Auth Token Authentication: JWT-based authentication using device private key
- TLS/WebSocket Support: Secure connections with TLS/SSL and WebSocket transport
- Topic Templates: Per-broker topic templates
Requirements
- Python 3.7+
meshcorepackage (official MeshCore Python library)paho-mqttpackage (for MQTT functionality)
Note: For Docker deployment, this application is best deployed on Linux systems due to Bluetooth Low Energy (BLE) and serial device access requirements. While Docker containers can run on macOS and Windows, BLE functionality may be limited or require additional configuration.
Installation
Local Installation
pip install meshcore paho-mqtt
Docker Installation
The project includes Docker support for easy deployment:
# Build the Docker image
docker build -t meshcore-capture .
# Run with Docker Compose (recommended)
docker-compose up -d
# Or run directly with Docker
docker run --privileged --device=/dev/ttyUSB0 \
-v $(pwd)/data:/app/data \
-e PACKETCAPTURE_CONNECTION_TYPE=serial \
meshcore-capture
See the Docker Deployment section below for detailed instructions.
Configuration
The script uses environment files for configuration.
Environment Files
The script loads configuration from:
.env- Default configuration (committed to repository).env.local- Local overrides (not committed, for your specific setup)
All environment variables are prefixed with PACKETCAPTURE_. See the .env file for all available options.
Configuration Variables
Configuration is handled via environment variables and .env files. The installer will create a .env.local file with your settings.
Environment Variables
Connection Settings
PACKETCAPTURE_CONNECTION_TYPE:ble,serial, ortcpPACKETCAPTURE_BLE_ADDRESS: Specific BLE device address (optional)PACKETCAPTURE_BLE_DEVICE_NAME: BLE device name to scan for (optional)PACKETCAPTURE_SERIAL_PORTS: Comma-separated list of serial ports to tryPACKETCAPTURE_TCP_HOST: TCP host address (default: localhost)PACKETCAPTURE_TCP_PORT: TCP port number (default: 5000)PACKETCAPTURE_TIMEOUT: Connection timeout in secondsPACKETCAPTURE_MAX_CONNECTION_RETRIES: Maximum MeshCore connection retry attempts (0 = infinite)PACKETCAPTURE_CONNECTION_RETRY_DELAY: Delay between MeshCore reconnection attempts (seconds)PACKETCAPTURE_HEALTH_CHECK_INTERVAL: How often to check connection health (seconds)
MQTT Settings
The script supports up to 4 MQTT brokers (MQTT1, MQTT2, MQTT3, MQTT4). Each broker can be configured independently:
Broker 1 (Primary):
PACKETCAPTURE_MQTT1_ENABLED: Enable/disable MQTT broker 1PACKETCAPTURE_MQTT1_SERVER: MQTT broker addressPACKETCAPTURE_MQTT1_PORT: MQTT broker portPACKETCAPTURE_MQTT1_USERNAME/PACKETCAPTURE_MQTT1_PASSWORD: Authentication credentialsPACKETCAPTURE_MQTT1_TRANSPORT: Transport type (tcporwebsockets)PACKETCAPTURE_MQTT1_USE_TLS: Enable TLS/SSL encryptionPACKETCAPTURE_MQTT1_TLS_VERIFY: Verify TLS certificates (default: true)PACKETCAPTURE_MQTT1_USE_AUTH_TOKEN: Use auth token authenticationPACKETCAPTURE_MQTT1_TOKEN_AUDIENCE: Token audience for auth tokenPACKETCAPTURE_MQTT1_CLIENT_ID_PREFIX: Client ID prefixPACKETCAPTURE_MQTT1_QOS: Quality of Service levelPACKETCAPTURE_MQTT1_RETAIN: Retain messagesPACKETCAPTURE_MQTT1_KEEPALIVE: Keep-alive interval
Brokers 2-4: Same pattern with MQTT2_, MQTT3_, MQTT4_ prefixes
Global MQTT Settings:
PACKETCAPTURE_MAX_MQTT_RETRIES: Maximum MQTT connection retry attempts (0 = infinite)PACKETCAPTURE_MQTT_RETRY_DELAY: Delay between MQTT reconnection attempts (seconds)PACKETCAPTURE_EXIT_ON_RECONNECT_FAIL: Exit when reconnection attempts fail (default: true)
Private Key Settings:
PACKETCAPTURE_PRIVATE_KEY: Device private key for auth token authentication (hex string)PACKETCAPTURE_PRIVATE_KEY_FILE: Path to file containing device private key
Note: Private keys can be provided via environment variable, file path, or .env.local file.
Topic Templates
Topics support template variables:
{IATA}: Replaced with your IATA code in uppercase (e.g., "SEA"){IATA_lower}: Replaced with your IATA code in lowercase (e.g., "sea"){PUBLIC_KEY}: Replaced with device public key
Examples:
meshcore/{IATA}/packetsbecomesmeshcore/SEA/packetsmeshcore/{IATA_lower}/packetsbecomesmeshcore/sea/packets
Authentication Methods
Username/Password Authentication:
PACKETCAPTURE_MQTT1_USERNAME=your_username
PACKETCAPTURE_MQTT1_PASSWORD=your_password
Auth Token Authentication (JWT):
PACKETCAPTURE_MQTT1_USE_AUTH_TOKEN=true
PACKETCAPTURE_MQTT1_TOKEN_AUDIENCE=mqtt.example.com
PACKETCAPTURE_PRIVATE_KEY=your_private_key_here
# OR
PACKETCAPTURE_PRIVATE_KEY_FILE=/path/to/private_key_file
Note: Auth token authentication requires the device's private key.
Transport Options:
tcp: Standard TCP connectionwebsockets: WebSocket connection (useful for web applications)
TLS/SSL Security:
PACKETCAPTURE_MQTT1_USE_TLS=true
PACKETCAPTURE_MQTT1_TLS_VERIFY=true # Verify certificates
Exit Behavior
The script handles MQTT disconnections by continuing to run and attempting reconnection. On reconnection failure, it exits after maximum retry attempts (configurable).
For BLE connections where disconnections may be transient:
# Exit when reconnection attempts fail (recommended for BLE)
PACKETCAPTURE_EXIT_ON_RECONNECT_FAIL=true
# Never exit, keep trying indefinitely
PACKETCAPTURE_EXIT_ON_RECONNECT_FAIL=false
PACKETCAPTURE_MAX_MQTT_RETRIES=0
Advert Settings
PACKETCAPTURE_ADVERT_INTERVAL_HOURS: Send flood adverts at this interval (0 = disabled, default = 11 hours)
Usage
Local Usage
# Basic usage
python packet_capture.py
# Save output to file
python packet_capture.py --output packets.json
# Disable MQTT publishing
python packet_capture.py --no-mqtt
# Enable verbose output (shows JSON packet data)
python packet_capture.py --verbose
# Enable debug output (shows all detailed debugging info)
python packet_capture.py --debug
Docker Deployment
The project includes Docker support for deployment.
Prerequisites
- Docker and Docker Compose installed
- Linux host system (recommended for BLE support)
Quick Start with Docker Compose
-
Clone and configure:
git clone <repository-url> cd meshcore-packet-capture -
Create configuration (optional):
# Create .env.local file with your settings cp .env.example .env.local # Edit .env.local with your configuration -
Start the service:
docker-compose up -d -
View logs:
docker-compose logs -f meshcore-capture
Docker Compose Configuration
The docker-compose.yml file includes privileged mode for device access, volume mounts for data storage, and environment variable configuration.
Manual Docker Commands
# Build the image
docker build -t meshcore-capture .
# Run with BLE connection
docker run --privileged \
-v $(pwd)/data:/app/data \
-e PACKETCAPTURE_CONNECTION_TYPE=ble \
-e PACKETCAPTURE_MQTT1_SERVER=your-mqtt-broker \
meshcore-capture
# Run with serial connection
docker run --privileged \
--device=/dev/ttyUSB0:/dev/ttyUSB0 \
-v $(pwd)/data:/app/data \
-e PACKETCAPTURE_CONNECTION_TYPE=serial \
-e PACKETCAPTURE_SERIAL_PORTS=/dev/ttyUSB0 \
meshcore-capture
# Run with TCP connection
docker run \
-v $(pwd)/data:/app/data \
-e PACKETCAPTURE_CONNECTION_TYPE=tcp \
-e PACKETCAPTURE_TCP_HOST=your-tcp-server \
-e PACKETCAPTURE_TCP_PORT=5000 \
meshcore-capture
Configuration in Docker
Configuration can be provided via environment variables or volume-mounted .env.local files.
Platform Considerations
- Linux: Full BLE and serial support
- macOS: Full BLE and serial support, limited BLE support in containers
- Windows: Limited BLE support (currently untested), serial connections work with proper device mounting
Troubleshooting Docker Deployment
BLE Connection Issues:
# Try host networking for BLE discovery
docker run --privileged --network=host meshcore-capture
Serial Device Access:
# Ensure device permissions
sudo chmod 666 /dev/ttyUSB0
# Or add user to dialout group
sudo usermod -a -G dialout $USER
MQTT Connection Issues:
# Check network connectivity
docker exec -it meshcore-capture ping mqtt-broker
# View container logs
docker logs meshcore-capture
Output Levels
The script supports three output levels:
- Normal (default): Shows minimal packet info line only
- --verbose: Adds JSON packet data output
- --debug: Adds all detailed debugging information
Output Format
Captured packets are output in JSON format with the following structure:
{
"origin": "Device Name",
"origin_id": "device_public_key",
"timestamp": "2024-01-01T12:00:00.000000",
"type": "PACKET",
"direction": "rx",
"time": "12:00:00",
"date": "01/01/2024",
"len": "45",
"packet_type": "4",
"route": "F",
"payload_len": "32",
"raw": "F5930103807E5F1EDE680070B9F3FCF238AA6B64BDEA8B4FDC4E2A",
"SNR": "12.5",
"RSSI": "-65",
"hash": "A1B2C3D4E5F67890"
}
MQTT Topics
meshcore/status: Device online/offline statusmeshcore/packets: Full packet datameshcore/raw: Raw packet data (required for map.w0z.is)
Troubleshooting
Connection Issues
Script stops receiving packets but doesn't reconnect:
- The script now includes automatic reconnection logic
- Check the logs for connection health check messages
- Adjust
health_check_intervalin config to check more frequently - Increase
max_connection_retriesif you want more retry attempts
BLE connection keeps dropping:
- Ensure the MeshCore device is within range
- Check for interference from other Bluetooth devices
- Try increasing
connection_retry_delayto give the device more time to recover - Set
max_connection_retries = 0for infinite retry attempts
MQTT connection issues:
- Verify MQTT broker settings in config
- Check network connectivity to MQTT broker
- The script will automatically retry MQTT connections on failure
- Adjust
mqtt_retry_delayif reconnection attempts are too frequent
Debugging
Enable debug mode for detailed logging:
python packet_capture.py --debug
This will show:
- Connection health check results
- Reconnection attempts and results
- Detailed packet parsing information
- MQTT connection status
Files
packet_capture.py: Main capture scriptenums.py: Packet type and flag definitionsinstall.sh: Installation scriptuninstall.sh: Uninstallation scriptscan_meshcore_network.py: Network scanner for MeshCore nodes.env: Default configuration template.env.local: Local configuration (created by installer)
Contributing
Contributions are welcome! Please open GitHub issues for bug reports and feature requests, or submit pull requests for improvements.
Credits
This project is based on the original meshcoretomqtt project by Cisien, which provides a foundation for MeshCore packet capture and MQTT integration. The project uses the official meshcore Python package for device communication.