13

PythonでATコマンドを使用してSMSを送受信するのを手伝ってくれる人はいますか?

重要な場合は、Fedora8を使用しています。

Linux(Nokia、Sony Ericson、Samsung、.....)でどちらの電話が優れているでしょうか?すべての電話はATコマンドを使用したSMSの送受信をサポートしますか?

4

4 に答える 4

10

(Python 3000で)始めるためのサンプルコードを次に示します。

import time
import serial

recipient = "+1234567890"
message = "Hello, World!"

phone = serial.Serial("/dev/ttyACM0",  460800, timeout=5)
try:
    time.sleep(0.5)
    phone.write(b'ATZ\r')
    time.sleep(0.5)
    phone.write(b'AT+CMGF=1\r')
    time.sleep(0.5)
    phone.write(b'AT+CMGS="' + recipient.encode() + b'"\r')
    time.sleep(0.5)
    phone.write(message.encode() + b"\r")
    time.sleep(0.5)
    phone.write(bytes([26]))
    time.sleep(0.5)
finally:
    phone.close()

さらに2つのことを行う必要があります。

  • メッセージを適切な形式でエンコードします(ほとんどの場合、 GSM 03.38、unicode.orgに便利な翻訳テーブルがあります)。ASCII以外の文字を本当に気にしない場合は、すべての文字がに​​含まれているかどうかを確認できますstring.printable

  • メッセージの長さを確認してください(エンコーディングに関係するかどうかはわかりませんが、140文字の場合もあれば、160文字の場合もあります)。

phone.readall()エラーをチェックするために使用できますが、メッセージを電話に送信する前に、メッセージに問題がないことを確認することをお勧めします。睡眠が必要と思われることにも注意してください。

ほとんどの電話はこれを理解します。古いNokiaC5でシリアル接続を開くには、USBケーブルを挿入したときにポップアップするメニューから[PCSuite]を選択する必要がありました。これはBluetoothでも同様に機能するはずです。

このコードは、 Python2および3で使用可能なPySerialパッケージを使用しています。

参照:

于 2011-07-28T16:58:15.313 に答える
6

Atコマンドを使用してSMSを送信することを確認するには、これが役立ちます。

    import serial
    import time

    class TextMessage:
        def __init__(self, recipient="+2348065777685", message="TextMessage.content not set."):
            self.recipient = recipient
            self.content = message

        def setRecipient(self, number):
            self.recipient = number

        def setContent(self, message):
            self.content = message

        def connectPhone(self):
            self.ser = serial.Serial('COM70', 460800, timeout=5, xonxoff = False, rtscts = False, bytesize = serial.EIGHTBITS, parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE)
            time.sleep(1)

        def sendMessage(self):
            self.ser.write('ATZ\r')
            time.sleep(1)
            self.ser.write('AT+CMGF=1\r')
            time.sleep(1)
            self.ser.write('''AT+CMGS="''' + self.recipient + '''"\r''')
            time.sleep(1)
            self.ser.write(self.content + "\r")
            time.sleep(1)
            self.ser.write(chr(26))
            time.sleep(1)

        def disconnectPhone(self):
            self.ser.close()

    sms = TextMessage("+2348063796720","Mummy i sent this message from my computer")
    sms.connectPhone()
    sms.sendMessage()
    sms.disconnectPhone()
    print "message sent successfully"

Atコマンドを使用してSMSを受信するには、これが役立つはずです

    import serial
    import time
    import sys


    class HuaweiModem(object):

        def __init__(self):
            self.open()

        def open(self):
            self.ser = serial.Serial('COM70', 406800, timeout=5)
            self.SendCommand('ATZ\r')
            self.SendCommand('AT+CMGF=1\r')


        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="REC UNREAD"\r\n'#gets incoming sms that has not been read
            print self.SendCommand(command,getline=True)
            data = self.ser.readall()
            print data


    h = HuaweiModem()
    h.GetAllSMS()
于 2013-10-21T15:18:22.723 に答える
2

電話で話すのは簡単です。適切な/dev/ttyACM*デバイスを開いて、それに話しかけるだけです。どの電話が難しいか。「テザリング」とSMSメッセージ用の完全なATコマンドセットをサポートする電話であれば問題ありません。

于 2010-01-29T10:31:41.260 に答える
1

time.sleep次の状態を続行する前に、モデム「OK」からの応答を待機している条件ループを置き換えることをお勧めします。

于 2018-01-31T13:16:26.587 に答える