python - 在python中解析GSM调制解调器接收到的消息参数

标签 python regex parsing gsm at-command

我正在尝试用 python 解析从 GSM 调制解调器收到的消息。

我有很多消息需要解析。我每隔几个小时左右就会收到新消息。

这是我通过使用串行对象到列表 x 中从调制解调器读取数据后收到的数据示例。

AT+CMGL="ALL"


+CMGL: 1,"REC READ","+918884100421","","13/04/05,08:24:36+22"
here's message one 

+CMGL: 2,"REC READ","+918884100421","","13/04/05,09:40:38+22"
here's message two

+CMGL: 3,"REC READ","+918884100421","","13/04/05,09:41:04+22"
here's message three

+CMGL: 4,"REC READ","+918884100421","","13/04/05,10:04:18+22"
here's message four

+CMGL: 5,"REC READ","+918884100421","","13/04/05,10:04:32+22"
here's message five

.
.
.
.
.

还有很多消息,我在这里只列出了五条。

我的主要目的是提取消息的内容,例如我收到的每条消息的“这是消息一”等等。

这是我现在正在使用的代码。

def reading():
     print "Reading all the messages stored on SIM card"
     phone.write(b'AT+CMGL="ALL"\r')
     sleeps()
     x=phone.read(10000)
     sleeps()
     print x
     print "Now parsing the message!"
     k="".join(x)
     parse(k)
     k=""
def parse(k):
    m = re.search("\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\r\n(.+)\r\n",k)
    print "6="
    print m.group(6)

Phone 是我用来从 GSM 调制解调器读取数据的串行对象。

这里 m.group(6) 捕获第一条消息“here's message one”的消息内容

如何让它匹配所有消息的内容,而不仅仅是第一条消息。

我尝试设置多行标志,但没有成功。使用 re.findall() 代替 re.search() 也没有效果。

此外,re.search 返回的匹配对象不可迭代。

请帮忙。

最佳答案

为此使用正则表达式并不是一个非常可靠的解决方案,因为它无法处理不同手机行为的变化。在您的示例中,响应的格式是

+CMGL: 1,"REC READ","+918884100421","","13/04/05,08:24:36+22"

但其他手机会给出类似的响应

+CMGL: 1,"REC READ","+31612123738",,"08/12/22,11:37:52+04"

请注意第四个参数 "" 的差异与什么都没有。 查看27.005 ,文本模式下响应的语法为

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

<alpha>确实是可选的。是的,可能可以编写一个考虑到这一点的正则表达式,但随后您会陷入two problems land .


我建议您做的是切换到对响应进行正确的解析,即:从第一个字符开始,并根据预期的参数格式(和存在)分块前进。请参阅this answer一种快速而肮脏的方法来提取电话号码。它不如我在下面描述的算法那么强大(例如 comma + 2 假设太多)。

解析响应的绝对正确算法是:

匹配行开头的前缀(例如 +CMGL: )。然后开始解析区分以下标记:

  • 空白 ' ''\t'
  • 逗号','
  • 双引号 '"'
  • 回车 '\r'
  • 换行 '\n'
  • 任何非空白、非逗号、非双引号、非 cr、非 lf 字符

对于每个参数,首先忽略任何前导空格。 如果得到逗号,则该参数不存在,则继续解析下一个参数。 如果得到回车,则下一个字符应该换行并且到达行尾。如果获得非空白非...字符,则这是数字参数的开始。收集此参数后面的所有非空白非...字符。在此之后,唯一的合法字符应该是零个或多个空格,后跟逗号或回车符。 如果获取双引号字符前进到下一个双引号字符,即字符串的末尾(这是安全且正确的,因为即使字符串应包含双引号字符,它们也会被转义,但不会作为 \" )。在此之后,唯一的合法字符应该是零个或多个空格,后跟逗号或回车符。

上面的内容一开始可能看起来有点让人不知所措,但是当你开始处理它时,它实际上并没有那么复杂。

关于python - 在python中解析GSM调制解调器接收到的消息参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15848770/

相关文章:

java - 检测并返回 Java 字符串中的字符

parsing - Vb6:分隔制表符分隔的文本

c - 在 C 中使用 sscanf 从文件中读取多行字符串

python - 如何将嵌套字典呈现为表格

python - 使用 Python API 库在 Google AppEngine 上 strip 化支付

python - 如何在Python中的正则表达式中使用字典?

php 理解贪婪与非贪婪匹配

perl - Marpa 可以用来加速 Perl 解释器的解析吗?

python - 从 Python 2 到 Python 3 的困惑过渡 : Why support both?

python - 无法安装dlib,永远卡在98%