2013-04-16 3 views
0

Я читаю некоторые данные в сообщении, которое я получаю от GSM-модема в Python.Запись параметров сообщения, считываемых с GSM-модема в MySQL с использованием Python

Мне нужно извлечь эти параметры данных, прежде чем записывать их в базу данных MySQL.

Прежде чем я это сделаю, я проанализирую сообщение за пару этапов, прежде чем я готов написать его в базу данных.

Чтение и запись с GSM-модема осуществляется с использованием телефона с серийным объектом. Этот последовательный объект считывает x, где данные временно сохраняются до следующего чтения/записи.

Вот поток управления в программе:

def reading(): 
    print "Reading all the messages stored on SIM card" 
    phone.write(b'AT+CMGL="ALL"\r') #Command to read all the messages 
    sleeps() 
    x=phone.read(100000000) 
    sleeps() 
    print x 
    print "Now parsing the message!" 
    k="".join(x) 
    parse(k) 
    k="" 


def parse(k): 
    match = re.finditer("\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\n(.+)\n", k) 
    for each in match: 
     break_down(each.group(6)) 

Здесь имеется несколько сообщений, которые считываются. Каждая группа (6) содержит фактическое содержимое сообщения.

def break_down(s): 
    c=s.count('<') 
    if c==9: 
      res = re.findall('< (.*?) >', s) 
      for index in res: 
       print index,item 
    elif c==7 or c==3: 
      temp=parsing(s) 
      pprint(list(temp)) 
    else: 
     flag=0 
     c=s.count(':') 
     if c==8: 
      res=s.split(' : ') 
      res=[item.strip() for item in s.split(':')] 
      for index, item in enumerate(res): 
       print index, item 
      results = [float(x) for x in s.split(' ') if x.count('.') == 1] 
      pprint(results) 
      dbinsert(res[0],res[1],res[2],res[3],results[0],results[1],results[2],results[3],flag) 
     if c==7: 
      flag=1 
      res=s.split(' : ') 
      res=[item.strip() for item in s.split(':')] 
      for index, item in enumerate(res): 
       print index, item 
      results = [float(x) for x in s.split(' ') if x.count('.') == 1] 
      pprint(results) 
      dbinsert(res[0],res[1],res[2],res[3],results[0],results[1],results[2],results[3],flag) 
def parsing(s): 
     for t in s.split('<'): 
      for u in t.strip().split('>',1): 
       if u.strip(): yield u.strip() 


def dbinsert(a,b,c,d,e,f,g,h,flag): 
import MySQLdb 
db = MySQLdb.Connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="ups") 
print "In dbinsert" 
cursor = db.cursor() 
try: 
    if flag==0: 
    sql = """INSERT INTO data(F1, 
      F2, F3, F4, F5, F6, F7, F8) 
      VALUES (a.value,b.value,c.value,d.value,e.value,f.value,g.value,h.value)""" 
    cursor.execute(sql) 
    db.commit() 
    elif flag==1: 
    sql = """INSERT INTO data(F1, 
      F2, F3, F4, F5, F6, F7, F8) 
      VALUES (a,b,c,,e,f,g,h)""" 
    cursor.execute(sql) 
    db.commit() 
except: 
    db.rollback() 
    db.close() 

break_down (s) способен извлекать данные точно по мере необходимости. Однако, как только эти данные передаются в dbinsert, данные не записываются в базу данных. Когда я пытаюсь сделать это изолированно, без остальной части кода с некоторыми фиктивными значениями, проблем нет. Таким образом, это не проблема подключения к базе данных.

Что я делаю неправильно?

Пожалуйста, помогите.

+0

Как вы можете сказать, что break_down получает правильные данные? Если вы печатаете массив res и results прямо перед вставкой, вы видите данные? Вместо использования фиктивных значений вы можете попробовать те же самые значения, которые печатаются? – bbayles

+0

да, вот что я имел в виду, когда я это пробовал. Он не работает. – Anon

+0

Вы видите «в dbinsert», когда вы запускаете его по-настоящему? – bbayles

ответ

0

Ваше регулярное выражение синтаксический

re.finditer("\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\n(.+)\n", k) 

кажется слишком слабым, чтобы быть в состоянии должным образом охватить все возможные случаи. Из 27.005, то AT+CMGL синтаксис в текстовом режиме (для SMS-SUBMIT/SMS-DELIVER которых обычные сообщения SMS):

+CMGL: <index>,<stat>,<oa/da>,[<alpha>],[<scts>][,<tooa/toda>, 
<length>]<CR><LF><data>[<CR><LF> 
+CMGL: <index>,<stat>,<da/oa>,[<alpha>],[<scts>][,<tooa/toda>, 
<length>]<CR><LF><data>[...]] 

Ваше регулярное выражение ожидает, что всегда будет по крайней мере три строковые параметры, следующие за первым но обратите внимание, что весь параметр <alpha> является необязательным и может отсутствовать.

Я не уверен, что это ваша проблема, но это то, что вы должны исправить в любом случае. Если бы это был я, я бы отказался от regexp для этого и вместо этого проанализировал параметр линии для параметра в определенной функции.

 Смежные вопросы

  • Нет связанных вопросов^_^