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:
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à
- 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