Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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")
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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
Ejemplo n.º 6
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...")
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
# 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")
Ejemplo n.º 12
0
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()
Ejemplo n.º 13
0
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)