【问题标题】:How to Send/Receive SMS using AT commands?如何使用 AT 命令发送/接收短信?
【发布时间】:2011-01-10 19:08:33
【问题描述】:

谁能帮我在 Python 中使用 AT 命令发送和接收短信?

以防万一,我使用的是 Fedora 8。

哪款手机更适合 Linux(诺基亚、索尼爱立信、三星……)? 是否所有手机都支持使用 AT 指令收发短信?

【问题讨论】:

    标签: python sms at-command


    【解决方案1】:

    这里有一些示例代码可以帮助您入门(在 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 上有一个方便的 translation table)。如果你真的不关心ASCII以外的任何字符,你可以检查每个字符是否在string.printable中。

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

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

    大多数手机都能理解这一点。为了让我的旧诺基亚 C5 打开串行连接,我必须从插入 USB 电缆时弹出的菜单中选择“PC Suite”。这应该同样适用于蓝牙。

    代码使用PySerial 包,可用于python 2 和3。

    另见:

    【讨论】:

    • 不,不,不!请不要以这种方式处理 AT 命令。在发送下一个命令之前,您必须等待最终结果代码(例如 OK、ERROR、...)。特别是对于 AT+CMGS,您必须等待调制解调器发送“\n\r>”,然后才能开始发送 MyMessage。有关更多详细信息,请参阅此答案,stackoverflow.com/a/15591673/23118
    • 睡眠不能替代阅读和解析响应。它就像踢狗一样有用,以使它们移动。是的,它有时可能确实有效,但在某些时候,您会为采用这种方法而感到抱歉。
    【解决方案2】:

    查看使用 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* 设备并与之交谈。哪款手机比较麻烦。任何支持“网络共享”和 SMS 消息的完整 AT 命令集的手机都可以。

      【讨论】:

        【解决方案4】:

        我建议将 time.sleep 替换为条件循环,等待调制解调器“OK”的响应,然后再继续下一个状态。

        【讨论】:

        • 我正在用 USB 数据线连接我的安卓手机,但在“端口”下找不到它,而是在“便携式设备”下,因为这无法测试 SMS 功能。如何启用 COM 端口?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多