diff --git a/measurement_main.py b/measurement_main.py index ce63775..93109f6 100755 --- a/measurement_main.py +++ b/measurement_main.py @@ -28,6 +28,9 @@ CMD_TIME_EPOCH = "date +%s" TIMEOUT_OFFSET = 10.0 WAIT_AFTER_IPERF = 5.0 +modem_serial_obj = None +gps_serial_obj = None + class ProcessHandler: def __init__(self): @@ -243,6 +246,53 @@ def monitor_serial(ser, output_file): return +def start_serial_monitoring(serial, baudrate, folder, prefix): + global modem_serial_obj + + print_message("Opening serial port for {}".format(serial)) + modem_serial_obj = serial.Serial( + port=serial, + baudrate=baudrate, + ) + modem_serial_obj.isOpen() + ser_filepath = "{}{}_serial_monitor_output.txt".format( + folder, prefix + ) + ser_thread = Thread( + target=monitor_serial, + args=( + modem_serial_obj, + ser_filepath, + ), + ) + ser_thread.start() + + +def is_serial_monitoring_running(): + return modem_serial_obj.is_open + + +def start_gps_monitoring(gps, baudrate, folder, prefix): + global gps_serial_obj + + print_message("Opening GPS serial port for {}".format(gps)) + gps_serial_obj = serial.Serial( + gps, + baudrate=baudrate, + ) + gps_ser_filepath = "{}{}_gps.nmea".format( + folder, prefix + ) + gps_ser_thread = Thread( + target=monitor_gps, + args=( + gps_serial_obj, + gps_ser_filepath, + ), + ) + gps_ser_thread.start() + + def monitor_gps(ser, output_file): ser.flushInput() ser.flushOutput() @@ -270,11 +320,19 @@ def connect_moden(provider="telekom"): print_message("...done") -def reconnect_modem(provider="telekom"): +def reconnect_modem(provider="telekom", hard=False): + global modem_serial_obj print_message("Reonnect modem with provider {} ...".format(provider)) - os.system("/root/connect-modem.py -s") - sleep(5) - os.system("/root/connect-modem.py -l {}".format(provider)) + if hard: + if modem_serial_obj.is_open: + modem_serial_obj.write(b'at+COPS?\r\n') + sleep(NR_SERIAL_RESPOND_TIME) + modem_serial_obj.write(b'AT+QENG="servingcell"\r\n') + sleep(NR_SERIAL_RESPOND_TIME) + else: + os.system("/root/connect-modem.py -s") + sleep(5) + os.system("/root/connect-modem.py -l {}".format(provider)) print_message("...done") @@ -538,46 +596,11 @@ class Client: sleep(1) print_message("Start measurement") - ser = None - if self.config["serial"] is not None: - print_message("Opening serial port for {}".format(self.config["serial"])) - ser = serial.Serial( - port=self.config["serial"], - baudrate=self.config["baudrate"], - ) - ser.isOpen() - ser_filepath = "{}{}_serial_monitor_output.txt".format( - self.config["folder"], self.config["prefix"] - ) - ser_thread = Thread( - target=monitor_serial, - args=( - ser, - ser_filepath, - ), - ) - ser_thread.start() - - gps_ser = None + start_serial_monitoring(self.config["serial"], self.config["baudrate"], self.config["folder"], self.config["prefix"]) if self.config["gps"] is not None: - print_message("Opening GPS serial port for {}".format(self.config["gps"])) - gps_ser = serial.Serial( - self.config["gps"], - baudrate=self.config["gps_baudrate"], - ) - gps_ser_filepath = "{}{}_gps.nmea".format( - self.config["folder"], self.config["prefix"] - ) - gps_ser_thread = Thread( - target=monitor_gps, - args=( - gps_ser, - gps_ser_filepath, - ), - ) - gps_ser_thread.start() + start_gps_monitoring(self.config["gps"], self.config["gps_baudrate"], self.config["folder"], self.config["prefix"]) if self.config["bandwidth"]: self.bandwidth() @@ -592,14 +615,14 @@ class Client: elif self.config["ping"]: self.ping() - if ser is not None: + if modem_serial_obj is not None: print_message("Closing serial port...") - ser.close() + modem_serial_obj.close() sleep(2) print_message("done...") - if gps_ser is not None: + if gps_serial_obj is not None: print_message("Closing GPS serial port...") - gps_ser.close() + gps_serial_obj.close() sleep(2) print_message("done...") @@ -767,6 +790,7 @@ class Client: ws_filter = "{} and port {}".format("tcp", self.config["port"]) print_message("Use ws filter: {}".format(ws_filter)) for n in range(1, self.config["number_of_measurements"] + 1): + reconnect_count = 0 if not is_modem_connected(): background_write_to_file( filepath="{}{}_reconnect.log".format( @@ -775,6 +799,9 @@ class Client: content='{}"'.format(datetime.timestamp(datetime.now())), ) reconnect_modem() + sleep(2) + if not is_serial_monitoring_running(): + start_serial_monitoring() print_message( "{} of {}".format(n, self.config["number_of_measurements"]) ) @@ -824,7 +851,11 @@ class Client: ), content='{}"'.format(datetime.timestamp(datetime.now())), ) - reconnect_modem() + reconnect_modem(hard=reconnect_count > 5) + reconnect_count += 1 + sleep(2) + if not is_serial_monitoring_running(): + start_serial_monitoring() try: try: iperf_return = subprocess.call( @@ -856,6 +887,7 @@ class Client: enable_tcp_probe() print_message("tcp probe is now enabled") for n in range(1, self.config["number_of_measurements"] + 1): + reconnect_count = 0 if not is_modem_connected(): background_write_to_file( filepath="{}{}_reconnect.log".format( @@ -864,6 +896,9 @@ class Client: content='{}"'.format(datetime.timestamp(datetime.now())), ) reconnect_modem() + sleep(2) + if not is_serial_monitoring_running(): + start_serial_monitoring() print_message( "{} of {}".format(n, self.config["number_of_measurements"]) ) @@ -912,7 +947,11 @@ class Client: ), content='{}"'.format(datetime.timestamp(datetime.now())), ) - reconnect_modem() + reconnect_modem(hard=reconnect_count > 5) + reconnect_count += 1 + sleep(2) + if not is_serial_monitoring_running(): + start_serial_monitoring() try: try: iperf_return = subprocess.call( diff --git a/plot_transmission_timeline.py b/plot_transmission_timeline.py new file mode 100644 index 0000000..e69de29