2010-01-29 82 views
8

¿Alguien me puede ayudar a enviar y recibir mensajes de texto usando comandos AT en Python?Cómo enviar/recibir SMS usando comandos AT?

En caso de que importa, estoy usando Fedora 8.

Qué teléfono será mejor con Linux (Nokia, Sony Ericson, Samsung, .....)? ¿Todos los teléfonos admiten el envío y la recepción de SMS utilizando comandos AT?

Respuesta

4

Aquí hay un código de ejemplo que servirán para iniciar (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() 

Es necesario hacer dos cosas adicionales:

  • codificar el mensaje en el formato adecuado (en su mayoría GSM 03.38, hay un práctico translation table en unicode.org). Si realmente no te importan otros caracteres que no sean ASCII, puedes verificar si cada personaje está en string.printable.

  • Compruebe la longitud del mensaje (no estoy seguro de si tiene que ver con la codificación, pero a veces es de 140 caracteres, a veces 160).

Puede utilizar phone.readall() para comprobar si hay errores, pero lo mejor es asegurarse de que su mensaje es bien antes de enviarla al teléfono. Tenga en cuenta también que los sueños parecen ser necesarios.

La mayoría de los teléfonos comprenderán esto. Para que mi viejo Nokia C5 abriera la conexión serial, tuve que seleccionar "PC Suite" desde el menú que aparece cuando insertas el cable USB. Esto debería funcionar igualmente bien con Bluetooth.

El código utiliza el paquete PySerial, disponibles para Python 2 y 3.

Ver también:

+2

No, no, no! Por favor, no procese los comandos AT de esta manera. Usted ** DEBE ** esperar el código de resultado final (por ejemplo, OK, ERROR, ...) antes de enviar el siguiente comando. Y específicamente para AT + CMGS, ** DEBE ** esperar a que el módem envíe "\ n \ r>" antes de que comience a enviar MyMessage. Vea esta respuesta para más detalles, http://stackoverflow.com/a/15591673/23118. – hlovdal

+0

Dormir no es un sustituto para leer y analizar la respuesta.Es tan útil como patear perros que se interponen en tu camino para que se muevan. Sí, en realidad podría funcionar algunas veces, pero en algún momento lamentará tomar ese enfoque. – hlovdal

1

Hablar con el teléfono es fácil. Solo necesita abrir el dispositivo /dev/ttyACM* apropiado y hablar con él. ¿Qué teléfono es más complicado? Cualquier teléfono que admita "tethering" y el conjunto completo de comandos AT para mensajes SMS debería estar bien.

3

para ver enviar sms usando al comando que esto ayudará.

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" 

para recibir los SMS utilizando A la orden Esto debería ayudar

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

Yo sugeriría sustituir el time.sleep con el lazo de la condición a la espera de la respuesta del módem "OK" para continuar siguiente estado.

Cuestiones relacionadas