update du processus
This commit is contained in:
101
src/intercom.py
101
src/intercom.py
@@ -129,7 +129,7 @@ def send_at_cmd(cmd='', timeout=0.0, serObj=None, logger=None):
|
||||
out = ''
|
||||
outlst = []
|
||||
while serObj.in_waiting > 0:
|
||||
c = serObj.read(1).decode('utf-8')
|
||||
c = serObj.read(1).decode('utf-8', 'replace')
|
||||
if c == '\r' or c == '\n':
|
||||
if out != '':
|
||||
outlst.append(out)
|
||||
@@ -145,11 +145,11 @@ def send_at_cmd(cmd='', timeout=0.0, serObj=None, logger=None):
|
||||
else:
|
||||
return 1, None
|
||||
except Exception as e:
|
||||
logger.error("Error: {}".format(e))
|
||||
return 2
|
||||
return 0
|
||||
logger.error("Erreur: {}".format(e))
|
||||
return 2, None
|
||||
return 0, None
|
||||
|
||||
def init_gsm_com(serObj=None, config=None, logger=None):
|
||||
def init_gsm_com(serObj=None, config={}, logger=None):
|
||||
''' Init GSM Communication
|
||||
source : SIM800_Series_AT_command Manual_v1.09
|
||||
AT : test command
|
||||
@@ -159,6 +159,7 @@ def init_gsm_com(serObj=None, config=None, logger=None):
|
||||
AT+CREG? : Network registration - return the status of result code
|
||||
AT+CSQ :
|
||||
AT+CLTS=1 :
|
||||
AT+CMGF=1 : Set the format of messages to Text mode
|
||||
AT+CLIP=1 : The calling line identifty (CLI) of calling party when
|
||||
receiving a mobile terminated call
|
||||
AT+VTD=1 : Tone Duration (in 1/10 seconds)
|
||||
@@ -168,29 +169,35 @@ def init_gsm_com(serObj=None, config=None, logger=None):
|
||||
serial object
|
||||
|
||||
:param config:
|
||||
config object
|
||||
dictionary config object from JSON database
|
||||
|
||||
:param log:
|
||||
logger object
|
||||
|
||||
:return bool:
|
||||
'''
|
||||
if not isinstance(logger, log.Logger):
|
||||
return False
|
||||
if not isinstance(serObj, serial.serialposix.Serial):
|
||||
logger.error("error parameter, expecting serial.serialposix.Serial, get {}".format(type(serObj)))
|
||||
return False
|
||||
if not isinstance(logger, log.Logger):
|
||||
logger.error("error parameter, expecting logging.Logger, get {}".format(type(logger)))
|
||||
if not isinstance(config, dict):
|
||||
logger.error("error parameter, expecting dict, get {}".format(type(config)))
|
||||
return False
|
||||
|
||||
cmd_lst = ['AT',
|
||||
'ATE1',
|
||||
'AT+CMEE=2',
|
||||
'AT+CPIN?',
|
||||
'AT+CREG?',
|
||||
'AT+CSQ',
|
||||
'AT+CLTS=1',
|
||||
'AT+CLIP=1',
|
||||
'AT+CMGF=1',
|
||||
'AT+VTD='+str(config['DTMF_DURATION'])]
|
||||
if config['PIN_ACTIF']:
|
||||
cmd_lst.append('AT+CPIN='+config['CODE_PIN'])
|
||||
else:
|
||||
cmd_lst.append('AT+CPIN?')
|
||||
for cmd in cmd_lst:
|
||||
ret, _ = send_at_cmd(cmd=cmd, timeout=0.0, serObj=serObj, logger=logger)
|
||||
if ret == 2:
|
||||
@@ -200,6 +207,41 @@ def init_gsm_com(serObj=None, config=None, logger=None):
|
||||
lgger.warning("Timeout avec la commande AT: {}".format(cmd))
|
||||
return True
|
||||
|
||||
def update_gsm_com(serObj=None, config={}, logger=None):
|
||||
''' Init GSM Communication
|
||||
source : SIM800_Series_AT_command Manual_v1.09
|
||||
AT+VTD=<PARAM DB> : Tone Duration (in 1/10 seconds)
|
||||
|
||||
:param serObj:
|
||||
serial object
|
||||
|
||||
:param config:
|
||||
dictionary config object from JSON database
|
||||
|
||||
:param log:
|
||||
logger object
|
||||
|
||||
:return bool:
|
||||
True if ok, otherwise False
|
||||
'''
|
||||
if not isinstance(logger, log.Logger):
|
||||
return False
|
||||
if not isinstance(serObj, serial.serialposix.Serial):
|
||||
logger.error("error parameter, expecting serial.serialposix.Serial, get {}".format(type(serObj)))
|
||||
return False
|
||||
if not isinstance(config, dict):
|
||||
logger.error("error parameter, expecting dict, get {}".format(type(config)))
|
||||
return False
|
||||
|
||||
cmd_lst = ['AT+VTD='+str(config['DTMF_DURATION'])]
|
||||
for cmd in cmd_lst:
|
||||
ret, _ = send_at_cmd(cmd=cmd, timeout=0.0, serObj=serObj, logger=logger)
|
||||
if ret == 2:
|
||||
logger.error("Erreur avec la commande AT: {}".format(cmd))
|
||||
return False
|
||||
elif ret == 1:
|
||||
lgger.warning("Timeout avec la commande AT: {}".format(cmd))
|
||||
return True
|
||||
|
||||
def info_gsm_com(serObj=None, config={}, logger=None):
|
||||
''' Retreive GSM Module info
|
||||
@@ -208,7 +250,7 @@ def info_gsm_com(serObj=None, config={}, logger=None):
|
||||
serial object
|
||||
|
||||
:param config:
|
||||
config object
|
||||
dictionary config object from JSON database
|
||||
|
||||
:param log:
|
||||
logger object
|
||||
@@ -322,7 +364,6 @@ def listener(sock, logger):
|
||||
while not FLAG_TH_CLOSE:
|
||||
# Wait for a connection
|
||||
try:
|
||||
logger.debug("Attente de connexion")
|
||||
clientsocket, address = sock.accept()
|
||||
flag = True
|
||||
logger.debug("Client connecté {}".format(clientsocket))
|
||||
@@ -443,7 +484,7 @@ def cron_verify_hours(op=None, config=None, logger=None):
|
||||
GSM_MODULE_STATE = False
|
||||
GSM_MODULE_INIT_STATE = False
|
||||
|
||||
def process(buf="", config=None, ser=None, logger=None):
|
||||
def process(buf="", config={}, ser=None, logger=None):
|
||||
''' run process
|
||||
'''
|
||||
if not isinstance(logger, log.Logger):
|
||||
@@ -458,29 +499,43 @@ def process(buf="", config=None, ser=None, logger=None):
|
||||
logger.error("error parameter, expecting serial.serialposix.Serial, get {}".format(type(ser)))
|
||||
return False
|
||||
|
||||
# receive phone call
|
||||
if buf.startswith('+CLIP: '):
|
||||
# Verify caller phone number
|
||||
ret, phone_number = verify_caller(buf=buf, num=config['NUM_AUTORISE'], logger=logger)
|
||||
if not ret:
|
||||
# Disconnect connexion
|
||||
# Hang up
|
||||
ret, _ = send_at_cmd(cmd="ATH", timeout=0.0, serObj=ser, logger=logger)
|
||||
logger.warning("Phone number not authorized : {}".format(phone_number))
|
||||
logger.warning("Phone number not authorized ({}) - Hang up ...".format(phone_number))
|
||||
else:
|
||||
logger.debug("Phone number authorized ...")
|
||||
time.sleep(0.3)
|
||||
# connect
|
||||
# Pick up
|
||||
ret, _ = send_at_cmd(cmd='ATA', timeout=0.0, serObj=ser, logger=logger)
|
||||
if ret == 0:
|
||||
logger.info('Pick up the call ...')
|
||||
time.sleep(0.2)
|
||||
# send DMTF tone
|
||||
send_at_cmd(cmd='AT+VTS='+config['DTMF_CODE'], timeout=0.0, serObj=ser, logger=logger)
|
||||
time.sleep(config['TONE_DURATION'])
|
||||
# Disconnect
|
||||
# Waiting DTMF tone duration (1/10 sec) + 2 seconds
|
||||
time.sleep(float(config['DTMF_DURATION']/10) + 2)
|
||||
# Hang up
|
||||
ret, _ = send_at_cmd(cmd='ATH', timeout=0.0, serObj=ser, logger=logger)
|
||||
if ret > 0:
|
||||
logger.error('Cannot disconnect ...')
|
||||
logger.error('Cannot hang up ...')
|
||||
else:
|
||||
logger.error("Erreur de connexion avec le correspondant")
|
||||
elif buf.startswith('+CMTI: '): # receive msg
|
||||
msg_num = buf.split('+CMTI: ')[1].split(',')[1]
|
||||
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))
|
||||
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)
|
||||
|
||||
return True
|
||||
|
||||
###################################################################
|
||||
@@ -499,10 +554,14 @@ def main():
|
||||
logger = log.getLogger("Intercom")
|
||||
logger.setLevel(log.DEBUG)
|
||||
fl = log.StreamHandler()
|
||||
hl = log.FileHandler(os.path.join('/var/log/KineIntercom','Intercom.log'))
|
||||
fl.setLevel(log.DEBUG)
|
||||
hl.setLevel(log.INFO)
|
||||
formatter = log.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
fl.setFormatter(formatter)
|
||||
hl.setFormatter(formatter)
|
||||
logger.addHandler(fl)
|
||||
logger.addHandler(hl)
|
||||
|
||||
global GSM_MODULE_STATE
|
||||
global GSM_MODULE_INIT_STATE
|
||||
@@ -638,10 +697,14 @@ def main():
|
||||
out = ''
|
||||
try:
|
||||
while True:
|
||||
# Drapeau de mise à jour de la configuration, par le configurateur via le serveur (socket)
|
||||
if FLAG_CONF_UPDATE:
|
||||
logger.info("Configuration must be reloaded ...")
|
||||
# reload conf in memory
|
||||
config = get_conf(logger)
|
||||
# update GSM parameters with new parameters
|
||||
if not update_gsm_com(serObj=ser, config=config, logger=logger):
|
||||
logger.warning('Impossible de mettre à jour les paramètres GSM')
|
||||
if FLAG_HORAIRE_UPDATE:
|
||||
logger.info("Restart scheduler ...")
|
||||
# Stop job scheduler to restart it
|
||||
|
||||
Reference in New Issue
Block a user