【问题标题】:Writing message parameters read from a GSM modem into MySQL using Python使用 Python 将从 GSM 调制解调器读取的消息参数写入 MySQL
【发布时间】:2013-04-16 00:58:48
【问题描述】:

我正在从 Python 中的 GSM 调制解调器收到的消息中读取一些数据。

我需要先提取这些数据参数,然后再将它们写入我的 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,数据就不会写入数据库。当我尝试在没有其他代码的情况下使用一些虚拟值单独执行此操作时,没有问题。所以不是数据库连接问题。

我做错了什么?

请帮忙。

【问题讨论】:

  • 你怎么知道break_down得到了正确的数据?如果您在插入之前打印 res 和 results 数组,您会看到数据吗?您可以尝试打印的相同值而不是使用虚拟值吗?
  • 是的,这就是我尝试时的意思。它不工作。
  • 真正运行时是否看到“in dbinsert”?

标签: python mysql database gsm at-command


【解决方案1】:

你的正则表达式解析

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

似乎太弱了,无法正确涵盖所有可能的情况。从27.005,文本模式下的AT+CMGL语法是(对于SMS-SUBMIT/SMS-DELIVER,它们是普通的短信):

+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>[...]]

您的正则表达式期望在第一个数字参数之后总是至少有三个字符串参数,但请注意整个 &lt;alpha&gt; 参数是可选的,可能不存在。

我不确定这是否是您的全部问题,但无论如何您都应该解决这个问题。如果是我,我会为此放弃正则表达式,而是将行参数解析为特定函数中的参数。

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多