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

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

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

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

Ответы [ 4 ]

6 голосов
/ 28 июля 2011

Вот пример кода, который должен помочь вам начать работу (в 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.

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

4 голосов
/ 21 октября 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()
1 голос
/ 29 января 2010

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

0 голосов
/ 31 января 2018

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

...