From 917cb3c7049d709aa98131415527bd198e5369c1 Mon Sep 17 00:00:00 2001 From: Vincent BENOIT Date: Fri, 25 Nov 2022 15:41:51 +0100 Subject: [PATCH] correction bug sur la gestion du code pin --- kineintercom/intercom.py | 124 +++++++++++++++++++++++++++------------ 1 file changed, 85 insertions(+), 39 deletions(-) diff --git a/kineintercom/intercom.py b/kineintercom/intercom.py index 468993e..356523d 100644 --- a/kineintercom/intercom.py +++ b/kineintercom/intercom.py @@ -216,20 +216,22 @@ def set_sim_pin(serObj=None, pin_actif=False, code_pin="", logger=None): :param log: logger object - :return bool: - True if OK, otherwise False + :return int: + 0 if OK + 1 if sim code error + 2 if error ''' if not isinstance(logger, log.Logger): - return False + return 2 if not isinstance(serObj, serial.serialposix.Serial): logger.error("error parameter, expecting serial.serialposix.Serial, get {}".format(type(serObj))) - return False + return 2 if not isinstance(pin_actif, bool): logger.error("error parameter, expecting bool, get {}".format(type(pin_actif))) - return False + return 2 if not isinstance(code_pin, str): logger.error("error parameter, expecting str, get {}".format(type(code_pin))) - return False + return 2 # SIM PIN mandatory or not ret, rsp = send_at_cmd(cmd='AT+CPIN?', @@ -238,10 +240,10 @@ def set_sim_pin(serObj=None, pin_actif=False, code_pin="", logger=None): logger=logger) if ret == 2: logger.error("Erreur avec la commande AT: {}".format('AT+CPIN?')) - return False + return 2 elif ret == 1: logger.warning("Timeout avec la commande AT: {}".format('AT+CPIN?')) - return False + return 2 else: for item in rsp: if item.startswith('+CPIN:'): @@ -250,7 +252,7 @@ def set_sim_pin(serObj=None, pin_actif=False, code_pin="", logger=None): # Must enter SIM PIN if not pin_actif: logger.error("Configuration en conflit avec la réponse du module GSM") - return False + return 1 else: # Enter the SIM PIN configured in database ret, _ = send_at_cmd(cmd='AT+CPIN='+code_pin, @@ -259,17 +261,17 @@ def set_sim_pin(serObj=None, pin_actif=False, code_pin="", logger=None): logger=logger) if ret == 2: logger.error("Erreur avec la commande AT: {}".format('AT+CPIN=')) - return False + return 1 elif ret == 1: logger.warning("Timeout avec la commande AT: {}".format('AT+CPIN=')) - return False + return 2 else: logger.info("code PIN validé ...") elif item.split('+CPIN: ')[1] == 'READY': # SIM PIN already notified logger.info('SIM déverrouillée ...') - return True + return 0 def init_gsm_com(serObj=None, config={}, logger=None): ''' Init GSM Communication @@ -292,17 +294,19 @@ def init_gsm_com(serObj=None, config={}, logger=None): :param log: logger object - :return bool: - True if OK, otherwise False + :return int: + 0 if OK + 1 if sim code error + 2 if error ''' if not isinstance(logger, log.Logger): - return False + return 2 if not isinstance(serObj, serial.serialposix.Serial): logger.error("error parameter, expecting serial.serialposix.Serial, get {}".format(type(serObj))) - return False + return 2 if not isinstance(config, dict): logger.error("error parameter, expecting dict, get {}".format(type(config))) - return False + return 2 cmd_lst = [{'cmd':'ATE1', 'timeout':0.0, 'func':None}, {'cmd':'AT+CMEE=2', 'timeout':0.0, 'func':None}] @@ -311,18 +315,26 @@ def init_gsm_com(serObj=None, config={}, logger=None): cmd_lst.append({'cmd':'AT+CMGF=1', 'timeout':0.0, 'func':None}) cmd_lst.append({'cmd':'AT+VTD='+str(config['DTMF_DURATION']), 'timeout':0.0, 'func':None}) - if not set_sim_pin(serObj=serObj, pin_actif=config['PIN_ACTIF'], code_pin=config['CODE_PIN'], logger=logger): - return False + ret = set_sim_pin(serObj=serObj, + pin_actif=config['PIN_ACTIF'], + code_pin=config['CODE_PIN'], + logger=logger) + if ret > 0: + return ret logger.info("Initialisation des commandes GSM ...") for item in cmd_lst: - ret, rsp = send_at_cmd(cmd=item['cmd'], timeout=item['timeout'], serObj=serObj, logger=logger) + ret, rsp = send_at_cmd(cmd=item['cmd'], + timeout=item['timeout'], + serObj=serObj, + logger=logger) if ret == 2: logger.error("Erreur avec la commande AT: {}".format(item['cmd'])) return False elif ret == 1: logger.warning("Timeout avec la commande AT: {}".format(item['cmd'])) - return True + ret = 2 + return ret def update_gsm_com(serObj=None, config={}, logger=None): ''' Init GSM Communication @@ -721,16 +733,20 @@ def process(buf="", config={}, ser=None, logger=None): else: logger.error("Erreur de connexion avec le correspondant") elif buf.startswith('+CMTI: '): # receive msg - msg_num = buf.split('+CMTI: ')[1].split(',')[1] + search = re.match('^(?:\+CMTI: \"SM\",)([0-9]+)$', buf) send_at_cmd(cmd='AT+CMGF=1', timeout=0.0, serObj=ser, logger=logger) - ret, rsp = send_at_cmd(cmd='AT+CMGR='+msg_num, timeout=0.0, serObj=ser, logger=logger) - if ret == 0: - phone_num = rsp[1].split('+CMGR: ')[1].split(',')[1][1:-1] - msg = rsp[2] - logger.info('[{}] {}'.format(phone_num, msg)) + if search: + msg_num = search.groups()[0] + ret, rsp = send_at_cmd(cmd='AT+CMGR='+msg_num, timeout=0.0, serObj=ser, logger=logger) + if ret == 0: + phone_num = rsp[1].split('+CMGR: ')[1].split(',')[1][1:-1] + msg = rsp[2] + logger.info('[{}] {}'.format(phone_num, msg)) + else: + logger.error("Impossible de lire le SMS") + ret, rsp = send_at_cmd(cmd='AT+CMGD='+str(msg_num), timeout=0.0, serObj=ser, logger=logger) else: - logger.error("Impossible de lire le SMS") - ret, rsp = send_at_cmd(cmd='AT+CMGD='+str(msg_num), timeout=0.0, serObj=ser, logger=logger) + logger.error('aucune correspondance') return True @@ -738,6 +754,7 @@ def process(buf="", config={}, ser=None, logger=None): # Corps principal du programme # GSM_MODULE_STATE = False +GSM_MODULE_SIM_STATE = False GSM_MODULE_INIT_STATE = False FLAG_CONF_UPDATE = False FLAG_HORAIRE_UPDATE = False @@ -761,6 +778,7 @@ def main(): logger.addHandler(handler) global GSM_MODULE_STATE + global GSM_MODULE_SIM_STATE global GSM_MODULE_INIT_STATE global FLAG_CONF_UPDATE global FLAG_HORAIRE_UPDATE @@ -845,20 +863,33 @@ def main(): # Initialize GSM communication logger.info("Initialisation des commandes AT nécessaires ...") ret = init_gsm_com(serObj=ser, config=config, logger=logger) - if not ret: + if ret == 2: logger.error("Erreur d'initialisation de la com GSM avec le module") ser.close() sys.exit(1) + elif ret == 1: + logger.error("Erreur de code PIN") + GSM_MODULE_INIT_STATE = False + GSM_MODULE_STATE = False + # On force en Manuel OFF + config['OPERATION'] = 'Manuel OFF' + # mise à jour de la base de données + with open(os.path.join("/etc/kineintercom", "db.json"), 'w') as f: + json.dump(config, f) + # On eteint le module GSM en cas de mauvais code PIN + if not setup_module(): + logger.error("Erreur de configuration des GPIOs de la board") + ser.close() + sys.exit(1) else: GSM_MODULE_INIT_STATE = True - - # Retreive GSM infos - logger.info('Récupération des infos du module ...') - ret = info_gsm_com(serObj=ser, config=config, logger=logger) - if not ret: - logger.error("Erreur d'initialisation de la com GSM avec le module") - ser.close() - sys.exit(1) + # Retreive GSM infos + logger.info('Récupération des infos du module ...') + ret = info_gsm_com(serObj=ser, config=config, logger=logger) + if not ret: + logger.error("Erreur d'initialisation de la com GSM avec le module") + ser.close() + sys.exit(1) else: # Si le module GSM doit être éteint et qu'il est allumé, on l'eteint if GSM_MODULE_STATE: @@ -870,6 +901,7 @@ def main(): else: GSM_MODULE_STATE = False GSM_MODULE_INIT_STATE = False + GSM_MODULE_SIM_STATE = False server_addr = "/tmp/uds_socket" # Make sure the socket does not already exist @@ -931,9 +963,23 @@ def main(): time.sleep(10) # Initialize GSM serial communication ret = init_gsm_com(serObj=ser, config=config, logger=logger) - if not ret: + if ret == 2: logger.error("Erreur d'initialisation de la com GSM avec le module") break + elif ret == 1: + logger.error("Erreur de code PIN") + GSM_MODULE_INIT_STATE = False + GSM_MODULE_STATE = False + # On force en Manuel OFF + config['OPERATION'] = 'Manuel OFF' + # mise à jour de la base de données + with open(os.path.join("/etc/kineintercom", "db.json"), 'w') as f: + json.dump(config, f) + # On eteint le module GSM en cas de mauvais code PIN + if not setup_module(): + logger.error("Erreur de configuration des GPIOs de la board") + ser.close() + sys.exit(1) else: GSM_MODULE_INIT_STATE = True logger.info('Récupération des infos du module ...')