diff --git a/ModemPool.py b/ModemPool.py index 1739f91..3e8b0b8 100644 --- a/ModemPool.py +++ b/ModemPool.py @@ -3,9 +3,11 @@ import time import serial from serial import Serial +from db.DbManager import DataManager -from SIMError import SIMError +from error.SIMError import SIMError from logs.LogSender import LogSender, LOG_ERROR +from pojo.SimInfoPojo import SimInfoPojo from utils.excel_reader import ExcelHelper @@ -19,6 +21,7 @@ class ModemPool: self._serial_list = [] self._excel_helper = ExcelHelper() self._log_sender = LogSender() + self._db_manager = DataManager() for port in self._port_list: ser = serial.Serial(port, self.BAUDRATE, timeout=1) @@ -26,13 +29,15 @@ class ModemPool: def reset_all_modems(self): for ser in self._serial_list: + # may encontre exception here, multi-access to serial port + time.sleep(2) self._send_command("AT+CFUN=1,1\r", ser) # wait for 20 second, so that the modem can init all the sims time.sleep(20) def _generate_error_msg(self, slot_position, index, error: SIMError): msg = "slot({}) SIM({}), error:{}".format(slot_position, index + 1, - error.value) + error.value) self._log_sender.send_log(msg, subject=self.TAG, type=LOG_ERROR) return msg @@ -56,8 +61,12 @@ class ModemPool: match = re.search(r'33\d{9}', str(msg)) phone_number = match.group(0) print("phone is " + phone_number) + cmd = "AT+CCID\r" + response = str(self._send_command(cmd, ser)) + ccid_group = re.search("[0-9F]+", response) + ccid = ccid_group.group(0) if phone_number: - self._excel_helper.write_phone(phone_number) + self._db_manager.save_sim_info(SimInfoPojo(phone=phone_number, ccid=ccid)) # 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/card_pool.py b/card_pool.py index 7a90882..1d1446d 100644 --- a/card_pool.py +++ b/card_pool.py @@ -2,7 +2,7 @@ import logging import serial -PORT = "/dev/tty.usbmodem112101" +PORT = "/dev/tty.usbmodem1432101" BAUDRATE = 115200 diff --git a/db/DbManager.py b/db/DbManager.py index da56216..0d85a47 100644 --- a/db/DbManager.py +++ b/db/DbManager.py @@ -1,13 +1,13 @@ import datetime -import json - import firebase_admin from firebase_admin import credentials, firestore from pojo.ReserveResultPojo import ReserveResultPojo, PublishType +from pojo.SimInfoPojo import SimInfoPojo from pojo.contact_pojo import ContactPojo ERROR_COLLECTION_NAME = "error_items" +SIM_INFOS = "sim_infos" TIMEOUT = "timeout_items" @@ -24,6 +24,10 @@ class DataManager: doc_ref = self._db.collection(u'2022-02-25') return doc_ref + def save_sim_info(self, simInfoPojo: SimInfoPojo): + doc_ref = self._db.collection(SIM_INFOS).document(simInfoPojo.phone) + doc_ref.set(simInfoPojo.to_firestore_dict()) + def save(self, result: ReserveResultPojo): if result.type == PublishType.SUCCESS: # get id diff --git a/SIMError.py b/error/SIMError.py similarity index 100% rename from SIMError.py rename to error/SIMError.py diff --git a/main.py b/main.py index 0386d0b..40d5567 100644 --- a/main.py +++ b/main.py @@ -7,9 +7,10 @@ import time from gsmmodem import GsmModem from ModemPool import ModemPool -from card_pool import CardPool, PORT +from card_pool import CardPool from commandor import Commandor from db.DbManager import DataManager +from params import MODEM_POOL_PORTS, CARD_POOL_PORT from pojo.ReserveResultPojo import ReserveResultPojo from utils.excel_reader import ExcelHelper from pojo.serial_modem import SerialModem @@ -20,32 +21,13 @@ BAUDRATE = 115200 OTP_TIMEOUT = 60 is_finished = False commandor = Commandor() -timeout_contact_list = [] - -# ser = serial.Serial(PORT, BAUDRATE, timeout=1) db_manager = DataManager() +card_pool = CardPool(CARD_POOL_PORT) def get_devices_ports() -> list: - return [ - "/dev/tty.usbmodem111101", - "/dev/tty.usbmodem111103", - "/dev/tty.usbmodem111105", - "/dev/tty.usbmodem111107", - "/dev/tty.usbmodem111201", - "/dev/tty.usbmodem111203", - "/dev/tty.usbmodem111205", - "/dev/tty.usbmodem111207", - "/dev/tty.usbmodem111301", - ## "/dev/tty.usbmodem111303", - "/dev/tty.usbmodem111305", - "/dev/tty.usbmodem111307", - "/dev/tty.usbmodem111401", - "/dev/tty.usbmodem111403", - "/dev/tty.usbmodem111405", - "/dev/tty.usbmodem111407" - ] + return MODEM_POOL_PORTS def has_sim(ser) -> bool: @@ -58,11 +40,15 @@ def has_sim(ser) -> bool: return False -def send_command(cmd: str, ser) -> bytes: - print("send command {}".format(cmd)) +def send_command(cmd: str, ser, wait_time_in_s: int = 0) -> bytes: ser.write(cmd.encode()) - time.sleep(10) msg = ser.read(100) + count = 0 + while 'OK' not in str(msg) and count < wait_time_in_s: + time.sleep(1) + count = count + 1 + msg = ser.read(100) + # msg = ser.read(100) print(msg) return msg @@ -95,7 +81,6 @@ def create_modem_for_port(port: str) -> SerialModem: def timeout_occurred(serial_modem: SerialModem): - timeout_contact_list.append(serial_modem.contact) db_manager.save_timeout_contact(serial_modem.contact) @@ -134,6 +119,16 @@ def handle_sms(sms): is_finished = True +def select_sim_storage(ser) -> bool: + # use SIM Card storage + cmd_sm = "AT+CPBS=\"SM\"\r" + result = send_command(cmd_sm, ser) + if "ERROR" in str(result): + return False + else: + return True + + def init_modems() -> list: modems = [] for port in get_devices_ports(): @@ -169,12 +164,11 @@ def start_listen(): def read_all_the_phone_number(): - card_pool = CardPool(PORT) slot_number = 1 - slot_sum = 28 - # card_pool.switch_to_slot(10) + slot_sum = 3 + # card_pool.switch_to_slot(3) - for i in range(1, slot_sum + 1): + for i in range(slot_number, slot_sum + 1): card_pool.reset() print("will switch to " + str(i)) card_pool.switch_to_slot(i) @@ -183,25 +177,27 @@ def read_all_the_phone_number(): modem_pool.get_raw_phone_number(i) +def start_book(): + slot_number = 3 + slot_sum = 3 + for i in range(slot_number, slot_sum + 1): + card_pool.reset() + print("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 + for modem in modem_list: + if modem.contact: + commandor.start_page(modem.contact) + start_to_handle_sms(modem) + + if __name__ == '__main__': init_logger() logger = logging.getLogger() logger.addHandler(logging.StreamHandler(stream=sys.stdout)) - read_all_the_phone_number() - # start_listen() - # reset the sim card pool - # send_command("AT+SWIT01-0001\r", ser) - - # enable verbose logs for all port - - # # create modems for all the available port - # modem_list = init_modems() - # create listeners for chaque modem - # for modem in modem_list: - # commandor.start_page(modem.contact) - # start_to_handle_sms(modem) - # # save the timeout contacts - # timeout_list = json.dumps(timeout_contact_list) - # f = open("timeout_list.json", "a") - # f.write(str(timeout_list)) - # f.close() + # read_all_the_phone_number() + start_listen() + start_book() diff --git a/params.py b/params.py new file mode 100644 index 0000000..f75ba03 --- /dev/null +++ b/params.py @@ -0,0 +1,19 @@ +MODEM_POOL_PORTS = [ + "/dev/tty.usbmodem1431101", + "/dev/tty.usbmodem1431103", + "/dev/tty.usbmodem1431105", + "/dev/tty.usbmodem1431107", + "/dev/tty.usbmodem1431201", + "/dev/tty.usbmodem1431203", + "/dev/tty.usbmodem1431205", + "/dev/tty.usbmodem1431207", + "/dev/tty.usbmodem1431301", + ## "/dev/tty.usbmodem1431303", + "/dev/tty.usbmodem1431305", + "/dev/tty.usbmodem1431307", + "/dev/tty.usbmodem1431401", + "/dev/tty.usbmodem1431403", + "/dev/tty.usbmodem1431405", + "/dev/tty.usbmodem1431407" +] +CARD_POOL_PORT = "/dev/tty.usbmodem1432101" diff --git a/pojo/SimInfoPojo.py b/pojo/SimInfoPojo.py new file mode 100644 index 0000000..4598933 --- /dev/null +++ b/pojo/SimInfoPojo.py @@ -0,0 +1,15 @@ +class SimInfoPojo: + phone: str + ccid: str + + def __init__(self, phone: str, ccid: str): + self.phone = phone + self.ccid = ccid + + def to_firestore_dict(self): + dest = { + u'phone': self.phone, + u'ccid': self.ccid, + } + + return dest diff --git a/utils/ccid_list.xlsx b/utils/ccid_list.xlsx new file mode 100644 index 0000000..b6c2f88 Binary files /dev/null and b/utils/ccid_list.xlsx differ diff --git a/utils/excel_reader.py b/utils/excel_reader.py index e26fdfb..84f712d 100644 --- a/utils/excel_reader.py +++ b/utils/excel_reader.py @@ -10,13 +10,30 @@ class ExcelHelper: def __init__(self): self._df = pandas.Series() - def write_phone(self, phone_number): - new_df = pandas.Series([phone_number]) + def write_phone(self, phone_ccid): + (phone, ccid) = phone_ccid f = open("phone_list.txt", "a") + f.write("{},".format(phone[2:len(phone)])) + f.close() + + def write_ccid(self, phone_number): + f = open("ccid_list.txt", "a") f.write("{},".format(phone_number)) f.close() + + def write_to_exel(self, file_name, data_list: list): + new_df = pandas.Series(data_list) self._df = pandas.concat([self._df, new_df]) - self._df.to_excel("phone_list.xlsx") + self._df.to_excel(file_name) + + def generate_exel_from_txt(self): + f = open("../phone_list.txt") + lines = f.read() + self.write_to_exel("phone_list.xlsx", lines.split(",")) + ccid_file = open("../ccid_list.txt") + ccids = ccid_file.read() + self.write_to_exel("ccid_list.xlsx", ccids.split(",")) + print(lines) # read the contact list from the exel file def read_contacts(self) -> list: @@ -39,8 +56,4 @@ class ExcelHelper: if __name__ == '__main__': helper = ExcelHelper() - helper.write_phone("88649614591") - helper.write_phone("88649614591") - helper.write_phone("88649614591") - helper.write_phone("8864961591") - helper.write_phone("88649614591") + helper.generate_exel_from_txt() diff --git a/utils/phone_list.xlsx b/utils/phone_list.xlsx index 96d24c4..e4812bc 100644 Binary files a/utils/phone_list.xlsx and b/utils/phone_list.xlsx differ