def reset_gsm(delay=45): print(">> Resetting GSM Module") mc = common.get_mc_server() mc.set('rst_gsm_done', False) #SIM800L try: raise CustomGSMResetException reply = gsmcmd('AT+CPOWD=1') print(">> Waiting GSM Reboot") print(delay) time.sleep(delay) except CustomGSMResetException: print(">> Hard Reset Initialized") sconf = common.get_config_handle() reset_pin = sconf['gsmio']['resetpin'] GPIO.setmode(GPIO.BOARD) GPIO.setup(reset_pin, GPIO.OUT) GPIO.output(reset_pin, False) time.sleep(0.2) GPIO.output(reset_pin, True) print(delay) time.sleep(delay) mc.set('rst_gsm_done', True) return
def write_sms_to_outbox(sms_msg, pb_id=None, send_status=0): query = ("INSERT INTO smsoutbox (ts_written,pb_id,sms_msg," "send_status) VALUES ") tsw = dt.today().strftime("%Y-%m-%d %H:%M:%S") mc = common.get_mc_server() inv_pb_names = mc.get('phonebook_inv') # default send to server if sim_num is empty if not pb_id: #mc = common.get_mc_server() s_conf = common.get_config_handle() #pb_names = mc.get('pb_names') #sendto = s_conf['serverinfo']['sendto'] #inv_pb_names = {v: k for k, v in pb_names.items()} #print inv_pb_names #pb_id = inv_pb_names[sendto] pb_id = s_conf['serverinfo']['simnum'] pb_id = inv_pb_names[str(pb_id)] query += "('%s','%s','%s','%s')" % (tsw, pb_id, sms_msg, send_status) print(query) commit_to_db(query, "WriteOutboxMessageToDb")
def init_gsm(delay=45): print('Connecting to GSM modem') mc = common.get_mc_server() mc.set('init_gsm_done', False) gsm = init_gsm_serial() reset_gsm(delay) print("Initializing ...") gsm.write(('AT\r\n').encode()) time.sleep(0.5) gsm.write(('AT\r\n').encode()) time.sleep(0.5) print('Switching to no-echo mode', gsmcmd('ATE0').strip('\r\n')) print('Switching to text mode', gsmcmd('AT+CMGF=1').rstrip('\r\n')) try: sconf = common.get_config_handle() simnetconfig = 'AT+COPS=1,1,"{}"'.format(sconf['coordinfo']['simnet']) print('Connecting manually to network', gsmcmd(simnetconfig).rstrip('\r\n')) except: print(">> Error connecting to sim network") mc.set('init_gsm_done', True) gsm.close()
def main(): parser = argparse.ArgumentParser(description="Health routine [-options]") parser.add_argument("-r", "--read_only", help="do not save data to memory", action='store_true') try: args = parser.parse_args() except IndexError: print '>> Error in parsing arguments' error = parser.format_help() print error sys.exit() mc = common.get_mc_server() ts = dt.today() ts_str = ts.strftime("%x,%X,") try: if mc.get('rst_gsm_done') * mc.get('init_gsm_done'): gsmio.check_csq() csq = int(mc.get("csq_val")) csq = str(csq) else: print ">> GSM is busy" csq = "98" except: print ">> Error reading GSM CSQ. Setting CSQ to error value" csq = "98" cfg = mc.get("server_config") try: mmpertip = float(cfg['rain']['mmpertip']) except: os.system('sudo shutdown -r +1') sys.exit() rainval = "%0.2f" % (rd.check_rain_value(reset_rain=True) * mmpertip) sysvol = "%0.2f" % (pmon.read()["bus_voltage"]) temp = os.popen("vcgencmd measure_temp").readline() tempval = temp.replace("temp=", "").replace("'C\n", "") print "Temperature: {0}".format(tempval) msgtosend = cfg["coordinfo"]["name"] + "W," + ts_str msgtosend += "0,000," + tempval + "," + rainval + "," msgtosend += sysvol + "," msgtosend += csq if not args.read_only: print ">> Saving to memory:" time.sleep(5) print msgtosend common.save_sms_to_memory(msgtosend)
def check_csq(): csq_reply = gsmcmd('AT+CSQ') mc = common.get_mc_server() print csq_reply try: csq_val = int(re.search("(?<=: )\d{1,2}(?=,)",csq_reply).group(0)) mc.set("csq_val",csq_val) return csq_val except (ValueError, AttributeError): return 0 except TypeError: return 0
def ring_isr(channel): print(dt.now()) time.sleep(1) mc = common.get_mc_server() if mc.get('rst_gsm_done') * mc.get('init_gsm_done'): # check if RI from call if GPIO.input(channel) == 0: print(">> Dropping call...", end=' ') gsmio.gsmcmd("ATH") print('done') else: #common.save_smsinbox_to_memory() #print("spawning process ...", end=' ') # common.spawn_process("sudo python /home/pi/gateway/command.py > /home/pi/gateway/command_out.txt 2>&1") #common.spawn_process("python /home/pi/gateway/command.py") print("done") else: print(">> GSM reset ongoing...")
def init_gsm(): print 'Connecting to GSM modem' mc = common.get_mc_server() mc.set('init_gsm_done',False) gsm = init_gsm_serial() reset_gsm() print "Initializing ..." gsm.write('AT\r\n') time.sleep(0.5) gsm.write('AT\r\n') time.sleep(0.5) print 'Switching to no-echo mode', gsmcmd('ATE0').strip('\r\n') print 'Switching to text mode', gsmcmd('AT+CMGF=1').rstrip('\r\n') mc.set('init_gsm_done',True) gsm.close()
def get_phonebook_numbers(): print('>> Getting phonebook entries') query = 'select * from phonebook' pb_items = query_database(query) pb_numbers = {} pb_names = {} for item in pb_items: print(item) pb_id, name, sim_num = item pb_numbers[pb_id] = sim_num pb_names[pb_id] = name print(pb_numbers) print(pb_names) mc = common.get_mc_server() mc.set('pb_numbers', pb_numbers) mc.set('pb_names', pb_names)
def reset_gsm(): print ">> Resetting GSM Module" mc = common.get_mc_server() mc.set('rst_gsm_done',False) #SIM800L sconf = common.get_config_handle() reset_pin = sconf['gsmio']['resetpin'] GPIO.setmode(GPIO.BOARD) GPIO.setup(reset_pin, GPIO.OUT) GPIO.output(reset_pin, False) time.sleep(0.5) GPIO.output(reset_pin, True) time.sleep(45) mc.set('rst_gsm_done',True) return
def send_unsent_msg_outbox(): mc = common.get_mc_server() if mc.get("sms_in_db"): print ">> Messages in db" else: print ">> No message in db. Aborting" return all_sms = dbio.get_db_outbox() try: for sms in all_sms: sms_id = sms.sid stat = gsmio.send_msg(sms.msg, sms.simnum) if stat == 0: print "Updating send status in database..." dbio.update_smsoutbox_send_status(sms_id) print "Done updating send status in database" except TypeError: print '>> Aborting' mc.set("sms_in_db", False)
# from gsmSerialio import * import configparser, os, sys, subprocess from datetime import datetime as dt from crontab import CronTab import gsmio import common import processcontrol as pctrl import dbio import subprocess mc = common.get_mc_server() sconf = common.get_config_handle() def gateway_initialize(): common.main() def change_server_number(row): cfg = common.read_cfg_file() args = row['msg'].split() try: number = args[2] except IndexError: reply = "Insufficient arguments." common.save_sms_to_memory(reply, row['contact_id']) return print("Changing server num")
def send_msg(msg, number): """ Sends a command 'cmd' to GSM Module Returns the reply of the module Usage: str = gsmcmd() """ # under development # return check_count = 0 csq = 0 print '>> Check csq ...' while check_count < 10 and csq < 10: csq = check_csq() time.sleep(0.5) check_count += 1 if check_count >= 10: print ">> No connection to network. Aborting ..." return -2 #raise CustomGSMResetException # resolve sim_num from number mc = common.get_mc_server() pb_numbers = mc.get('phonebook') try: if type(number) == int or type(number) == long: number = pb_numbers[number] elif type(str): pass except KeyError: print ">> No record for phonebook id:", number return -1 gsm = init_gsm_serial() try: a = '' now = time.time() preamble = "AT+CMGS=\""+number+"\"" print "\nMSG:", msg print "NUM:", number gsm.write(preamble+"\r") now = time.time() while a.find('>')<0 and a.find("ERROR")<0 and time.time()<now+20: a += gsm.read(gsm.inWaiting()) time.sleep(0.5) print '.', if time.time()>now+20 or a.find("ERROR") > -1: print '>> Error: GSM Unresponsive at finding >' print a return -2 else: print '>' a = '' now = time.time() gsm.write(msg+chr(26)) while a.find('OK')<0 and a.find("ERROR")<0 and time.time()<now+60: a += gsm.read(gsm.inWaiting()) time.sleep(0.5) print ':', if time.time()-60>now: print '>> Error: timeout reached' return -1 elif a.find('ERROR')>-1: print '>> Error: GSM reported ERROR in SMS sending' network_stat = check_network() if network_stat == 0: # no network connection (AT+COPS?) return -2 #raise CustomGSMResetException return -1 else: print ">> Message sent!" return 0 except serial.SerialException: print "NO SERIAL COMMUNICATION (sendmsg)" finally: gsm.close()
def send_smsoutbox_memory(): # lockscript.get_lock('gsm') print "Sending from memory ..." mc = common.get_mc_server() sc = mc.get('server_config') smsoutbox = mc.get("smsoutbox") # print smsoutbox phonebook = mc.get("phonebook") resend_limit = sc['gsmio']['sendretry'] smsoutbox_unsent = smsoutbox[smsoutbox["stat"] < resend_limit] print smsoutbox_unsent for index, row in smsoutbox_unsent.iterrows(): sms_msg = row['msg'] sim_num = phonebook[row["contact_id"]] if len(sms_msg) > 160: smsoutbox.loc[index, 'stat'] = 99 print "Abort sending", sms_msg continue stat = gsmio.send_msg(sms_msg, sim_num) if stat == 0: smsoutbox.loc[index, 'stat'] = resend_limit print '>> Message sent' else: print '>> Message sending failed' print '>> Writing to mysql for sending later' smsoutbox.loc[index, 'stat'] += 1 if smsoutbox.loc[index, 'stat'] >= resend_limit: dbio.write_sms_to_outbox(sms_msg, sim_num) mc.set("sms_in_db", True) if stat == -2: print '>> Updating smsoutbox before GSM reset' smsoutbox_updated = mc.get("smsoutbox") ts_latest = smsoutbox.ts.max() smsoutbox_new_inserts = smsoutbox_updated[ smsoutbox_updated.ts > ts_latest] smsoutbox = smsoutbox.append(smsoutbox_new_inserts, ignore_index=True) mc.set("smsoutbox", smsoutbox) print '>> Done updating smsoutbox' raise gsmio.CustomGSMResetException print smsoutbox # get smsoutbox for new messages inserted while sending smsoutbox_updated = mc.get("smsoutbox") # get all items later than the latest ts of smsoutbox ts_latest = smsoutbox.ts.max() smsoutbox_new_inserts = smsoutbox_updated[smsoutbox_updated.ts > ts_latest] # append new items in existing smsoutbox smsoutbox = smsoutbox.append(smsoutbox_new_inserts, ignore_index=True) mc.set("smsoutbox", smsoutbox)