Записване на параметри на съобщение, прочетени от GSM модем в MySQL с помощта на Python

Чета някои данни в съобщение, което получавам от GSM модем в 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))

Тук има множество съобщения, които се четат. each.group(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, данните не се записват в базата данни. Когато се опитам да направя това изолирано без останалата част от кода с някои фиктивни стойности, няма проблем. Така че това не е проблем с връзката с базата данни.

какво правя грешно

Моля помогнете.


person Anon    schedule 16.04.2013    source източник
comment
Как можете да разберете, че break_down получава точните данни? Ако отпечатате масива res и резултати точно преди да ги вмъкнете, виждате ли данни? Вместо да използвате фиктивни стойности, можете ли да опитате същите стойности, които са отпечатани?   -  person bbayles    schedule 16.04.2013
comment
да, това имах предвид, когато го опитах. Не работи.   -  person Anon    schedule 16.04.2013
comment
Виждате ли в dbinsert, когато го стартирате наистина?   -  person bbayles    schedule 16.04.2013


Отговори (1)


Вашият анализ на регулярен израз

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 за това и вместо това да анализирам параметъра на реда за параметър в конкретна функция.

person hlovdal    schedule 08.05.2013