0

昨年、Quectel ec25 とラズベリー pi を使用して 4g ホットスポットを作成しましたが、この目的には問題なく動作しました。今年の初めに、特定のシステムのステータス更新を含むテキスト メッセージに自動的に返信する機能を拡張したいと考えていました。ATコマンドを使用してテキストメッセージを送受信することは問題なく理解できましたが、Pythonがキーワードを含むテキストメッセージを認識して応答するのに問題があります。このコード http://www.python-exemplary.com/index_en.php?inhalt_links=navigation_en.inc.php&inhalt_mitte=raspi/en/gsm.inc.phpを見つけ、EC25で動作するように少し変更しましたUSBシリアル。

私は一度に 2 つの SSH セッションを行っています。1 つはコマンドラインアップで、もう 1 つはシリアルを監視するための minicom セッションです。EC25 はメッセージを受信して​​いることを Pi に送信しています。メッセージを受信したときの出力は "+CMTI: "ME",0" ですが、pi には応答がありません。コードはこの部分で応答していないようです。「着信 SMS をリッスンしています...」と表示されますが、テキスト メッセージを受信した場合でも、それを超えることはありません。

reply = ser.read(ser.inWaiting())# Clean buf
print "Listening for incoming SMS..."
while True:
    reply = ser.read(ser.inWaiting())
    if reply != "":

ser.read() と ser.inWaiting() だけで試してみましたが、それは悪いフィードバックループに送られます。

これが私のコードです。

# SIMSMS1.py

# pip install pyserial 

import RPi.GPIO as GPIO
import serial
import time, sys
import datetime

P_BUTTON = 24 # Button, adapt to your wiring

def setup():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(P_BUTTON, GPIO.IN, GPIO.PUD_UP)

SERIAL_PORT = "/dev/ttyUSB3"  # Raspberry Pi 3 

ser = serial.Serial(SERIAL_PORT, baudrate = 115200, timeout = 5)
setup()
ser.write("AT+CMGF=1\r") # set to text mode
time.sleep(1)
ser.write('AT+QURCCFG="urcport","usbmodem"\r') #set URC Indication 
time.sleep(1)
ser.write('AT+CPMS="ME","ME","ME"\r') #set memory to Mobile equipment message storage
time.sleep(1)
ser.write('AT+CMGD=1,4\r') # delete all SMS
time.sleep(1)
reply = ser.read(ser.inWaiting())# Clean buf
print "Listening for incoming SMS..."
while True:
    reply = ser.read(ser.inWaiting())
    if reply != "":
        ser.write("AT+CMGR=1\r") # read message
        time.sleep(3)
        reply = [ser.read(ser.inWaiting())]
        print "SMS received. Content:"
        print reply
        if "getStatus" in reply:
            t = str(datetime.datetime.now())
            if GPIO.input(P_BUTTON) == GPIO.HIGH:
                state = "Button released"
            else:
                state = "Button pressed"
            ser.write('AT+CMGS="+1xxxxxxxxxx"\r')  #designate phone number
            time.sleep(3)
            msg = "Sending status at " + t + ":--" + state
            print "Sending SMS with status info:" + msg
            ser.write(msg + chr(26))
        time.sleep(3)
        ser.write('AT+CMGD=1,4\r') # delete all messages
        time.sleep(3)
        ser.read(ser.inWaiting()) # Clear buf
    time.sleep(5)    

これはシリアルの出力で、最後の行は受信中のメッセージです

AT+CMGF=1 OK

AT+QURCCFG="urcport","usbmodem" OK

AT+CPMS="私","私","私" +CPMS: 0,255,0,255,0,255

OK AT+CMGD=1,4​​ OK

+CMTI: "私",0

「reply = ser.read(ser.inWaiting())」と関係があることは知っていますが、それを機能させるために何を書くべきかわかりません。前もって感謝します

4

1 に答える 1

0

最も簡単な方法は、受信したメッセージをポーリングすることです。おそらくEC25にはgpioの可能性があります。メッセージが来ると、gpio はパルス信号を生成します。

于 2021-05-16T01:54:06.753 に答える