Raspberry Pi 3 - Utilizzare Serial GPIO per Comandi GSM Ricevere e Inviare SMS

Raspberry Pi 3 - Utilizzare Serial GPIO per Comandi GSM Ricevere e Inviare SMS

Questo post è scritto a seguito delle difficoltà incontrate nel connettere uno shield GSM basato su chip SIM800 su un raspberry Pi3. Le guide a cui questo articolo si ispira sono:
  • http://elinux.org/RPi_Serial_Connection
  • http://www.techpository.com/raspberry-pi-configuring-the-gpio-serial-port-on-raspbian-jessie-including-pi-3/
  • http://www.rhydolabz.com/wiki/?p=10450
Nella nuova versione di Raspberry la porta seriale /dev/ttyAMA0 indica la porta seriale del bluetooth, mentre la porta seriale GPIO è indicata dal link symbolico : /dev/ttyS0 E' necessario, dunque, assicurarsi che la porta seriale sia abilitata, quindi da terminale: sudo raspi-config -> Advanced Options -> Serial -> YES ravviare se necessario A questo punto fermiamo l'accesso da console: sudo systemctl stop serial-getty@ttyS0.service quindi adesso è possibile accedere alla porta seriale. Per disabilitarla ai prossimi accessi: sudo systemctl disable serial-getty@ttyS0.service Arrivato qui, per me era necessario far comunicare uno shield GSM per l'invio la ricezione dei messaggi. Il prodotto in questione è questo: ITEAD GSM SIM800 ho provato a contattare l'assistenza che non mi ha fornito alcun aiuto, soprattutto perchè loro non forniscono librerie in python. Quindi con un bel po' di pazienda e tanta perseveranza, sono riuscito a rielaborare un po' di script in giro per la rete per far funzionare la suddetta espansione con python. questo il codice per inviare un sms: import serial import RPi.GPIO as GPIO import os, time GPIO.setmode(GPIO.BOARD) # Enable Serial Communication port = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1) # Transmitting AT Commands to the Modem # '\r\n' indicates the Enter key port.write('AT'+'\r\n') rcv = port.read(10) print rcv time.sleep(1) port.write('ATE0'+'\r\n') # Disable the Echo rcv = port.read(10) print rcv time.sleep(1) port.write('AT+CMGF=1'+'\r\n') # Select Message format as Text mode rcv = port.read(10) print rcv time.sleep(1) port.write('AT+CNMI=2,1,0,0,0'+'\r\n') # New SMS Message Indications rcv = port.read(10) print rcv time.sleep(1) # Sending a message to a particular Number port.write('AT+CMGS="1234567890"'+'\r\n') # impostare il numero di telefono dentro i doppi apici rcv = port.read(10) print rcv time.sleep(1 port.write('Hello User'+'\r\n') # Message rcv = port.read(10) print rcv port.write("\x1A") # Enable to send SMS for i in range(10): rcv = port.read(10) print rcv Questo invece lo script per leggere gli sms: import serial import RPi.GPIO as GPIO import os, time # Find a suitable character in a text or string and get its position def find(str, ch): for i, ltr in enumerate(str): if ltr == ch: yield i GPIO.setmode(GPIO.BOARD) # Enable Serial Communication port = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1) # Transmitting AT Commands to the Modem # '\r\n' indicates the Enter key port.write('AT'+'\r\n') port.write("\x0D\x0A") rcv = port.read(10) print rcv time.sleep(1) port.write('ATE0'+'\r\n') # Disable the Echo rcv = port.read(10) print rcv time.sleep(1) port.write('AT+CMGF=1'+'\r\n') # Select Message format as Text mode rcv = port.read(10) print rcv time.sleep(1) port.write('AT+CNMI=2,1,0,0,0'+'\r\n') # New SMS Message Indications rcv = port.read(10) print rcv time.sleep(1) ck=1 while ck==1: rcv = port.read(10) print rcv fd=rcv if len(rcv)>3: # check if any data received ck=12 for i in range(5): rcv = port.read(10) print rcv fd=fd+rcv # Extract the complete data # Extract the message number shown in between the characters "," and '\r' p=list(find(fd, ",")) q=list(find(fd, '\r')) MsgNo=fd[p[0]+1:q[1]] # Read the message corresponds to the message number rd=port.write('AT+CMGR='+MsgNo+'\r\n') msg='' for j in range(10): rcv = port.read(20) msg=msg+rcv print msg time.sleep(0.1) Ovviamente lo script è un inizio, ognuno dovrebbe modificarlo secondo le proprie necessità