From 16efab25a3cd367971bf1ff319a87a63a98004d4 Mon Sep 17 00:00:00 2001 From: PAN Lei Date: Fri, 18 Feb 2022 22:43:35 +0100 Subject: [PATCH] add excel reader --- .gitignore | 2 + commandor.py | 30 ++++++ contact.xlsx | Bin 0 -> 33640 bytes excel_reader.py | 30 ++++++ main.py | 97 ++++++++++++++++--- pojo/__init__.py | 0 pojo/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 150 bytes pojo/__pycache__/contact_pojo.cpython-39.pyc | Bin 0 -> 751 bytes pojo/contact_pojo.py | 17 ++++ pojo/serial_modem.py | 10 ++ utils/__init__.py | 0 utils/logging.py | 9 ++ 12 files changed, 184 insertions(+), 11 deletions(-) create mode 100644 commandor.py create mode 100644 contact.xlsx create mode 100644 excel_reader.py create mode 100644 pojo/__init__.py create mode 100644 pojo/__pycache__/__init__.cpython-39.pyc create mode 100644 pojo/__pycache__/contact_pojo.cpython-39.pyc create mode 100644 pojo/contact_pojo.py create mode 100644 pojo/serial_modem.py create mode 100644 utils/__init__.py create mode 100644 utils/logging.py diff --git a/.gitignore b/.gitignore index 85e7c1d..17fecdb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /.idea/ +__pycache__ +.~contact.xlsx \ No newline at end of file diff --git a/commandor.py b/commandor.py new file mode 100644 index 0000000..1df0123 --- /dev/null +++ b/commandor.py @@ -0,0 +1,30 @@ +import subprocess + +PACKAGE_NAME = "com.lpa.appointement" +ACTIVITY_NAME = "MainActivity" + + +class Commandor: + + def __init__(self): + pass + + def reload_page(self): + # specifying an explicit component name + self.clear_app_data() + subprocess.call("adb shell am start -n {}/.{}".format(PACKAGE_NAME, ACTIVITY_NAME), shell=True) + pass + + def clear_app_data(self): + subprocess.call("adb shell pm clear {}".format(PACKAGE_NAME), shell=True) + + def send_telephone_number(self): + pass + + def send_otp(self): + pass + + +if __name__ == '__main__': + commandor = Commandor() + commandor.reload_page() diff --git a/contact.xlsx b/contact.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e7945f03b8e9ee5293c3138160f2a0f4f21db728 GIT binary patch literal 33640 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 nPb+^O@${D!YR*3!_RGqz1E1ujz< list: + contact_list_in_json = pandas.read_excel(r'./contact.xlsx').to_json(orient='records') + contact_dict_list = json.loads(contact_list_in_json) + contact_list = [] + for contact_dict in contact_dict_list: + name = contact_dict['name'].split(' ') + first_name = name[0] + last_name = name[-1] + contact = ContactPojo(phone_number=contact_dict['phone'], + last_name=last_name, + first_name=first_name, + ccid=contact_dict['ccid'], + passport_number=contact_dict['passport']) + contact_list.append(contact) + return contact_list + + +if __name__ == '__main__': + reader = ExcelReader() + data = reader.read_file() + print(data) diff --git a/main.py b/main.py index 6e98af5..2e3b040 100644 --- a/main.py +++ b/main.py @@ -1,23 +1,48 @@ +import logging + import serial from gsmmodem import GsmModem from gsmmodem.modem import SentSms +from utils.logging import init_logger + PORT = "/dev/tty.usbmodem11101" BAUDRATE = 115200 -ser = serial.Serial(PORT, BAUDRATE, timeout=1) -def has_sim() -> bool: +# ser = serial.Serial(PORT, BAUDRATE, timeout=1) + + +def get_devices_ports() -> list: + return ["/dev/tty.usbmodem1121101", + "/dev/tty.usbmodem1121103", + "/dev/tty.usbmodem1121105", + "/dev/tty.usbmodem1121107", + "/dev/tty.usbmodem1121201", + "/dev/tty.usbmodem1121203", + "/dev/tty.usbmodem1121205", + "/dev/tty.usbmodem1121207", + "/dev/tty.usbmodem1121301", + # "/dev/tty.usbmodem1121303", + "/dev/tty.usbmodem1121305", + "/dev/tty.usbmodem1121307", + "/dev/tty.usbmodem1121401", + "/dev/tty.usbmodem1121403", + "/dev/tty.usbmodem1121405", + "/dev/tty.usbmodem1121407"] + + +def has_sim(ser) -> bool: # check pin cmd_check_pin = "AT+cpin?\r" - msg = send_command(cmd_check_pin) + msg = send_command(cmd_check_pin, ser) if b'OK' in msg: return True else: return False -def send_command(cmd: str) -> bytes: +def send_command(cmd: str, ser) -> bytes: print("send command {}".format(cmd)) ser.write(cmd.encode()) msg = ser.read(100) @@ -25,6 +50,16 @@ def send_command(cmd: str) -> bytes: return msg +def get_phone_number(): + cmd = "AT+CNUM\r" + send_command(cmd) + + +def get_sim_ccid(): + cmd = "AT+CCID\r" + send_command(cmd) + + def send_sms(sms_destination: str, msg: str): print('Initializing modem...') modem = GsmModem(PORT, BAUDRATE) @@ -41,11 +76,51 @@ def send_sms(sms_destination: str, msg: str): modem.close() +def create_modem_for_port(port: str) -> GsmModem: + print('Initializing modem... for ' + port) + # Uncomment the following line to see what the modem is doing: + init_logger() + modem = GsmModem(port, BAUDRATE) + modem.connect('0000') + number = modem.ownNumber + print("The SIM card phone number is:") + print(number) + cmd = "AT+CCID\r" + ccid = modem.write(cmd, True) + print("The SIM card ccid is:" + " ".join(ccid)) + return modem + + +def start_to_handle_sms(modem: GsmModem): + modem.smsReceivedCallback = handle_sms + # modem = GsmModem(PORT, BAUDRATE, smsReceivedCallbackFunc=handle_sms) + modem.smsTextMode = False + # modem.connect('0000') + print('Waiting for SMS message...') + try: + modem.rxThread.join( + 2 ** 31) # Specify a (huge) timeout so that it essentially blocks indefinitely, but still receives CTRL+C interrupt signal + finally: + modem.close() + + +def handle_sms(sms): + print(u'== SMS message received ==\nFrom: {0}\nTime: {1}\nMessage:\n{2}\n'.format(sms.number, sms.time, sms.text)) + + if __name__ == '__main__': - # enable verbose logs - cmd = "AT+CMEE=2\r" - send_command(cmd) - if has_sim(): - send_sms("+33649614591","Modem pool test") - else: - print("no cart sim") + # enable verbose logs for all port + # create modems for all the available port + modem_list = [] + for port in get_devices_ports(): + modem_list.append(create_modem_for_port(port)) + # cmd = "AT+CMEE=2\r" + # send_command(cmd) + + # if has_sim(): + # # send_sms("+33649614591", "Modem pool test") + # modem = show_own_phone_number() + # get_sim_ccid() + # # start_to_handle_sms(modem) + # else: + # print("no cart sim") diff --git a/pojo/__init__.py b/pojo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pojo/__pycache__/__init__.cpython-39.pyc b/pojo/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9fcfb6772428a5d0e03f654f70acb3ef4252e51 GIT binary patch literal 150 zcmYe~<>g`kg7CHcNg(<$h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vSKeRZts8~Oz zATdwhB|o_|H#M)MSid~KD7&~IF*#KqD4Us>Q<7R-qF<1om9HNkpP83g5+AQuP(MS zl@qVPiJ5E`1;(0hJU<>!zF6&c1p&D#pWXeSg#1KjEdrct(C`946HR+E(1ucC=xd^x z=8r`42lhZ4ro}r_Wxt?~R5We1imL5Z2rWj|vH|BBG`s;Yq@kKL?3NgAgr=8A%NENQ zD;As0mP0Kpz4?~uGo3$*CevHEy-4Rb&ceO%t^43oHokY(qE_Gbt=K#T54aL+(*Kxe8ZIuS`G21q9k$R+{E zrwmYN0>jdMm3idXX9)jxuQo{p)8G3o=I|f=SMZ(q5~9Da>f2y^sQXdb`ju-BgRwEx zpPm00M%9`cvYqOq39%l5l)607e>0!$SlXrBv3ssAA`AkkUWFZ^64(utS#vARPgd1