Comment envoyer / recevoir des SMS en utilisant les commandes AT?
-
23-09-2019 - |
Question
Quelqu'un peut me aider à envoyer et recevoir des SMS en utilisant les commandes AT en Python?
Dans le cas où il importe, j'utilise Fedora 8.
Quel téléphone sera mieux avec Linux (Nokia, Sony Ericson, Samsung, .....)? Est-ce que tous les téléphones prennent en charge l'envoi et la réception de SMS à l'aide des commandes AT?
La solution
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 GSM 03.38 , il y a une pratique de à unicode.org). Si vraiment vous ne se soucient pas des caractères autres que ASCII, vous pouvez simplement vérifier si chaque caractère est
string.printable
. -
Vérifiez la longueur du message (je ne suis pas sûr que ce soit à voir avec 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 sommeils semblent nécessaires.
La plupart des téléphones comprendront cela. Afin d'obtenir mon vieux Nokia C5 pour ouvrir la connexion série, je devais 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:
Autres conseils
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 ce qui 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()
Parler au téléphone est facile. Vous avez juste besoin d'ouvrir le dispositif de /dev/ttyACM*
approprié et lui parler. Quel téléphone est plus délicat. Tout téléphone qui prend en charge « tethering » et le plein jeu de commandes pour les messages SMS devrait être bien.
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.