2010-01-29 4 views
8

Qualcuno può aiutarmi a inviare e ricevere SMS utilizzando i comandi AT in Python?Come inviare/ricevere SMS usando i comandi AT?

Nel caso in cui è importante, sto usando Fedora 8.

quale telefono sarà meglio con Linux (Nokia, Sony Ericson, Samsung, .....)? Tutti i telefoni supportano l'invio e la ricezione di SMS utilizzando i comandi AT?

risposta

4

Ecco qualche esempio di codice che dovrebbe iniziare (in 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() 

Hai bisogno di fare due cose aggiuntive:

  • codificare il messaggio nel formato appropriato (per lo più GSM 03.38, c'è un comodo translation table su unicode.org). Se davvero non ti importa di caratteri diversi da ASCII, puoi controllare se ogni personaggio è in string.printable.

  • Controllare la lunghezza del messaggio (non sono sicuro che abbia a che fare con la codifica, ma a volte è di 140 caratteri, a volte 160).

È possibile utilizzare phone.readall() per controllare gli errori, ma è meglio per assicurarsi che il messaggio è OK prima di inviarlo fuori al telefono. Si noti inoltre che i posti letto sembrano essere necessari.

La maggior parte dei telefoni lo capirà. Per far sì che il mio vecchio Nokia C5 aprisse la connessione seriale, dovevo selezionare "PC Suite" dal menu che si apre quando si inserisce il cavo USB. Questo dovrebbe funzionare ugualmente bene su Bluetooth.

Il codice utilizza il pacchetto PySerial, disponibili per Python 2 e 3.

Vedi anche:

+2

No, no, no! Per favore non elaborare i comandi AT in questo modo. Devi ** ** attendere il codice del risultato finale (ad esempio, OK, ERRORE, ...) prima di inviare il comando successivo. E in particolare per AT + CMGS ** DEVI ** attendere che il modem invii "\ n \ r>" prima di iniziare a inviare MyMessage. Vedi questa risposta per maggiori dettagli, http://stackoverflow.com/a/15591673/23118. – hlovdal

+0

Dormire non è un sostituto per la lettura e l'analisi della risposta.È utile come calciare i cani che stanno sulla tua strada per farli muovere. Sì, potrebbe effettivamente funzionare alcune volte, ma a un certo punto ti dispiacerà prendere questo approccio. – hlovdal

1

Parlare al telefono è facile. Hai solo bisogno di aprire il dispositivo /dev/ttyACM* appropriato e parlarci. Quale telefono è più complicato. Qualsiasi telefono che supporti "tethering" e il set completo di comando AT per i messaggi SMS dovrebbe andare bene.

3

per vedere Invia sms utilizzando All'ordine questo aiuterà.

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" 

per ricevere sms utilizzando Al comando di questo dovrebbe aiutare

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

Vorrei suggerire sostituire il time.sleep con condizione del ciclo di attesa per la risposta del modem "OK" prima di continuare stato successivo.