gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:56:19 24 4
gpt4 key购买 nike

我正在尝试用 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"

注意第四个参数的不同,""与什么都没有。 checkout 27.005 , 文本模式响应的语法是

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

<alpha>确实是可选的。是的,编写一个考虑到这一点的正则表达式可能是可能的,但是你会有点徘徊在 two problems land 中。 .


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

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

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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com