2010-01-29 99 views
8

任何人都可以幫助我在Python中使用AT命令發送和接收SMS嗎?如何使用AT命令發送/接收SMS?

在它的事項的情況下,我使用的Fedora 8

哪款手機會更好使用Linux(諾基亞,索尼埃裏克鬆,三星,......)? 所有手機是否都支持使用AT命令發送和接收SMS?

回答

4

這裏是一個應該讓你開始(在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()來檢查錯誤,但它是最好的,以確保你把它送上手機之前,你的消息是OK。還請注意,睡覺似乎是必要的。

大多數手機都能理解這一點。爲了讓我的舊諾基亞C5打開串口連接,我必須從插入USB電纜時彈出的菜單中選擇「PC套件」。這應該與藍牙一樣好。

該代碼使用PySerial包,可用於在Python 2和3也

參見:

+2

不,不,不!請不要以這種方式處理AT命令。在發送下一個命令之前,您必須**等待最終結果代碼(例如,OK,ERROR,...)。特別是對於AT + CMGS,你必須等待調制解調器發送「\ n \ r>」,然後才能開始發送MyMessage。有關更多詳細信息,請參閱此答案,http://stackoverflow.com/a/15591673/23118。 – hlovdal 2013-03-25 10:31:32

+0

睡覺不能替代閱讀和解析迴應。它和踢狗一樣有用,它們可以阻止你移動。是的,它實際上可能會有一些工作,但在某些時候,你會爲採取這種方法感到抱歉。 – hlovdal 2013-03-25 10:32:20

1

與手機通話很容易。你只需要打開適當的/dev/ttyACM*設備並與之通話。哪個電話更棘手。任何支持「tethering」的手機和完整的用於SMS消息的AT命令都應該沒問題。

3

看到發送使用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() 
0

我會建議與條件循環等待從調制解調器的響應更換time.sleep「OK」之前,繼續下一個狀態。