如何使用AT命令发送/接收短信?

13 投票
4 回答
62742 浏览
提问于 2025-04-15 18:38

有没有人能帮我用Python通过AT命令发送和接收短信?

顺便说一下,我现在用的是Fedora 8系统。

哪种手机在Linux系统上表现更好呢(比如诺基亚、索尼爱立信、三星等等)?所有手机都能通过AT命令发送和接收短信吗?

4 个回答

3

和手机对话很简单。你只需要打开合适的 /dev/ttyACM* 设备,然后就可以和它交流了。不过,选择手机就有点复杂了。任何支持“共享网络”(tethering)功能,并且能够使用完整的AT指令集来发送短信的手机都应该没问题。

8

想要通过AT命令发送短信,这段内容会对你有帮助。

    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命令接收短信,这段内容也会对你有帮助。

    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()
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()

你还需要做两件额外的事情:

  • 把信息编码成合适的格式(主要是GSM 03.38,在unicode.org上有一个方便的翻译表)。如果你只关心ASCII字符,可以检查每个字符是否在string.printable中。

  • 检查信息的长度(我不确定这是否与编码有关,但有时是140个字符,有时是160个字符)。

你可以使用phone.readall()来检查错误,但最好在发送信息到手机之前确保信息是正确的。注意,代码中的暂停似乎是必要的。

大多数手机都能理解这个。为了让我的老款诺基亚C5打开串口连接,我需要在插入USB线后,从弹出的菜单中选择“PC Suite”。通过蓝牙连接也应该同样有效。

这段代码使用了PySerial这个库,适用于Python 2和3。

另请参见:

撰写回答