From 3593a1590468c5bb55a42d98d5a2eec0b0911fdf Mon Sep 17 00:00:00 2001 From: Lei PAN Date: Wed, 23 Mar 2022 14:34:17 +0100 Subject: [PATCH] add wait for sms py --- commandor_page.py | 4 +- main.py | 9 ++- reset_all_sim_card.py | 2 +- wait_for_sms.py | 136 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 wait_for_sms.py diff --git a/commandor_page.py b/commandor_page.py index 37a10dd..a1537de 100644 --- a/commandor_page.py +++ b/commandor_page.py @@ -128,7 +128,8 @@ class CommandorPage: self.page.fill(OTP_FIELD_ID, otp) def reset_air_plan_mode(self): - pass + print("will close ") + self.browser.close() def publish_message_to_queue(self, contact: ContactPojo, message: str, url: str): # create the message @@ -144,6 +145,7 @@ class CommandorPage: credentials=_credentials)) channel = connection.channel() # default exchange, for 'hello' queue + print("will publish message:" + result.to_json()) channel.basic_publish(exchange='', routing_key=APPOINTMENT_QUEUE, body=result.to_json()) connection.close() diff --git a/main.py b/main.py index d30ec61..e609f7d 100644 --- a/main.py +++ b/main.py @@ -20,7 +20,7 @@ from pojo.serial_modem import SerialModem from utils.excel_reader import ExcelHelper from utils.message_receiver import MessageReceiver -OTP_TIMEOUT = 600 +OTP_TIMEOUT = 120 is_finished = False commandor = CommandorPage() thread_event = None @@ -97,7 +97,7 @@ def handle_sms(sms): params.oracle_log_sender.send_sms_reception_log(sms.number, sms.text) if date == str(datetime.date.today()): logger.info("this sms is for today") - if "rendez-vous" in sms.text: + if "rendez-vous" in sms.text or "appointment" in sms.text: logger.info("try to extract the otp") pattern = r'\d{6,8}' # if re.match(pattern, sms.text): @@ -105,7 +105,9 @@ def handle_sms(sms): otp = match.group(0) logger.info("otp is " + otp) global thread_event + global commandor commandor.otp_value = otp + logger.info("will set thread event") thread_event.set() # commandor.send_otp(otp) # wait for the sms for 20 seconds @@ -154,13 +156,14 @@ def start_listen(): def on_ready_for_otp(e: Event, commandor: CommandorPage): + print("on_ready_for_otp() called.") global thread_event thread_event = e def start_book(): slot_number = 1 - slot_sum = 22 + slot_sum = 2 for i in reversed(range(slot_number, slot_sum + 1)): card_pool.reset() logger.info("will switch to " + str(i)) diff --git a/reset_all_sim_card.py b/reset_all_sim_card.py index b12ead4..274703d 100644 --- a/reset_all_sim_card.py +++ b/reset_all_sim_card.py @@ -10,7 +10,7 @@ from main import card_pool, get_devices_ports def read_all_the_phone_number(): params.oracle_log_sender.send_log(msg="SIM卡自检开始", subject=LOG_SUBJECT_EVENT, type=TYPE_EVENT_RESET_ALL_SIM_CARDS) slot_number = 1 - slot_sum = 23 + slot_sum = 2 # card_pool.switch_to_slot(29) params.firebase_store_manager.clear_all_sim_info() for i in range(slot_number, slot_sum + 1): diff --git a/wait_for_sms.py b/wait_for_sms.py new file mode 100644 index 0000000..82a22a3 --- /dev/null +++ b/wait_for_sms.py @@ -0,0 +1,136 @@ +import datetime +import logging +import sys +import time +from typing import Union + +from gsmmodem import GsmModem + +import params +from commandor_page import CommandorPage +from logs.AppLogging import init_logger +from modems.ModemPool import ModemPool +from modems.card_pool import CardPool +from params import MODEM_POOL_PORTS, CARD_POOL_PORT, firebase_store_manager, oracle_log_sender +from pojo.ReserveResultPojo import ReserveResultPojo +from pojo.serial_modem import SerialModem +from utils.excel_reader import ExcelHelper + +OTP_TIMEOUT = 120 +is_finished = False +commandor = CommandorPage() +thread_event = None +current_gsm_modem = None +card_pool = CardPool(CARD_POOL_PORT) +# used to save the current slot position +current_card_pool_slot = 1 +current_sim_position = 1 + + +def get_devices_ports() -> list: + return MODEM_POOL_PORTS + +def create_modem_for_port(port: str) -> Union[SerialModem, None]: + logger.info('Initializing modem... for ' + port) + serial_modem = None + try: + modem = GsmModem(port) + return SerialModem(modem=modem) + except Exception as ext: + logger.error(ext) + return serial_modem + + +def timeout_occurred(serial_modem: SerialModem): + logger.info("will close timeout modem") + serial_modem.modem.close() + commandor.reset_air_plan_mode() + + +def start_to_handle_sms(serial_modem: SerialModem): + global current_gsm_modem + current_gsm_modem = serial_modem.modem + current_gsm_modem.deleteMultipleStoredSms(memory="SM") + serial_modem.modem.smsReceivedCallback = handle_sms + global is_finished + is_finished = False + serial_modem.modem.smsTextMode = False + logger.info('Waiting for SMS message, for phone number ' + str(serial_modem.phone_number)) + listen_at = time.time() + while not is_finished: + time.sleep(2) + # check whether timeout + now = time.time() + if (listen_at + OTP_TIMEOUT) < now: + logger.info("time out for {}, switch to next contact".format(serial_modem.phone_number)) + # save the contact in timeout + timeout_occurred(serial_modem) + current_gsm_modem.close() + return + return + + +def handle_sms(sms): + logger.info( + u'== SMS message received ==\nFrom: {0}\nTime: {1}\nMessage:\n{2}\n'.format(sms.number, sms.time, sms.text)) + # extract the otp number + params.oracle_log_sender.send_sms_reception_log(sms.number, sms.text) + + +def init_modems() -> list: + modems = [] + for port in get_devices_ports(): + serial_modem = create_modem_for_port(port) + if serial_modem: + modems.append(serial_modem) + return modems + + +def on_message_received(ch, method, properties, body): + print(str(body)) + print(" [x] Received {} {}".format(body, datetime.datetime.now())) + # parse the received message + result = ReserveResultPojo.from_json(body) + result.sim_position = current_sim_position + result.slot_position = current_card_pool_slot + logger.info(result) + firebase_store_manager.save(result) + oracle_log_sender.send_appoint_result(result) + # set the flag to True + global is_finished + is_finished = True + + +def start_book(): + slot_number = 1 + slot_sum = 2 + for i in reversed(range(slot_number, slot_sum + 1)): + card_pool.reset() + logger.info("will switch to " + str(i)) + card_pool.switch_to_slot(i) + modem_pool = ModemPool(get_devices_ports()) + modem_pool.reset_all_modems() + modem_list = init_modems() + # create listeners for chaque modem + # read the contact, and contact the 2 objects together + excel_reader = ExcelHelper() + contacts = excel_reader.read_contacts() + global current_sim_position + current_sim_position = 1 + for modem in modem_list: + current_sim_position = current_sim_position + 1 + try: + # get contact for current modem + modem.get_ccid() + start_to_handle_sms(modem) + except Exception as error: + print(error) + continue + + +if __name__ == '__main__': + init_logger() + logger = logging.getLogger() + logger.addHandler(logging.StreamHandler(stream=sys.stdout)) + start_book() + # card_pool.switch_to_slot(12)