Как отправлять/получать SMS с помощью AT-команд?

Может ли кто-нибудь помочь мне отправлять и получать SMS с помощью AT-команд в Python?

Если это имеет значение, я использую Fedora 8.

Какой телефон будет лучше с Linux (Nokia, Sony Ericson, Samsung,...)? Будут ли все телефоны поддерживать отправку и получение SMS с помощью AT-команд?


person RSK    schedule 29.01.2010    source источник


Ответы (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). Если вам действительно не нужны какие-либо символы, кроме ASCII, вы можете просто проверить, есть ли каждый символ в string.printable.

  • Проверьте длину сообщения (не уверен, что это связано с кодировкой, но иногда 140 символов, иногда 160).

Вы можете использовать phone.readall() для проверки на наличие ошибок, но лучше убедиться, что ваше сообщение в порядке, прежде чем отправлять его на телефон. Обратите также внимание на то, что сон кажется необходимым.

Большинство телефонов понимают это. Чтобы мой старый Nokia C5 открыл последовательное соединение, мне пришлось выбрать «PC Suite» в меню, которое появляется при подключении USB-кабеля. Это должно одинаково хорошо работать через Bluetooth.

В коде используется пакет PySerial, доступный для Python 2 и 3.

Смотрите также:

person Stefano Palazzo    schedule 28.07.2011
comment
Нет нет нет! Пожалуйста, не обрабатывайте AT-команды таким образом. Вы ДОЛЖНЫ дождаться окончательного кода результата (например, OK, ERROR, ...) перед отправкой следующей команды. И специально для AT+CMGS вы ДОЛЖНЫ дождаться, пока модем отправит \n\r›, прежде чем вы должны начать отправлять MyMessage. См. этот ответ для получения более подробной информации, stackoverflow.com/a/15591673/23118. - person hlovdal; 25.03.2013
comment
Сон не заменяет чтение и разбор ответа. Это так же полезно, как пинать собак, которые стоят на вашем пути, чтобы заставить их двигаться. Да, иногда это может сработать, но в какой-то момент вы пожалеете, что выбрали такой подход. - person hlovdal; 25.03.2013

чтобы увидеть отправку смс с помощью команды 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()
person Transformer    schedule 21.10.2013

Говорить по телефону легко. Вам просто нужно открыть соответствующее /dev/ttyACM* устройство и поговорить с ним. Какой телефон сложнее. Подойдет любой телефон, поддерживающий «привязку» и полный набор AT-команд для SMS-сообщений.

person Ignacio Vazquez-Abrams    schedule 29.01.2010

Я бы предложил заменить time.sleep циклом условий, ожидающим ответа от модема «ОК», прежде чем продолжить следующее состояние.

person Kelvin Koh    schedule 31.01.2018
comment
Я подключаю свой телефон Android с помощью USB-кабеля и не нахожу его под портами, а под портативными устройствами, из-за этого я не могу проверить функцию SMS. Как включить COM порт? - person Ds Arjun; 30.03.2018