2010-01-29 5 views
8

Quelqu'un peut-il m'aider à envoyer et recevoir des SMS en utilisant les commandes AT en Python?Comment envoyer/recevoir des SMS en utilisant les commandes AT?

Dans le cas où il importe, j'utilise Fedora 8.

Quel téléphone sera mieux avec Linux (Nokia, Sony Ericson, Samsung, .....)? Tous les téléphones prendront-ils en charge l'envoi et la réception de SMS à l'aide des commandes AT?

Répondre

4

Voici quelques exemples de code que si vous commencer (en 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() 

Vous devez faire deux choses supplémentaires:

  • Coder le message dans le format approprié (la plupart du temps GSM 03.38, il y a un pratique translation table à unicode.org). Si vous ne vous souciez vraiment d'aucun autre caractère que l'ASCII, vous pouvez simplement vérifier si tous les caractères sont dans string.printable.

  • Vérifiez la longueur du message (je ne suis pas sûr que cela concerne l'encodage, mais il est parfois 140 caractères, parfois 160).

Vous pouvez utiliser phone.readall() pour vérifier les erreurs, mais il est préférable de vous assurer que votre message est OK avant de l'envoyer au téléphone. Notez également que les dortoirs semblent être nécessaires.

La plupart des téléphones le comprendront. Pour que mon ancien Nokia C5 ouvre la connexion série, j'ai dû sélectionner "PC Suite" dans le menu qui apparaît lorsque vous insérez le câble USB. Cela devrait fonctionner aussi bien sur Bluetooth.

Le code utilise le package PySerial, disponible pour python 2 et 3.

Voir aussi:

+2

Non, non, non! Veuillez ne pas traiter les commandes AT de cette manière. Vous ** devez ** attendre le code du résultat final (par exemple, OK, ERREUR, ...) avant d'envoyer la commande suivante. Et spécifiquement pour AT + CMGS, vous devez ** attendre ** que le modem envoie "\ n \ r>" avant de commencer à envoyer MyMessage. Voir cette réponse pour plus de détails, http://stackoverflow.com/a/15591673/23118. – hlovdal

+0

Dormir ne remplace pas la lecture et l'analyse de la réponse.C'est aussi utile que de donner un coup de pied aux chiens qui se dressent sur votre chemin pour les faire bouger. Oui, cela peut effectivement fonctionner à certains moments, mais à un moment donné, vous serez désolé d'avoir adopté cette approche. – hlovdal

1

Parler au téléphone est facile. Il vous suffit d'ouvrir le périphérique /dev/ttyACM* approprié et de lui parler. Quel téléphone est plus compliqué. Tout téléphone qui prend en charge "tethering" et la commande AT complète définie pour les messages SMS devrait être bien.

3

pour voir envoyer des SMS à l'aide à la commande cela vous aidera.

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" 

Pour recevoir des sms à l'aide à la commande Cela devrait aider

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

je suggère de remplacer le time.sleep avec boucle condition en attente de la réponse du modem « OK » avant de continuer état suivant.

Questions connexes