From eb2e4a86bd078df7b7dee579c070b3cda261f4be Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Thu, 14 May 2020 12:52:41 +0200 Subject: [PATCH] Added broadcast example --- Examples/Broadcast.py | 93 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Examples/Broadcast.py diff --git a/Examples/Broadcast.py b/Examples/Broadcast.py new file mode 100644 index 0000000..29aa5ce --- /dev/null +++ b/Examples/Broadcast.py @@ -0,0 +1,93 @@ +########################################################## +# This RNS example demonstrates broadcasting unencrypted # +# information to any listening destinations. # +########################################################## + +import sys +import argparse +import RNS + +# Let's define an app name. We'll use this for all +# destinations we create. Since this basic example +# is part of a range of example utilities, we'll put +# them all within the app namespace "example_utilities" +APP_NAME = "example_utilitites" + +# This initialisation is executed when the program is started +def program_setup(configpath, channel=None): + # We must first initialise Reticulum + reticulum = RNS.Reticulum(configpath) + + # If the user did not select a "channel" we use + # a default one called "public_information". + # This "channel" is added to the destination name- + # space, so the user can select different broadcast + # channels. + if channel == None: + channel = "public_information" + + # We create a PLAIN destination. This is an uncencrypted endpoint + # that anyone can listen to and send information to. + broadcast_destination = RNS.Destination(None, RNS.Destination.IN, RNS.Destination.PLAIN, APP_NAME, "broadcast", channel) + + # We specify a callback that will get called every time + # the destination receives data. + broadcast_destination.packet_callback(packet_callback) + + # Everything's ready! + # Let's hand over control to the main loop + broadcastLoop(broadcast_destination) + +def packet_callback(data, packet): + # Simply print out the received data + print("") + print("Received data: "+data.decode("utf-8")+"\r\n> ", end="") + sys.stdout.flush() + +def broadcastLoop(destination): + # Let the user know that everything is ready + RNS.log("Broadcast example "+RNS.prettyhexrep(destination.hash)+" running, enter text and hit enter to broadcast (Ctrl-C to quit)") + + # We enter a loop that runs until the users exits. + # If the user hits enter, we will send the information + # that the user entered into the prompt. + while True: + print("> ", end="") + entered = input() + + if entered != "": + data = entered.encode("utf-8") + packet = RNS.Packet(destination, data) + packet.send() + + + +########################################################## +#### Program Startup ##################################### +########################################################## + +# This part of the program gets run at startup, +# and parses input from the user, and then starts +# the program. +if __name__ == "__main__": + try: + parser = argparse.ArgumentParser(description="Reticulum example that demonstrates sending and receiving unencrypted broadcasts") + parser.add_argument("--config", action="store", default=None, help="path to alternative Reticulum config directory", type=str) + parser.add_argument("--channel", action="store", default=None, help="path to alternative Reticulum config directory", type=str) + args = parser.parse_args() + + if args.config: + configarg = args.config + else: + configarg = None + + if args.channel: + channelarg = args.channel + else: + channelarg = None + + program_setup(configarg, channelarg) + + except KeyboardInterrupt: + print("") + exit() \ No newline at end of file