process should register message from mesh and transfer over to irc
This commit is contained in:
parent
34e6b9e9ae
commit
9e06503869
6 changed files with 215 additions and 97 deletions
|
@ -2,5 +2,9 @@
|
||||||
|
|
||||||
How to use:
|
How to use:
|
||||||
|
|
||||||
python main.py -d -j from@server.com -t to@server.com -m "test" -p supersecretpass
|
```bash
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
pip install -r requirements.txt
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
|
163
main.py
163
main.py
|
@ -1,102 +1,77 @@
|
||||||
#!/usr/bin/env python3
|
import time
|
||||||
|
import os
|
||||||
|
import meshtastic
|
||||||
|
import meshtastic.tcp_interface
|
||||||
|
from pubsub import pub
|
||||||
|
from send_to_irc import SendMsgBot
|
||||||
|
|
||||||
import logging
|
MESSAGE_FILE = "message.txt"
|
||||||
from getpass import getpass
|
|
||||||
from argparse import ArgumentParser
|
|
||||||
|
|
||||||
import slixmpp
|
def send_message_from_mesh():
|
||||||
# Mostly a carbon copy of https://slixmpp.readthedocs.io/en/latest/getting_started/sendlogout.html but will have other options.
|
if os.path.exists(MESSAGE_FILE):
|
||||||
|
with open(MESSAGE_FILE, 'r') as file:
|
||||||
|
message = file.read().strip()
|
||||||
|
|
||||||
|
if message:
|
||||||
|
# If you dont have irc...then you can just print/hook into your service here.
|
||||||
|
xmpp = SendMsgBot('mesh_bot@website.com', 'totallyrealpassword', 'accounttosend@website.com', message)
|
||||||
|
xmpp.register_plugin('xep_0030') # Service Discovery
|
||||||
|
xmpp.register_plugin('xep_0199') # XMPP Ping
|
||||||
|
|
||||||
|
# Connect to the XMPP server and start processing XMPP stanzas.
|
||||||
|
xmpp.connect()
|
||||||
|
xmpp.process(forever=False)
|
||||||
|
|
||||||
|
# Clear the file after sending the message
|
||||||
|
open(MESSAGE_FILE, 'w').close()
|
||||||
|
|
||||||
|
def onReceive(packet, interface):
|
||||||
|
# called when a packet arrives
|
||||||
|
if 'decoded' in packet:
|
||||||
|
print('decoded')
|
||||||
|
decoded = packet['decoded']
|
||||||
|
|
||||||
|
if 'TEXT_MESSAGE_APP' in packet['decoded']:
|
||||||
|
print('TEXT_MESSAGE_APP')
|
||||||
|
|
||||||
|
if 'TELEMTRY_APP' in packet['decoded']:
|
||||||
|
print('Telemetry found. Ignore')
|
||||||
|
|
||||||
|
if 'decoded' in packet and 'text' in packet['decoded']:
|
||||||
|
print(packet)
|
||||||
|
message = packet['decoded']['text']
|
||||||
|
|
||||||
|
# Write message to file
|
||||||
|
with open(MESSAGE_FILE, 'w') as file:
|
||||||
|
file.write(message)
|
||||||
|
|
||||||
|
# Notify send_message function
|
||||||
|
# pub.sendMessage('send_to_irc')
|
||||||
|
|
||||||
|
print(f"text message here: {message}")
|
||||||
|
else:
|
||||||
|
print('Not the text message')
|
||||||
|
print(packet)
|
||||||
|
|
||||||
|
|
||||||
class SendMsgBot(slixmpp.ClientXMPP):
|
|
||||||
|
|
||||||
"""
|
# Subscribe send_message function to the send_to_irc topic
|
||||||
A basic Slixmpp bot that will log in, send a message,
|
# pub.subscribe(send_message, 'send_to_irc')
|
||||||
and then log out.
|
# This does not work ATM, so doing a quick workaround.
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, jid, password, recipient, message):
|
# Initialize the meshtastic interface
|
||||||
slixmpp.ClientXMPP.__init__(self, jid, password)
|
interface = meshtastic.tcp_interface.TCPInterface(hostname='192.168.1.102') # repeater
|
||||||
|
# send message from client ip to repeater.
|
||||||
|
|
||||||
# The message we wish to send, and the JID that
|
# Subscribe onReceive function to the meshtastic.receive topic
|
||||||
# will receive it.
|
pub.subscribe(onReceive, "meshtastic.receive")
|
||||||
self.recipient = recipient
|
|
||||||
self.msg = message
|
|
||||||
|
|
||||||
# The session_start event will be triggered when
|
# Keep the script running to process incoming messages
|
||||||
# the bot establishes its connection with the server
|
try:
|
||||||
# and the XML streams are ready for use. We want to
|
while True:
|
||||||
# listen for this event so that we we can initialize
|
time.sleep(1)
|
||||||
# our roster.
|
send_message_from_mesh()
|
||||||
self.add_event_handler("session_start", self.start)
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
async def start(self, event):
|
finally:
|
||||||
"""
|
interface.close()
|
||||||
Process the session_start event.
|
|
||||||
|
|
||||||
Typical actions for the session_start event are
|
|
||||||
requesting the roster and broadcasting an initial
|
|
||||||
presence stanza.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
event -- An empty dictionary. The session_start
|
|
||||||
event does not provide any additional
|
|
||||||
data.
|
|
||||||
"""
|
|
||||||
self.send_presence()
|
|
||||||
await self.get_roster()
|
|
||||||
|
|
||||||
self.send_message(mto=self.recipient,
|
|
||||||
mbody=self.msg,
|
|
||||||
mtype='chat')
|
|
||||||
|
|
||||||
self.disconnect()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
# Setup the command line arguments.
|
|
||||||
parser = ArgumentParser(description=SendMsgBot.__doc__)
|
|
||||||
|
|
||||||
# Output verbosity options.
|
|
||||||
parser.add_argument("-q", "--quiet", help="set logging to ERROR",
|
|
||||||
action="store_const", dest="loglevel",
|
|
||||||
const=logging.ERROR, default=logging.INFO)
|
|
||||||
parser.add_argument("-d", "--debug", help="set logging to DEBUG",
|
|
||||||
action="store_const", dest="loglevel",
|
|
||||||
const=logging.DEBUG, default=logging.INFO)
|
|
||||||
|
|
||||||
# JID and password options.
|
|
||||||
parser.add_argument("-j", "--jid", dest="jid",
|
|
||||||
help="JID to use")
|
|
||||||
parser.add_argument("-p", "--password", dest="password",
|
|
||||||
help="password to use")
|
|
||||||
parser.add_argument("-t", "--to", dest="to",
|
|
||||||
help="JID to send the message to")
|
|
||||||
parser.add_argument("-m", "--message", dest="message",
|
|
||||||
help="message to send")
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Setup logging.
|
|
||||||
logging.basicConfig(level=args.loglevel,
|
|
||||||
format='%(levelname)-8s %(message)s')
|
|
||||||
|
|
||||||
if args.jid is None:
|
|
||||||
args.jid = input("Username: ")
|
|
||||||
if args.password is None:
|
|
||||||
args.password = getpass("Password: ")
|
|
||||||
if args.to is None:
|
|
||||||
args.to = input("Send To: ")
|
|
||||||
if args.message is None:
|
|
||||||
args.message = input("Message: ")
|
|
||||||
|
|
||||||
# Setup the EchoBot and register plugins. Note that while plugins may
|
|
||||||
# have interdependencies, the order in which you register them does
|
|
||||||
# not matter.
|
|
||||||
xmpp = SendMsgBot(args.jid, args.password, args.to, args.message)
|
|
||||||
xmpp.register_plugin('xep_0030') # Service Discovery
|
|
||||||
xmpp.register_plugin('xep_0199') # XMPP Ping
|
|
||||||
|
|
||||||
# Connect to the XMPP server and start processing XMPP stanzas.
|
|
||||||
xmpp.connect()
|
|
||||||
xmpp.process(forever=False)
|
|
||||||
|
|
0
message.txt
Normal file
0
message.txt
Normal file
|
@ -5,3 +5,6 @@ pyasn1_modules==0.4.0
|
||||||
pycares==4.4.0
|
pycares==4.4.0
|
||||||
pycparser==2.22
|
pycparser==2.22
|
||||||
slixmpp==1.8.5
|
slixmpp==1.8.5
|
||||||
|
requests==2.32.3
|
||||||
|
protobuf==5.27.1
|
||||||
|
meshtastic==2.3.10
|
102
send_to_irc.py
Normal file
102
send_to_irc.py
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from getpass import getpass
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
import slixmpp
|
||||||
|
# Mostly a carbon copy of https://slixmpp.readthedocs.io/en/latest/getting_started/sendlogout.html but will have other options.
|
||||||
|
|
||||||
|
|
||||||
|
class SendMsgBot(slixmpp.ClientXMPP):
|
||||||
|
|
||||||
|
"""
|
||||||
|
A basic Slixmpp bot that will log in, send a message,
|
||||||
|
and then log out.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, jid, password, recipient, message):
|
||||||
|
slixmpp.ClientXMPP.__init__(self, jid, password)
|
||||||
|
|
||||||
|
# The message we wish to send, and the JID that
|
||||||
|
# will receive it.
|
||||||
|
self.recipient = recipient
|
||||||
|
self.msg = message
|
||||||
|
|
||||||
|
# The session_start event will be triggered when
|
||||||
|
# the bot establishes its connection with the server
|
||||||
|
# and the XML streams are ready for use. We want to
|
||||||
|
# listen for this event so that we we can initialize
|
||||||
|
# our roster.
|
||||||
|
self.add_event_handler("session_start", self.start)
|
||||||
|
|
||||||
|
async def start(self, event):
|
||||||
|
"""
|
||||||
|
Process the session_start event.
|
||||||
|
|
||||||
|
Typical actions for the session_start event are
|
||||||
|
requesting the roster and broadcasting an initial
|
||||||
|
presence stanza.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
event -- An empty dictionary. The session_start
|
||||||
|
event does not provide any additional
|
||||||
|
data.
|
||||||
|
"""
|
||||||
|
self.send_presence()
|
||||||
|
await self.get_roster()
|
||||||
|
|
||||||
|
self.send_message(mto=self.recipient,
|
||||||
|
mbody=self.msg,
|
||||||
|
mtype='chat')
|
||||||
|
|
||||||
|
self.disconnect()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Setup the command line arguments.
|
||||||
|
parser = ArgumentParser(description=SendMsgBot.__doc__)
|
||||||
|
|
||||||
|
# Output verbosity options.
|
||||||
|
parser.add_argument("-q", "--quiet", help="set logging to ERROR",
|
||||||
|
action="store_const", dest="loglevel",
|
||||||
|
const=logging.ERROR, default=logging.INFO)
|
||||||
|
parser.add_argument("-d", "--debug", help="set logging to DEBUG",
|
||||||
|
action="store_const", dest="loglevel",
|
||||||
|
const=logging.DEBUG, default=logging.INFO)
|
||||||
|
|
||||||
|
# JID and password options.
|
||||||
|
parser.add_argument("-j", "--jid", dest="jid",
|
||||||
|
help="JID to use")
|
||||||
|
parser.add_argument("-p", "--password", dest="password",
|
||||||
|
help="password to use")
|
||||||
|
parser.add_argument("-t", "--to", dest="to",
|
||||||
|
help="JID to send the message to")
|
||||||
|
parser.add_argument("-m", "--message", dest="message",
|
||||||
|
help="message to send")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Setup logging.
|
||||||
|
logging.basicConfig(level=args.loglevel,
|
||||||
|
format='%(levelname)-8s %(message)s')
|
||||||
|
|
||||||
|
if args.jid is None:
|
||||||
|
args.jid = input("Username: ")
|
||||||
|
if args.password is None:
|
||||||
|
args.password = getpass("Password: ")
|
||||||
|
if args.to is None:
|
||||||
|
args.to = input("Send To: ")
|
||||||
|
if args.message is None:
|
||||||
|
args.message = input("Message: ")
|
||||||
|
|
||||||
|
# Setup the EchoBot and register plugins. Note that while plugins may
|
||||||
|
# have interdependencies, the order in which you register them does
|
||||||
|
# not matter.
|
||||||
|
xmpp = SendMsgBot(args.jid, args.password, args.to, args.message)
|
||||||
|
xmpp.register_plugin('xep_0030') # Service Discovery
|
||||||
|
xmpp.register_plugin('xep_0199') # XMPP Ping
|
||||||
|
|
||||||
|
# Connect to the XMPP server and start processing XMPP stanzas.
|
||||||
|
xmpp.connect()
|
||||||
|
xmpp.process(forever=False)
|
34
sub_to_tcp.py
Normal file
34
sub_to_tcp.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import time
|
||||||
|
import meshtastic
|
||||||
|
import meshtastic.tcp_interface
|
||||||
|
from pubsub import pub
|
||||||
|
|
||||||
|
def onReceive(packet, interface):
|
||||||
|
# called when a packet arrives
|
||||||
|
if 'decoded' in packet:
|
||||||
|
print('decoded')
|
||||||
|
decoded = packet['decoded']
|
||||||
|
|
||||||
|
if 'TEXT_MESSAGE_APP' in packet['decoded']:
|
||||||
|
print('TEXT_MESSAGE_APP')
|
||||||
|
|
||||||
|
if 'TELEMTRY_APP' in packet['decoded']:
|
||||||
|
print('Telementy found. Ignore')
|
||||||
|
|
||||||
|
if 'decoded' in packet and 'text' in packet['decoded']:
|
||||||
|
print(f"text message here: {packet['decoded']['text']}")
|
||||||
|
else:
|
||||||
|
print('Not the text message')
|
||||||
|
|
||||||
|
# print(f"Received: {packet}")
|
||||||
|
|
||||||
|
def onConnection(interface, topic=pub.AUTO_TOPIC): # called when we (re)connect to the radio
|
||||||
|
# defaults to broadcast, specify a destination ID if you wish
|
||||||
|
interface.sendText("hello mesh")
|
||||||
|
|
||||||
|
pub.subscribe(onReceive, "meshtastic.receive")
|
||||||
|
# pub.subscribe(onConnection, "meshtastic.connection.established")
|
||||||
|
interface = meshtastic.tcp_interface.TCPInterface(hostname='192.168.1.102')
|
||||||
|
while True:
|
||||||
|
time.sleep(1000)
|
||||||
|
interface.close()
|
Loading…
Reference in a new issue