########################################################## # 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_utilities" # 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.set_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(f"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( f"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 demonstrating sending and receiving 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="broadcast channel name", 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()