From 76f24f2b314feffa2162d0aa88d3135aa7b5306a Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Mon, 26 Dec 2022 10:25:50 +0100 Subject: [PATCH] first test run with saving data from tnc --- tnc/data_handler.py | 76 ++++++++++++++++++++++++++++-- tnc/main.py | 14 +++++- tnc/static.py | 4 +- tools/freedata_network_listener.py | 11 +++-- 4 files changed, 93 insertions(+), 12 deletions(-) diff --git a/tnc/data_handler.py b/tnc/data_handler.py index d2ba5e72..21db7e82 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -7,6 +7,7 @@ Created on Sun Dec 27 20:43:40 2020 # pylint: disable=invalid-name, line-too-long, c-extension-no-member # pylint: disable=import-outside-toplevel, attribute-defined-outside-init +import os import base64 import sys import threading @@ -865,13 +866,33 @@ class DATA: self.log.error( "[TNC] ARQ | RX | error occurred when saving data!", e=e, - uuid = self.transmission_uuid, - timestamp = timestamp, - dxcall = static.DXCALLSIGN, - dxgrid = static.DXGRID, - data = base64_data + uuid=self.transmission_uuid, + timestamp=timestamp, + dxcall=static.DXCALLSIGN, + dxgrid=static.DXGRID, + data=base64_data ) + if static.ARQ_SAVE_TO_FOLDER: + try: + self.save_data_to_folder( + self.transmission_uuid, + timestamp, + mycallsign, + static.DXCALLSIGN, + static.DXGRID, + data_frame + ) + except Exception as e: + self.log.error( + "[TNC] ARQ | RX | can't save file to folder", + e=e, + uuid=self.transmission_uuid, + timestamp=timestamp, + dxcall=static.DXCALLSIGN, + dxgrid=static.DXGRID, + data=base64_data + ) self.send_data_to_socket_queue( freedata="tnc-message", arq="transmission", @@ -3049,3 +3070,48 @@ class DATA: self.enqueue_frame_for_tx( frame_to_tx=[bytearray(126)], c2_mode=FREEDV_MODE.datac3.value ) + + def save_data_to_folder(self, + transmission_uuid, + timestamp, + mycallsign, + dxcallsign, + dxgrid, + data_frame + ): + + """Save data to folder""" + + split_char = b"\x00;" + + self.log.info("[TNC] ARQ | RX | saving data to folder") + + decoded_data = data_frame.split(split_char) + print(decoded_data) + #uuid=decoded_data[3] + message = decoded_data[4] + filename = decoded_data[5] + #filetype = decoded_data[6] + data = decoded_data[7] + + try: + folder_path = "received" + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + callsign_path = f"{mycallsign}_{dxcallsign}" + if not os.path.exists(f"{folder_path}/{callsign_path}"): + os.makedirs(f"{folder_path}/{callsign_path}") + + # save file to folder + filename_complex = f"{timestamp}_{transmission_uuid}_{filename}" + with open(f"{folder_path}/{callsign_path}/{filename_complex}", "wb") as file: + file.write(data) + + # save message to folder + message_name = f"{timestamp}_{transmission_uuid}_msg.txt" + with open(f"{folder_path}/{callsign_path}/{message_name}", "wb") as file: + file.write(message) + + except Exception as e: + print(e) \ No newline at end of file diff --git a/tnc/main.py b/tnc/main.py index 49f7a2c6..d8932abd 100755 --- a/tnc/main.py +++ b/tnc/main.py @@ -70,6 +70,15 @@ if __name__ == "__main__": type=str, help="Use the default config file config.ini", ) + + PARSER.add_argument( + "--save-to-folder", + dest="savetofolder", + default=False, + action="store_true", + help="Save received data to local folder", + ) + PARSER.add_argument( "--mycall", dest="mycall", @@ -269,8 +278,9 @@ if __name__ == "__main__": ) ARGS = PARSER.parse_args() - - + # set save to folder state for allowing downloading files to local file system + static.ARQ_SAVE_TO_FOLDER = ARGS.savetofolder + if not ARGS.configfile: diff --git a/tnc/static.py b/tnc/static.py index 8c656c83..bd973d24 100644 --- a/tnc/static.py +++ b/tnc/static.py @@ -11,7 +11,7 @@ Not nice, suggestions are appreciated :-) import subprocess from enum import Enum -VERSION = "0.6.8-alpha.1" +VERSION = "0.6.9-alpha.1-exp" ENABLE_EXPLORER = False @@ -101,6 +101,8 @@ ARQ_COMPRESSION_FACTOR: int = 0 ARQ_TRANSMISSION_PERCENT: int = 0 ARQ_SPEED_LEVEL: int = 0 TOTAL_BYTES: int = 0 +# set save to folder state for allowing downloading files to local file system +ARQ_SAVE_TO_FOLDER: bool = False # CHANNEL_STATE = 'RECEIVING_SIGNALLING' TNC_STATE: str = "IDLE" diff --git a/tools/freedata_network_listener.py b/tools/freedata_network_listener.py index 94677f95..a10466db 100755 --- a/tools/freedata_network_listener.py +++ b/tools/freedata_network_listener.py @@ -35,6 +35,10 @@ ip, port = args.socket_host, args.socket_port connected = True data = bytes() +""" +Nachricht +{'command': 'rx_buffer', 'data-array': [{'uuid': '8dde227d-3a09-4f39-b34c-5f8281d719d1', 'timestamp': 1672043316, 'dxcallsign': 'DJ2LS-1', 'dxgrid': 'JN48cs', 'data': 'bQA7c2VuZF9tZXNzYWdlADsxMjMAO2VkY2NjZDAyLTUzMTQtNDc3Ni1hMjlkLTFmY2M1ZDI4OTM4ZAA7VGVzdAoAOwA7cGxhaW4vdGV4dAA7ADsxNjcyMDQzMzA5'}]} +""" def decode_and_save_data(encoded_data): decoded_data = base64.b64decode(encoded_data) @@ -69,7 +73,7 @@ def decode_and_save_data(encoded_data): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.connect((ip, port)) - + print(sock) while connected: chunk = sock.recv(1024) data += chunk @@ -83,7 +87,6 @@ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: for command in data: jsondata = json.loads(command) - data = bytes() if jsondata.get('command') == "tnc_state": pass @@ -105,7 +108,7 @@ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: if jsondata.get('status') == 'received' and jsondata.get('arq') == 'transmission': decode_and_save_data(jsondata["data"]) - # clear data buffer as soon as data has been read - data = bytes() + # clear data buffer as soon as data has been read + data = bytes()