From a71aaa358398467640b6fabaeec567467d79561f Mon Sep 17 00:00:00 2001 From: Tarmo Kuuse Date: Fri, 30 Aug 2019 17:44:16 +0300 Subject: [PATCH 1/2] Add a simple injector tool --- .gitignore | 1 + examples/injector.py | 98 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 examples/injector.py diff --git a/.gitignore b/.gitignore index f0edfe7..3b2316b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ __pycache__ .vscode dist *.egg-info +*.swp diff --git a/examples/injector.py b/examples/injector.py new file mode 100644 index 0000000..2cce88a --- /dev/null +++ b/examples/injector.py @@ -0,0 +1,98 @@ +""" +This example sets up a connection and sends a packet specified on command line as a hex encoded string + +To run this example as a script, the following command: +``` +$ python -m example.injector sf@location:port DEADBEEFDEADBEEF +``` +""" +from __future__ import print_function + +from argparse import ArgumentParser +from functools import partial +import logging +import time +from codecs import decode + +from moteconnection.connection import Connection +from moteconnection.message import MessageDispatcher, Message + + +def send_packet(connection_string, amid, dest, src, hex_data): + """Send the packet with specified AM ID.""" + + connection = construct_connection(connection_string, src) + + bin_data = decode(hex_data, "hex") + msg = Message(amid, dest, bin_data) + + time.sleep(0.2) + connection.send(msg) + time.sleep(0.2) + + connection.disconnect() + connection.join() + + +def construct_connection(connection_string, src): + """ + Constructs the connection object and returns it. + + The connection string takes the form of protocol@location:port_or_baud + Examples: sf@localhost:9002 + serial@/dev/ttyUSB0 + + :param str connection string: A string in the form of protocol@location:port_or_baud + :rtype: moteconnection.connection.Connection + """ + connection = Connection() + connection.connect( + connection_string, + reconnect=10, + connected=partial(print, "Connected to {}".format(connection_string)), + disconnected=partial(print, "Disconnected from {}".format(connection_string)) + ) + + dispatcher = MessageDispatcher(src) + connection.register_dispatcher(dispatcher) + return connection + + +def get_args(): + """ + Parses the arguments and returns them. + + :rtype argparse.Namespace + """ + parser = ArgumentParser(description='An example moteconnection sending program.') + parser.add_argument('connection', + help="The connection string used to connect to the device. " + "Can be a serial forwarder address or a serial device address.") + parser.add_argument('--verbose', '-v', + action='store_true', + default=False, + help='Verbose mode (displays moteconnection logs).') + parser.add_argument('--amid', '-a', + default='0x76', + help='AM ID') + parser.add_argument('--dest', '-d', + default='0xFFFF', + help='Destination address') + parser.add_argument('--src', '-s', + default='0xCCC4', + help='Source address') + parser.add_argument("data", + help='Binary data (hex)') + return parser.parse_args() + + +def main(): + """Main entrypoint to the sniffer application.""" + args = get_args() + if args.verbose: + logging.basicConfig(level=logging.DEBUG) + send_packet(args.connection, int(args.amid, base=0), int(args.dest, base=0), int(args.src, base=0), args.data) + + +if __name__ == '__main__': + main() From 33db1ce982599ce62e6cbab2761384c4d52bca98 Mon Sep 17 00:00:00 2001 From: Tarmo Kuuse Date: Mon, 2 Sep 2019 11:57:19 +0300 Subject: [PATCH 2/2] Add support for setting the group --- examples/injector.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/injector.py b/examples/injector.py index 2cce88a..d4dba59 100644 --- a/examples/injector.py +++ b/examples/injector.py @@ -3,7 +3,8 @@ To run this example as a script, the following command: ``` -$ python -m example.injector sf@location:port DEADBEEFDEADBEEF +$ python3 -m examples.injector --amid 0x76 --src 0xFAFA --dest 0xFFFF --group 0x99 sf@injector01.local DEADBEEFDEADBEEF + ``` """ from __future__ import print_function @@ -18,10 +19,10 @@ from moteconnection.message import MessageDispatcher, Message -def send_packet(connection_string, amid, dest, src, hex_data): +def send_packet(connection_string, amid, dest, src, group, hex_data): """Send the packet with specified AM ID.""" - connection = construct_connection(connection_string, src) + connection = construct_connection(connection_string, src, group) bin_data = decode(hex_data, "hex") msg = Message(amid, dest, bin_data) @@ -34,7 +35,7 @@ def send_packet(connection_string, amid, dest, src, hex_data): connection.join() -def construct_connection(connection_string, src): +def construct_connection(connection_string, src, group): """ Constructs the connection object and returns it. @@ -53,7 +54,7 @@ def construct_connection(connection_string, src): disconnected=partial(print, "Disconnected from {}".format(connection_string)) ) - dispatcher = MessageDispatcher(src) + dispatcher = MessageDispatcher(src, group) connection.register_dispatcher(dispatcher) return connection @@ -81,6 +82,9 @@ def get_args(): parser.add_argument('--src', '-s', default='0xCCC4', help='Source address') + parser.add_argument('--group', '-g', + default='0x22', + help='Group ID') parser.add_argument("data", help='Binary data (hex)') return parser.parse_args() @@ -91,7 +95,13 @@ def main(): args = get_args() if args.verbose: logging.basicConfig(level=logging.DEBUG) - send_packet(args.connection, int(args.amid, base=0), int(args.dest, base=0), int(args.src, base=0), args.data) + send_packet( + args.connection, + int(args.amid, base=0), + int(args.dest, base=0), + int(args.src, base=0), + int(args.group, base=0), + args.data) if __name__ == '__main__':