谁能帮我在 Python 中使用 AT 命令发送和接收短信?
万一这很重要,我使用的是 Fedora 8。
哪款手机更适合 Linux(诺基亚、索尼爱立信、三星……)?所有手机都支持使用 AT 命令发送和接收短信吗?
谁能帮我在 Python 中使用 AT 命令发送和接收短信?
万一这很重要,我使用的是 Fedora 8。
哪款手机更适合 Linux(诺基亚、索尼爱立信、三星……)?所有手机都支持使用 AT 命令发送和接收短信吗?
下面是一些可以帮助您入门的示例代码(在 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()
它来检查错误,但最好在将消息发送到手机之前确保消息正常。另请注意,睡眠似乎是必要的。
大多数手机都会理解这一点。为了让我的旧诺基亚 C5 打开串行连接,我必须从插入 USB 电缆时弹出的菜单中选择“PC Suite”。这应该同样适用于蓝牙。
该代码使用PySerial包,可用于 python 2 和 3。
也可以看看:
要查看使用 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()
与电话交谈很容易。您只需要打开相应的/dev/ttyACM*
设备并与之交谈即可。哪款手机比较麻烦。任何支持“网络共享”和 SMS 消息的完整 AT 命令集的电话都应该没问题。
我建议替换time.sleep
条件循环,等待调制解调器“OK”的响应,然后再继续下一个状态。