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

13

有没有人可以帮我使用Python中的AT命令发送和接收短信?

如果有影响的话,我正在使用Fedora 8。

在Linux下哪个手机更好(诺基亚、索尼爱立信、三星等)? 所有手机是否都支持使用AT命令发送和接收短信?

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

你需要完成两个额外的任务:
  • 以适当的格式编码消息(主要使用GSM 03.38,在unicode.org上有一个方便的翻译表)。如果您真的只关心ASCII之外的任何字符,您可以检查每个字符是否在string.printable中。

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

您可以使用phone.readall()检查错误,但最好在将消息发送到手机之前确保您的消息正确。还请注意,休眠似乎是必要的。

大多数手机都会理解这一点。为了让我的旧诺基亚C5打开串行连接,我不得不从插入USB电缆时弹出的菜单中选择“PC Suite”。这在蓝牙上同样有效。

该代码使用PySerial软件包,在python 2和3上都可用。

另请参见:


7
不,不,不!请不要以这种方式处理AT指令。在发送下一个命令之前,必须等待最终结果代码(例如OK,ERROR,...)。特别是对于AT+CMGS,你必须等待调制解调器发送“\ n \ r>”才能开始发送MyMessage。有关更多详细信息,请参见此答案,https://dev59.com/2nDXa4cB1Zd3GeqP7wpm#15591673。 - hlovdal
睡觉并不能代替阅读和解析响应。这就像踢挡路的狗来让它们移动一样有用。是的,有时候这可能会起作用,但在某些时候你会为采取这种方法而感到遗憾。 - hlovdal

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

3

与手机通信很容易。您只需要打开相应的/dev/ttyACM*设备并与其通信即可。但选择正确的手机就有些棘手了。任何支持“网络共享”和完整短信AT命令集的手机都可以使用。


2
我建议用条件循环等待来替换time.sleep,直到从调制解调器收到“OK”响应才继续下一个状态。

我正在使用USB连接我的安卓手机,但无法在“端口”下找到它,而是在“便携式设备”下。因此我无法测试短信功能。请问如何启用COM端口? - Ds Arjun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接