# Meshtastic MQTT Parser

A lightweight Python library for parsing Meshtastic MQTT messages into JSON format. This tool makes it easy to build applications that interact with Meshtastic mesh networks via MQTT.

## Overview

This library connects to a Meshtastic MQTT broker and decodes various message types into JSON format, making it simple to process Meshtastic mesh network data in your Python applications.

## Features

- Connects to any Meshtastic MQTT broker
- Decrypts encrypted messages
- Parses all standard Meshtastic message types
- Outputs clean JSON format
- Message type filtering support
- Simple command-line interface

## Installation

Install from PyPI:

```bash
pip install meshtastic-mqtt-json
```

## usage
```bash
meshtastic_mqtt_json [options]
```

```python
from meshtastic_mqtt_json import MeshtasticMQTT

# Create client instance
client = MeshtasticMQTT()

# Register callbacks for specific message types
def on_text_message(json_data):
    print(f'Received text message: {json_data["decoded"]["payload"]}')

def on_position(json_data):
    print(f'Received position update: {json_data["decoded"]["payload"]}')

client.register_callback('TEXT_MESSAGE_APP', on_text_message)
client.register_callback('POSITION_APP', on_position)

# Connect to MQTT broker
client.connect(
    broker='mqtt.meshtastic.org',
    port=1883,
    root='msh/US/2/e/',
    channel='LongFast',
    username='meshdev',
    password='large4cats',
    key='AQ=='
)
```

### Callback System
The library provides a callback system that allows you to register handlers for specific message types. Each callback function receives a JSON object containing the parsed message data.

```python
# Register a callback
client.register_callback('MESSAGE_TYPE', callback_function)

# Unregister a callback
client.unregister_callback('MESSAGE_TYPE')
```

The callback function should accept a single parameter that will receive the JSON data:
```python
def my_callback(json_data):
    # json_data contains the parsed message
    print(json_data)
```

If no callback is registered for a message type, the message will be printed to the console by default.

### Command Line Options
| Option       | Description                   | Default               |
| ------------ | ------------------------------|---------------------- |
| `--broker`   | MQTT broker address           | `mqtt.meshtastic.org` |
| `--port`     | MQTT broker port              | `1883`                |   
| `--root`     | Root topic                    | `msh/US/2/e/`         |
| `--channel`  | Channel name                  | `LongFast`            |
| `--username` | MQTT username                 | `meshdev`             |
| `--password` | MQTT password                 | `large4cats`          |
| `--key`      | Encryption key                | `AQ==`                |
| `--filter`   | Filter specific message types |                       |

### Filter Example
```bash
python meshtastic_mqtt_json.py --filter "NODEINFO,POSITION,TEXT_MESSAGE"
```


## Supported Message Types

The library supports parsing of the following Meshtastic message types:
| Message Type                    | Description                   |
| ------------------------------- | ----------------------------- |
| **ADMIN_APP**                   | Administrative messages       |
| **ATAK_FORWARDER**              | ATAK forwarding messages      |
| **ATAK_PLUGIN**                 | ATAK plugin messages          |
| **AUDIO_APP**                   | Audio messages                |
| **DETECTION_SENSOR_APP**        | Sensor detection data         |
| **IP_TUNNEL_APP**               | IP tunneling messages         |
| **NEIGHBORINFO_APP**            | Neighbor information          |
| **NODEINFO_APP**                | Node information and details  |
| **PAXCOUNTER_APP**              | People counter data           |
| **POSITION_APP**                | GPS position updates          |
| **PRIVATE_APP**                 | Private messages              |
| **RANGE_TEST_APP**              | Range testing data            |
| **REMOTE_HARDWARE_APP**         | Remote hardware control       |
| **REPLY_APP**                   | Reply messages                |
| **ROUTING_APP**                 | Routing information           |
| **SERIAL_APP**                  | Serial communication          |
| **SIMULATOR_APP**               | Simulator messages            |
| **STORE_FORWARD_APP**           | Store and forward messages    |
| **TELEMETRY_APP**               | Device telemetry data         |
| **TEXT_MESSAGE_APP**            | Plain text messages           |
| **TEXT_MESSAGE_COMPRESSED_APP** | Compressed text messages      |
| **TRACEROUTE_APP**              | Network route tracing         |
| **WAYPOINT_APP**                | Waypoint information          |
| **ZPS_APP**                     | Zone/Position System messages |


## Roadmap
- [ ] Add support for custom node ID & names for the client
- [ ] Add support for custom MQTT servers besides the official Meshtastic server
- [ ] Create a PyPi package for easy import into other projects
- [ ] Create an examples folder with use cases for the library, such as an IRC relay, cli chat, logging, etc.

___

###### Mirrors for this repository: [acid.vegas](https://git.acid.vegas/meshtastic_mqtt_json) • [SuperNETs](https://git.supernets.org/acidvegas/meshtastic_mqtt_json) • [GitHub](https://github.com/acidvegas/meshtastic_mqtt_json) • [GitLab](https://gitlab.com/acidvegas/meshtastic_mqtt_json) • [Codeberg](https://codeberg.org/acidvegas/meshtastic_mqtt_json)
