|
@@ -27,6 +27,7 @@ import contextlib |
|
|
import functools |
|
|
import functools |
|
|
import itertools |
|
|
import itertools |
|
|
import os |
|
|
import os |
|
|
|
|
|
import sys |
|
|
import unittest |
|
|
import unittest |
|
|
|
|
|
|
|
|
from Strobe.Strobe import Strobe, KeccakF |
|
|
from Strobe.Strobe import Strobe, KeccakF |
|
@@ -203,6 +204,105 @@ class MulticastSyncDatagram(SyncDatagram): |
|
|
self.mt.close() |
|
|
self.mt.close() |
|
|
self.mt = None |
|
|
self.mt = None |
|
|
|
|
|
|
|
|
|
|
|
def listsplit(lst, item): |
|
|
|
|
|
try: |
|
|
|
|
|
idx = lst.index(item) |
|
|
|
|
|
except ValueError: |
|
|
|
|
|
return lst, [] |
|
|
|
|
|
|
|
|
|
|
|
return lst[:idx], lst[idx + 1:] |
|
|
|
|
|
|
|
|
|
|
|
async def main(): |
|
|
|
|
|
import argparse |
|
|
|
|
|
|
|
|
|
|
|
from loraserv import DEFAULT_MADDR as maddr |
|
|
|
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser() |
|
|
|
|
|
|
|
|
|
|
|
parser.add_argument('-r', dest='client', metavar='module:function', type=str, |
|
|
|
|
|
help='Create a respondant instead of sending commands. Commands will be passed to the function.') |
|
|
|
|
|
parser.add_argument('-s', dest='shared_key', metavar='shared_key', type=str, required=True, |
|
|
|
|
|
help='The shared key (encoded as UTF-8) to use.') |
|
|
|
|
|
parser.add_argument('args', metavar='CMD_ARG', type=str, nargs='*', |
|
|
|
|
|
help='Various commands to send to the device.') |
|
|
|
|
|
|
|
|
|
|
|
args = parser.parse_args() |
|
|
|
|
|
|
|
|
|
|
|
shared_key = args.shared_key.encode('utf-8') |
|
|
|
|
|
|
|
|
|
|
|
if args.client: |
|
|
|
|
|
# Run a client |
|
|
|
|
|
mr = await multicast.create_multicast_receiver(maddr) |
|
|
|
|
|
mt = await multicast.create_multicast_transmitter(maddr) |
|
|
|
|
|
|
|
|
|
|
|
from ctypes import c_uint8 |
|
|
|
|
|
|
|
|
|
|
|
# seed the RNG |
|
|
|
|
|
prngseed = os.urandom(64) |
|
|
|
|
|
lora_comms.strobe_seed_prng((c_uint8 * |
|
|
|
|
|
len(prngseed))(*prngseed), len(prngseed)) |
|
|
|
|
|
|
|
|
|
|
|
# Create the state for testing |
|
|
|
|
|
commstate = lora_comms.CommsState() |
|
|
|
|
|
|
|
|
|
|
|
import util_load |
|
|
|
|
|
client_func = util_load.load_application(args.client) |
|
|
|
|
|
|
|
|
|
|
|
def client_call(msg, outbuf): |
|
|
|
|
|
ret = client_func(msg._from()) |
|
|
|
|
|
|
|
|
|
|
|
if len(ret) > outbuf[0].pktlen: |
|
|
|
|
|
ret = b'error, too long buffer: %d' % len(ret) |
|
|
|
|
|
|
|
|
|
|
|
outbuf[0].pktlen = min(len(ret), outbuf[0].pktlen) |
|
|
|
|
|
for i in range(outbuf[0].pktlen): |
|
|
|
|
|
outbuf[0].pkt[i] = ret[i] |
|
|
|
|
|
|
|
|
|
|
|
cb = lora_comms.process_msgfunc_t(client_call) |
|
|
|
|
|
|
|
|
|
|
|
# Initialize everything |
|
|
|
|
|
lora_comms.comms_init(commstate, cb, make_pktbuf(shared_key)) |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
while True: |
|
|
|
|
|
pkt = await mr.recv() |
|
|
|
|
|
msg = pkt[0] |
|
|
|
|
|
|
|
|
|
|
|
out = lora_comms.comms_process_wrap( |
|
|
|
|
|
commstate, msg) |
|
|
|
|
|
|
|
|
|
|
|
if out: |
|
|
|
|
|
await mt.send(out) |
|
|
|
|
|
finally: |
|
|
|
|
|
mr.close() |
|
|
|
|
|
mt.close() |
|
|
|
|
|
sys.exit(0) |
|
|
|
|
|
|
|
|
|
|
|
msd = MulticastSyncDatagram(maddr) |
|
|
|
|
|
await msd.start() |
|
|
|
|
|
|
|
|
|
|
|
l = LORANode(msd, shared=shared_key) |
|
|
|
|
|
|
|
|
|
|
|
await l.start() |
|
|
|
|
|
|
|
|
|
|
|
valid_cmds = { 'waitfor', 'runfor', 'ping', 'terminate', } |
|
|
|
|
|
|
|
|
|
|
|
cmdargs = list(args.args) |
|
|
|
|
|
while cmdargs: |
|
|
|
|
|
cmd = cmdargs.pop(0) |
|
|
|
|
|
|
|
|
|
|
|
if cmd not in valid_cmds: |
|
|
|
|
|
print('invalid command:', repr(cmd)) |
|
|
|
|
|
sys.exit(1) |
|
|
|
|
|
|
|
|
|
|
|
fun = getattr(l, cmd) |
|
|
|
|
|
args, cmdargs = listsplit(cmdargs, '--') |
|
|
|
|
|
|
|
|
|
|
|
await fun(*(int(x) for x in args)) |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
|
asyncio.run(main()) |
|
|
|
|
|
|
|
|
class MockSyncDatagram(SyncDatagram): |
|
|
class MockSyncDatagram(SyncDatagram): |
|
|
'''A testing version of SyncDatagram. Define a method runner which |
|
|
'''A testing version of SyncDatagram. Define a method runner which |
|
|
implements part of the sequence. In the function, await on either |
|
|
implements part of the sequence. In the function, await on either |
|
|