2017-08-28 21 views
1

私のPythonコードがうまく動作するのにいくつかの問題があります。私はSIM900モジュールを取り付けたRpi2を持っています。私は電話をかけたり、電話を受けたり、SMSを送っても、SMSを受け取ったりすることができます。しかし、すべてをまとめることは私に頭痛を与えている。私は何度もgoogleをスクロールしていますが、今でも結果はすべて同じであることがわかりますので、私はさらに0点になっています。SMSを受信し、SIM900でATコマンドを使用して電話をかける

私のアジェンダは、SimModuleにSMSを送信することです。これまでのところそのSMSの

例私が得た

RV -> make call to cell no: 49 
RI -> make call to cell no: 48 
MV -> make call to cell no: 47 
MI -> make call to cell no: 46 

:SMSが承認されたリストから電話番号から到着すると、それが特定の番号に電話をかけるだろう特定のコードが含まれているかどうPythonは、着信のSMSのを読んでいました私は

AT+CMGL="ALL" 
AT+CMGL="ALL" 
+CMGL: 1,"REC READ","+30000000000","","17/08/27,23:28:51+08" 
RV 
+CMGL: 2,"REC READ","+30000000000","","17/08/28,00:34:12+08" 
RI 
OK 
(下記参照)私はSMSを読むことができ

import serial 
import time 
import sys 


class sim900(object): 

    def __init__(self): 
     self.open() 

    def open(self): 
     self.ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=5) 

    def SendCommand(self,command, getline=True): 
     self.ser.write(command) 
     data = '' 
     if getline: 
      data=self.ReadLine() 
     return data 

    def ReadLine(self): 
     data = self.ser.readline() 
#  print data 
     return data 

    def GetAllSMS(self): 
     self.ser.flushInput() 
     self.ser.flushOutput() 

     command = 'AT+CMGL=\"ALL\"\r'#gets incoming sms that has not been read 
     print self.SendCommand(command,getline=True) 
     data = self.ser.readall() 
     print data 
     self.ser.close() 

    def Call49(self): 
     self.ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=5) 
     self.ser.write('ATD49;\r') 
     time.sleep(1) 
     time.sleep(1) 
     self.ser.write(chr(26)) 
      # responce = ser.read(50) 
     self.ser.close() 
     print "calling" 

    def Call48(self): 
     self.ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=5) 
     self.ser.write('ATD48;\r') 
     time.sleep(1) 
     self.ser.write(chr(26)) 
      # responce = ser.read(50) 
     self.ser.close() 
     print "calling" 

h = sim900() 
h.GetAllSMS() 

次のコードを使用してSMSを読むことができます

SMSの「def GetAllSMS」の電話番号+30000000000が「def Call48」を実行するテキストRVと一緒に存在する場合、どのように機能を追加することができますか?「def Call47」を実行するRIの場合

助けに感謝します。 Tnxを事前に入力してください。

答えて

1

モデム応答を適切に解析するのは難しい場合があります(たとえば、this answerを参照)。あなたがメッセージ機能と音声通話とUSSDリクエストを使うつもりならば、おそらくpython-gsmmodem libraryを作り直すでしょう:)しかし、SMS応答を解析するあなたの特殊なケースでは、このコードを使うことができます(上記のpython-gsmmodemから適応されています) 。

import re 

def GetAllSMS(self): 

    self.ser.flushInput() 
    self.ser.flushOutput() 

    result = self.SendCommand('AT+CMGL="ALL"\r\n') 
    msg_lines = [] 
    msg_index = msg_status = number = msg_time = None 

    cmgl_re = re.compile('^\+CMGL: (\d+),"([^"]+)","([^"]+)",[^,]*,"([^"]+)"$') 

    # list of (number, time, text) 
    messages = [] 

    for line in result: 
     cmgl_match = cmgl_re.match(line) 
     if cmgl_match: 
      # New message; save old one if applicable 
      if msg_index != None and len(msg_lines) > 0: 
       msg_text = '\n'.join(msg_lines) 
       msg_lines = [] 
       messages.append((number, msg_time, msg_text)) 
      msg_index, msg_status, number, msg_time = cmgl_match.groups() 
      msg_lines = [] 
     else: 
      if line != 'OK': 
       msg_lines.append(line) 

    if msg_index != None and len(msg_lines) > 0: 
     msg_text = '\n'.join(msg_lines) 
     msg_lines = [] 
     messages.append((number, msg_time, msg_text)) 

    return messages 

この機能は、すべてのSMSを読んで、タプルのリストとしてそれらを返します:[("+30000000000", "17/08/28,00:34:12+08", "RI"), ("+30000000000", "17/08/28,00:34:12+08", "RV") ...番号が有効であるかどうかをチェックし、必要な行動を取るために、そのリストの上に反復処理:私は見

for number, date, command in messages: 
    if number != "+30000000000": 
     continue 
    if command == 'RI': 
     self.call_1() 
    elif command == 'RV': 
     self.call_2() 
+0

HI私は多分私の質問を正しく言い直さなかったかもしれません。 + CMGL:2、 "REC READ"、 "+ 30000000000"、 ""、 "17/08/28,00:34:12 + 08"を読み取る必要があります RI SMSには+30000000000が含まれ、RIのpythonはATD0000001の電話番号に電話をかけます。 SMSに+30000000000が含まれていて、RV pythonがATD0000002の電話番号に電話をかける場合。 など。 SMSのRI、RV、MI、MV、電話番号+30000000000の基準が満たされていない場合は、何もしないでください。 – user3343073

+0

混乱のために申し訳ありませんが、SMSの文字列を探し出す代わりに間違った場所に着手しました。 – user3343073

+0

うん、あなたは、その機能を使ってメッセージリストを取得し、あなたがそれらと一緒にしたい何でもするでしょう。わかりやすくするために、ユースケースの回答を更新しました。 – 9dogs

関連する問題