Pregunta

Puede alguien ayudarme para enviar y recibir SMS utilizando comandos AT en Python?

En caso de que importa, estoy usando Fedora 8.

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

¿Fue útil?

Solución

Aquí hay un código de ejemplo que debería empezar (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 en unicode.org). Si realmente no se preocupan por caracteres que no sean ASCII, sólo puede comprobar si cada personaje está en string.printable.

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

Se 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 duerme parecen ser necesarios.

La mayoría de los teléfonos van a entender esto. Con el fin de conseguir mi viejo Nokia C5 para abrir la conexión en serie, tuve que seleccionar "PC Suite" en el menú que aparece cuando se inserta el cable USB. Esto debería funcionar igual de bien a través de Bluetooth.

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

Ver también:

Otros consejos

para ver sms Enviar mediante comando En esta ayuda voluntad.

    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 SMS usando 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()

El hablar con el teléfono es fácil. Sólo tiene que abrir el dispositivo /dev/ttyACM* apropiado y hablar con él. ¿Qué teléfono es más complicado. Cualquier teléfono compatible con "tethering" y el conjunto de comandos AT completo para mensajes SMS deben estar bien.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top