diff --git a/ModemPool.py b/ModemPool.py index 95176aa..25aaa5d 100644 --- a/ModemPool.py +++ b/ModemPool.py @@ -5,7 +5,7 @@ import serial from serial import Serial from error.SIMError import SIMError -from logs.LogSender import LogSender, LOG_ERROR +from logs.LogSender import LOG_APPOINTMENT_SUCCESS, SUBJECT_SIM_INFO from params import firebase_store_manager, oracle_log_sender from pojo.SimInfoPojo import SimInfoPojo from utils.excel_reader import ExcelHelper @@ -38,7 +38,7 @@ class ModemPool: def _generate_error_msg(self, slot_position, index, error: SIMError): msg = "slot({}) SIM({}), error:{}".format(slot_position, index + 1, error.value) - self._log_sender.send_log(msg, subject=self.TAG, type=LOG_ERROR) + self._log_sender.send_log(msg, source=self.TAG, subject=SUBJECT_SIM_INFO, type=error.value) return msg def get_raw_phone_number(self, slot_position): @@ -69,6 +69,8 @@ class ModemPool: position = (slot_position - 1) * 15 + sim_position if phone_number: self._db_manager.save_sim_info(SimInfoPojo(phone=phone_number, ccid=ccid, position=position)) + self._log_sender.send_log(phone_number, source=self.TAG, subject=SUBJECT_SIM_INFO, + type=LOG_APPOINTMENT_SUCCESS) # write the number to sim card's phonebook cmd = f'AT+CPBW={self.phone_number_position},\"{phone_number}\"\r' self._send_command(cmd, ser, wait_time_in_s=2) diff --git a/contact.xlsx b/contact.xlsx index 217c10f..324bd96 100644 Binary files a/contact.xlsx and b/contact.xlsx differ diff --git a/db/DbManager.py b/db/DbManager.py index cc728cf..c8ad253 100644 --- a/db/DbManager.py +++ b/db/DbManager.py @@ -14,6 +14,8 @@ TIMEOUT = "timeout_items" class DataManager: + batch_size = 20 + def __init__(self): cred = credentials.Certificate("appointment.json") self._app = firebase_admin.initialize_app(cred) @@ -50,25 +52,44 @@ class DataManager: doc_ref = self._db.collection(TIMEOUT).document(str(contact.phone)) doc_ref.set(contact.to_firestore_dict()) + def _delete_collection(self, coll_ref, batch_size): + docs = coll_ref.limit(batch_size).stream() + deleted = 0 + + for doc in docs: + print(f'Deleting doc {doc.id} => {doc.to_dict()}') + doc.reference.delete() + deleted = deleted + 1 + + if deleted >= batch_size: + return self._delete_collection(coll_ref, batch_size) + + def clear_all_sim_info(self): + coll_ref = self._db.collection(SIM_INFOS) + self._delete_collection(coll_ref, self.batch_size) + + def save_to_excel(self): + # Start from the first cell. Rows and columns are zero indexed. + sim_info_list = [] + + for sim in self.get_all_sim_infos().stream(): + print(sim) + sim_pojo = SimInfoPojo.from_firestore_dict(sim.to_dict()) + sim_info_list.append(sim_pojo) + row = 0 + col = 0 + # Create a workbook and add a worksheet. + workbook = xlsxwriter.Workbook('sim_infos.xlsx') + worksheet = workbook.add_worksheet() + for info in sim_info_list: + # Iterate over the data and write it out row by row. + worksheet.write(row, col, info.phone[2:len(info.phone)]) + worksheet.write(row, col + 1, info.ccid) + worksheet.write(row, col + 2, info.position) + row += 1 + workbook.close() + if __name__ == '__main__': - - # Start from the first cell. Rows and columns are zero indexed. - sim_info_list = [] - - for sim in params.firebase_store_manager.get_all_sim_infos().stream(): - print(sim) - sim_pojo = SimInfoPojo.from_firestore_dict(sim.to_dict()) - sim_info_list.append(sim_pojo) - row = 0 - col = 0 - # Create a workbook and add a worksheet. - workbook = xlsxwriter.Workbook('sim_infos.xlsx') - worksheet = workbook.add_worksheet() - for info in sim_info_list: - # Iterate over the data and write it out row by row. - worksheet.write(row, col, info.phone[2:len(info.phone)]) - worksheet.write(row, col + 1, info.ccid) - worksheet.write(row, col + 2, info.position) - row += 1 - workbook.close() + # params.firebase_store_manager.save_to_excel() + params.firebase_store_manager.clear_all_sim_info() diff --git a/db/sim_infos.xlsx b/db/sim_infos.xlsx new file mode 100644 index 0000000..9009ff4 Binary files /dev/null and b/db/sim_infos.xlsx differ diff --git a/logs/LogSender.py b/logs/LogSender.py index 804dae8..5cb2425 100644 --- a/logs/LogSender.py +++ b/logs/LogSender.py @@ -7,12 +7,15 @@ from oci.loggingingestion import LoggingClient from oci.loggingingestion.models import PutLogsDetails, LogEntryBatch, LogEntry from logs.AppLogging import init_logger +from pojo import ReserveResultPojo +from pojo.ReserveResultPojo import PublishType LOG_ERROR = "ERROR" LOG_INFO = "INFO" LOG_APPOINTMENT_ERROR = "APPOINTMENT_ERROR" LOG_APPOINTMENT_TIMEOUT = "TIMEOUT" LOG_APPOINTMENT_SUCCESS = "SUCCESS" +SUBJECT_SIM_INFO = "sim_card" class LogSender: @@ -21,7 +24,14 @@ class LogSender: self._identity = oci.identity.IdentityClient(self._config) self._loggingingestion_client = LoggingClient(self._config) - def send_log(self, msg: str, subject="appointment", type: str = "INFO"): + def send_appoint_result(self, result: ReserveResultPojo): + if result.type == PublishType.SUCCESS: + # get id + self.send_log(result.id, type=LOG_APPOINTMENT_SUCCESS) + else: + self.send_log(result.message, type=LOG_APPOINTMENT_ERROR) + + def send_log(self, msg: str, source="Appointment", subject="appointment", type: str = "INFO"): log_id = "ocid1.log.oc1.eu-frankfurt-1.amaaaaaacvc3jtia5enufv5jxe6binq4ndaty7pt5mk7uidipfd62ynwdhnq" response = self._loggingingestion_client.put_logs( log_id=log_id, @@ -33,7 +43,7 @@ class LogSender: data=msg, id=log_id, time=datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"))], - source="Appointment", + source=source, type=type, defaultlogentrytime=datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"), subject=subject)]) diff --git a/main.py b/main.py index e63b238..32af3ea 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ import logging import re import sys import time +from typing import Union from gsmmodem import GsmModem @@ -18,7 +19,7 @@ from logs.AppLogging import init_logger from utils.message_receiver import MessageReceiver BAUDRATE = 115200 -OTP_TIMEOUT = 60 +OTP_TIMEOUT = 70 is_finished = False commandor = Commandor() @@ -61,23 +62,26 @@ def execut_USSD_cmd(cmd, ser): send_command(cmd, ser) -def create_modem_for_port(port: str) -> SerialModem: +def create_modem_for_port(port: str) -> Union[SerialModem, None]: logger.info('Initializing modem... for ' + port) # Uncomment the following line to see what the modem is doing: init_logger() - modem = GsmModem(port) - time.sleep(1) - modem.connect() - number = modem.ownNumber - logger.info("The SIM card phone number is:") - logger.info(number) - cmd = "AT+CCID\r" - response = modem.write(cmd, True) - ccid = response[0].split(" ")[1].replace("\"", "") - logger.info("The SIM card ccid is:" + ccid) - - serial_modem = SerialModem(modem=modem, ccid=ccid) - return serial_modem + serial_modem = None + try: + modem = GsmModem(port) + time.sleep(1) + modem.connect() + number = modem.ownNumber + logger.info("The SIM card phone number is:") + logger.info(number) + cmd = "AT+CCID\r" + response = modem.write(cmd, True) + ccid = response[0].split(" ")[1].replace("\"", "") + logger.info("The SIM card ccid is:" + ccid) + return SerialModem(modem=modem, ccid=ccid) + except Exception as ext: + print(ext) + return serial_modem def timeout_occurred(serial_modem: SerialModem): @@ -133,7 +137,9 @@ def select_sim_storage(ser) -> bool: def init_modems() -> list: modems = [] for port in get_devices_ports(): - modems.append(create_modem_for_port(port)) + serial_modem = create_modem_for_port(port) + if serial_modem: + modems.append(serial_modem) # read the contact, and contact the 2 objects together excel_reader = ExcelHelper() contacts = excel_reader.read_contacts() @@ -153,7 +159,7 @@ def on_message_received(ch, method, properties, body): result = ReserveResultPojo.from_json(body) print(result) firebase_store_manager.save(result) - oracle_log_sender.send_log(str(result.id), type=LOG_APPOINTMENT_SUCCESS) + oracle_log_sender.send_appoint_result(result) # set the flag to True global is_finished is_finished = True @@ -180,8 +186,8 @@ def read_all_the_phone_number(): def start_book(): - slot_number = 5 - slot_sum = 6 + slot_number = 12 + slot_sum = 31 for i in range(slot_number, slot_sum + 1): card_pool.reset() print("will switch to " + str(i)) @@ -200,6 +206,6 @@ if __name__ == '__main__': init_logger() logger = logging.getLogger() logger.addHandler(logging.StreamHandler(stream=sys.stdout)) - # read_all_the_phone_number() - start_listen() - start_book() + read_all_the_phone_number() + # start_listen() + # start_book()