MIT License
Connect Meshtastic radio networks using MQTT and HTTP.
WARNING: Work in progress
Refer to https://meshtastic.org/docs/settings/config/wifi#wifi-client for details on how to configure a Meshtastic device to use wifi and expose a TCP address.
Download the code and install it onto a system:
$ git clone https://github.com/geoffwhittington/meshtastic-bridge.git
Create a Python virtual environment
$ python3 -m venv meshtastic-bridge
Install the bridge dependencies
$ cd meshtastic-bridge
$ source bin/activate
$ pip install -r requirements.txt
There is nothing to install with Docker, the bridge is downloaded at the time it is run
The bridge is configured using a YAML file config.yaml
. It is composed of three sections, devices
, mqtt_servers
and pipelines
.
An example config.yaml
is provided below:
devices:
- name: remote
tcp: 192.168.86.39
active: true
mqtt_servers:
- name: external
server: broker.hivemq.com
port: 1883
topic: meshtastic/radio-network1
pipelines:
mqtt-to-radio:
- decrypt_filter:
key: '/home/user/keys/key.pem'
- radio_message_plugin:
device: remote
pipelines:
radio-to-mqtt:
- encrypt_filter:
key: '/home/user/keys/cert.pem'
- mqtt_plugin:
name: external
topic: mesh/tastic
devices
is a list of radios the bridge listens for packets or to where it can send packets.
pipelines
configuration. For example, my_radio
192.168.0.1
(Optional)/dev/ttyUSB0
(Optional)true
or false
. Default = true
.NOTE: If tcp
or serial
are not given the bridge will attempt to detect a radio attached to the serial port. Additional configuration may be needed to use the serial port with the Docker option.
mqtt_servers
is a list of MQTT servers the bridge listens for shared network traffic.
my_mqtt_server
server.mqttserver.com
mesh/network
mqtt-to-radio
(as in the example above)pipelines
is a list of ordered plugins (filters/actions) that run when a packet is detected by any connected radio. Each set is given a name; such as radio-to-mqtt
(as in the example above). Pipelines can run in any order, however plugins run in the order they are defined.
The following plugins can be used in the pipelines
section of config.yaml
:
Plugin | Description |
---|---|
debugger |
Log the packet to the system console |
message_filter |
Filters out packets from the bridge that match a specific criteria |
location_filter |
Filters out packets that originate too far from a specified device
|
webhook |
Send HTTP requests with custom payloads using packet information |
mqtt_plugin |
Send packets to a MQTT server |
encrypt_filter |
Encrypt a packet for a desired MQTT recipient |
decrypt_filter |
Decrypt a packet originating from MQTT |
radio_message_plugin |
Send a packet to a specified device
|
nostr_plugin |
Send a NoStr event to a relay |
owntracks_plugin |
Send location data to MQTT server for Owntracks |
debug
or info
. Default info
For example:
debugger:
log_level: debug
Useful for troubleshooting.
debug
or info
. Default info
fromId
values to allow or disallowtoId
values to allow or disallowmessage
values to allow or disallow. Supports Regex.For example:
message_filter:
from:
allow:
- !bd5ba0ec
- !f85bc0bc
disallow:
- !c15ba2ec
message:
disallow:
- Good night
debug
or info
. Default info
within
or outside
. Default within
For example
location_filter:
max_distance_km: 1000
debug
or info
. Default info
true
or false
. Default = true
.Placeholders can be used with the body value:
{LAT}
- Latitude associated with the POSITION packet. Empty if no value available.{LNG}
- Latitude associated with the POSITION packet. Empty if no value available.{MSG}
- Packet text or message
from the configuration (above){FID}
- The fromId
associated with the packet.{TID}
- The toId
associated with the packet.For example:
webhook:
active: true
body: '{"lat": "{LAT}", "lng": "{LNG}", "text_message": "{MSG}"}'
url: 'https://localhost:8000/message'
headers:
Authorization: Token {AUTH_TOKEN}
Content-type: application/json
debug
or info
. Default info
true
or false
. Default = true
.mqtt_servers
configurationFor example:
mqtt_plugin:
name: external
topic: meshtastic/topic
Placeholders can be used with the message value:
{MSG}
- Packet textdebug
or info
. Default info
For example:
encrypt_filter:
key: '/home/user/keys/cert.pem'
debug
or info
. Default info
For example:
decrypt_filter:
key: '/home/user/keys/key.pem'
debug
or info
. Default info
wss://nostr-pub.wellorder.net
, and wss://relay.damus.io
For example:
nostr_plugin:
private_key: "{NOSTR_PRIVATE_KEY}"
public_key: "npub1d0ja5d.......xw7jys4eqnk0"
relays:
- "wss://nostr-pub.wellorder.net"
Placeholders can be used with the message value:
{MSG}
- Packet textdebug
or info
. Default info
For example:
owntracks_plugin:
server_name: external
tid_table:
"1234": ["Van", "GV"]
"-5678": ["Home", "HR"]
Placeholders can be used with the message value:
{MSG}
- Packet textdebug
or info
. Default info
true
or false
. Default true
.devices
configurationto
value to another valueto
is used.For example:
Broadcasts all packets to the "remote" radio network that are destined to the node 12354345
.
radio_message_plugin:
device: remote
node_mapping:
12354345: ^all
Create a config.yaml
in the meshtastic-bridge
directory. Run:
$ source bin/activate
And:
python main.py
Create a config.yaml
with the desired settings and run the following Docker command:
docker run --rm --network host -v $(pwd)/config.yaml:/code/config.yaml gwhittington/meshtastic-bridge:latest