2010-01-29 96 views

Trả lời

4

Dưới đây là một số mã ví dụ mà nên giúp bạn bắt đầu (bằng 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() 

Bạn cần phải làm hai điều bổ sung:

  • Mã hóa thông điệp trong các định dạng thích hợp (chủ yếu là GSM 03.38, có một số translation table tiện dụng tại unicode.org). Nếu bạn thực sự không quan tâm đến bất kỳ ký tự nào khác ngoài ASCII, bạn chỉ có thể kiểm tra xem mọi ký tự có nằm trong string.printable hay không.

  • Kiểm tra độ dài của thông báo (Tôi không chắc liệu nó có liên quan đến mã hóa hay không, nhưng đôi khi có 140 ký tự, đôi khi 160).

Bạn có thể sử dụng phone.readall() để kiểm tra lỗi, nhưng tốt nhất là đảm bảo thư của bạn OK trước khi bạn gửi cho điện thoại. Cũng lưu ý rằng giấc ngủ dường như là cần thiết.

Hầu hết các điện thoại sẽ hiểu điều này. Để có được Nokia C5 cũ của tôi để mở kết nối nối tiếp, tôi phải chọn "PC Suite" từ menu bật lên khi bạn cắm cáp USB. Điều này sẽ hoạt động tốt như nhau qua Bluetooth.

Mã này sử dụng PySerial gói, có sẵn cho python 2 và 3.

Xem thêm:

+2

Không, không, không! Vui lòng không xử lý các lệnh AT theo cách này. Bạn ** PHẢI ** chờ mã kết quả cuối cùng (ví dụ: OK, ERROR, ...) trước khi gửi lệnh tiếp theo. Và cụ thể cho AT + CMGS bạn ** PHẢI ** chờ modem gửi "\ n \ r>" trước khi bạn bắt đầu gửi MyMessage. Xem câu trả lời này để biết thêm chi tiết, http://stackoverflow.com/a/15591673/23118. – hlovdal

+0

Ngủ không thể thay thế cho việc đọc và phân tích phản hồi.Nó rất hữu ích như đá chó đứng theo cách của bạn để có được chúng để di chuyển. Có, nó có thể thực sự làm việc một số lần, nhưng tại một số điểm bạn sẽ rất tiếc vì đã sử dụng phương pháp đó. – hlovdal

1

Nói chuyện với điện thoại thật dễ dàng. Bạn chỉ cần mở thiết bị /dev/ttyACM* thích hợp và nói chuyện với nó. Điện thoại nào phức tạp hơn. Bất kỳ điện thoại nào hỗ trợ "chia sẻ kết nối" và toàn bộ lệnh AT được đặt cho tin nhắn SMS sẽ ổn.

3

để xem gửi sms sử dụng Tại lệnh này sẽ giúp.

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" 

Để nhận được sms sử dụng Tại lệnh này sẽ giúp

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() 
0

Tôi sẽ đề nghị thay thế time.sleep với điều kiện vòng lặp chờ đợi phản hồi từ modem "OK" trước khi tiếp tục trạng thái tiếp theo.

Các vấn đề liên quan