can restart modemPool and detected disabled sim card

This commit is contained in:
2022-02-24 17:17:39 +01:00
parent eebb76eb2a
commit 34dbe1d909
17 changed files with 382 additions and 49 deletions
+115 -40
View File
@@ -1,4 +1,5 @@
import datetime
import json
import logging
import re
import sys
@@ -6,34 +7,47 @@ import time
from gsmmodem import GsmModem
from ModemPool import ModemPool
from card_pool import CardPool
from commandor import Commandor
from excel_reader import ExcelReader
from db.DbManager import DataManager
from pojo.ReserveResultPojo import ReserveResultPojo, PublishType
from utils.excel_reader import ExcelHelper
from pojo.serial_modem import SerialModem
from utils.logging import init_logger
from utils.message_receiver import MessageReceiver
BAUDRATE = 115200
OTP_TIMEOUT = 60
sms_received = False
is_finished = False
commandor = Commandor()
timeout_contact_list = []
PORT = "/dev/tty.usbmodem1301"
# ser = serial.Serial(PORT, BAUDRATE, timeout=1)
db_manager = DataManager()
def get_devices_ports() -> list:
return ["/dev/tty.usbmodem121101",
"/dev/tty.usbmodem121103",
"/dev/tty.usbmodem121105",
"/dev/tty.usbmodem121107",
"/dev/tty.usbmodem121201",
"/dev/tty.usbmodem121203",
"/dev/tty.usbmodem121205",
"/dev/tty.usbmodem121207",
"/dev/tty.usbmodem121301",
# "/dev/tty.usbmodem1121303",
"/dev/tty.usbmodem121305",
"/dev/tty.usbmodem121307",
"/dev/tty.usbmodem121401",
"/dev/tty.usbmodem121403",
"/dev/tty.usbmodem121405",
"/dev/tty.usbmodem121407"]
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:
@@ -49,21 +63,26 @@ def has_sim(ser) -> bool:
def send_command(cmd: str, ser) -> bytes:
print("send command {}".format(cmd))
ser.write(cmd.encode())
time.sleep(10)
msg = ser.read(100)
logger.info(msg)
print(msg)
return msg
def get_phone_number():
def get_phone_number(ser):
cmd = "AT+CNUM\r"
send_command(cmd)
send_command(cmd, ser)
def execut_USSD_cmd(cmd, ser):
send_command(cmd, ser)
def create_modem_for_port(port: str) -> SerialModem:
logger.info('Initializing modem... for ' + port)
# Uncomment the following line to see what the modem is doing:
init_logger()
modem = GsmModem(port, BAUDRATE)
modem = GsmModem(port)
modem.connect('0000')
number = modem.ownNumber
logger.info("The SIM card phone number is:")
@@ -77,19 +96,26 @@ def create_modem_for_port(port: str) -> SerialModem:
return serial_modem
def timeout_occurred(serial_modem: SerialModem):
timeout_contact_list.append(serial_modem.contact)
db_manager.save_timeout_contact(serial_modem.contact)
def start_to_handle_sms(serial_modem: SerialModem):
serial_modem.modem.smsReceivedCallback = handle_sms
global sms_received
sms_received = False
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 sms_received:
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)
return
return
@@ -103,9 +129,11 @@ def handle_sms(sms):
otp = match.group(0)
logger.info("otp is " + otp)
commandor.send_otp(otp)
time.sleep(20)
global sms_received
sms_received = True
# wait for the sms for 20 seconds
global is_finished
while not is_finished:
time.sleep(2)
is_finished = True
def init_modems() -> list:
@@ -113,24 +141,71 @@ def init_modems() -> list:
for port in get_devices_ports():
modems.append(create_modem_for_port(port))
# read the contact, and contact the 2 objects together
excel_reader = ExcelReader()
excel_reader = ExcelHelper()
contacts = excel_reader.read_contacts()
for modem in modems:
contact = [contact for contact in contacts if contact.ccid == modem.ccid][0]
modem.phone_number = contact.phone
modem.contact = contact
for index, modem in enumerate(modems):
contact = [contact for contact in contacts if contact.ccid == modem.ccid]
if len(contact) > 0:
modem.phone_number = contact[0].phone
modem.contact = contact[0]
else:
logger.info("contact not found for {}, position:{}".format(modem.ccid, index + 1))
return modems
def on_message_received(ch, method, properties, body):
logger.info(" [x] Received {} {}".format(body, datetime.datetime.now()))
# parse the received message
result = ReserveResultPojo.from_json(body)
print(result)
db_manager.save(result)
# set the flag to True
global is_finished
is_finished = True
# save the result to db
def start_listen():
logger.info("start to listen to message queue")
receiver = MessageReceiver()
receiver.start_listener(on_message_received)
def read_all_the_phone_number():
card_pool = CardPool("/dev/tty.usbmodem11301")
slot_number = 1
slot_sum = 32
card_pool.reset()
for i in range(2, slot_sum + 1):
# i = 2
card_pool.switch_to_slot(i)
modem_pool = ModemPool(get_devices_ports())
modem_pool.reset_all_modems()
modem_pool.get_raw_phone_number(i)
if __name__ == '__main__':
# enable verbose logs for all port
init_logger()
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
# create modems for all the available port
modem_list = init_modems()
# create listeners for chaque modem
read_all_the_phone_number()
# start_listen()
# reset the sim card pool
# send_command("AT+SWIT01-0001\r", ser)
for modem in modem_list:
commandor.start_page(modem.contact)
start_to_handle_sms(modem)
# 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()