如何使用AT命令发送/接收SMS?
问题描述:
任何人都可以帮助我在Python中使用AT命令发送和接收SMS吗?如何使用AT命令发送/接收SMS?
在它的事项的情况下,我使用的Fedora 8
哪款手机会更好使用Linux(诺基亚,索尼埃里克松,三星,......)? 所有手机是否都支持使用AT命令发送和接收SMS?
答
这里是一个应该让你开始(在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有一个方便的translation table)。如果你真的不关心ASCII以外的任何字符,你可以检查每个字符是否在
string.printable
。检查邮件的长度(我不确定它是否与编码有关,但有时候是140个字符,有时候是160个)。
您可以使用phone.readall()
来检查错误,但它是最好的,以确保你把它送上手机之前,你的消息是OK。还请注意,睡觉似乎是必要的。
大多数手机都能理解这一点。为了让我的旧诺基亚C5打开串口连接,我必须从插入USB电缆时弹出的菜单中选择“PC套件”。这应该与蓝牙一样好。
该代码使用PySerial包,可用于在Python 2和3也
参见:
答
与手机通话很容易。你只需要打开适当的/dev/ttyACM*
设备并与之通话。哪个电话更棘手。任何支持“tethering”的手机和完整的用于SMS消息的AT命令都应该没问题。
答
看到发送使用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()
答
我会建议与条件循环等待从调制解调器的响应更换time.sleep
“OK”之前,继续下一个状态。
不,不,不!请不要以这种方式处理AT命令。在发送下一个命令之前,您必须**等待最终结果代码(例如,OK,ERROR,...)。特别是对于AT + CMGS,你必须等待调制解调器发送“\ n \ r>”,然后才能开始发送MyMessage。有关更多详细信息,请参阅此答案,http://*.com/a/15591673/23118。 – hlovdal 2013-03-25 10:31:32
睡觉不能替代阅读和解析回应。它和踢狗一样有用,它们可以阻止你移动。是的,它实际上可能会有一些工作,但在某些时候,你会为采取这种方法感到抱歉。 – hlovdal 2013-03-25 10:32:20