View All

Facebook Timeline

Appels, SMS et MMS avec Raspberry Pi , le SIM800, le SIM800C ou SIM900 et Python

Posted On: juil. 10, 2020

Seen by: 11073

Categories: GSM/GPRS

Author: Christian Joseph

Tags: raspberry pi , sim900 , sms , mms , sim800c

Après avoir envoyé et reçu des SMS, envoyé des MMS et émis des appels avec Arduino, nous allons maintenant le faire avec SIM800, le SIM800C, ou encore le SIM900 et le Raspberry Pi en langage python. L'envoi de SMS est un protocole universel quel que soit l'opérateur téléphonique. L'envoi de MMS nécessite des paramètres APN propres à chaque opérateur téléphonique. Pas de panique, nous avons développé le code de l'envoi MMS avec la poste mobile, mais nous vous avons aussi fournit les paramètres à remplacer tout simplement dans le code des opérateurs comme Orange, SFR, et Bouygue Télécom.

SOMMAIRE:

  1. PRESENTATION

  2. ENVOI DE SMS ET APPELS

  3. RECEPTION DE SMS

  4. ENVOI DE MMS

    • ENVOI DE MMS SIMPLE

    • ENVOI DE MMS A PARTIR DE LA CAMERA DU RASPBERRY

    • ENVOI DE MMS A UNE LISTE DE CONTACTS EXCEL

1. PRESENTATION:

LE RASPBERRY PI:

Le Raspberry Pi est une carte micro-ordinateur avec des Ports usb ( 2 à 4 suivant le modèle), un port HDMI, 1 port pour sa caméra,  1 Port Ethernet, une connectivité Bluetooth et WIFI (suivant le modèle), et un environnement d'exploitation sous linux appélé Rasbian OS.

Le Raspberry permet de faire tout ce qui est possible sur un ordinateur classique, comme de l'édition de texte, du multimédia, et même de la programmation. Depuis la 1ère version, le Raspberry Pi a beaucoup évolué en terme de Software et de Hardware. Il est capable de faire une visio conférence, faire de la télésurveillance, ou encore travailler des processus liés à l'intélligence artificielle.

SIM800 / SIM800C / SIM900:

Les modules SIM800, SIM800C et SIM900 sont des modules GSM/GPRS quadri-bande et qui servent à envoyer des SMS, des MMS et des Appels. Ces modules disposent tous de connecteurs pour carte SIM ou micro SIM (SIM800C) et sont compatibles tous opérateurs.

2. Branchement:

Notre but est d'envoyer des SMS et des MMS avec un SIM900 , un SIM800 ou avec un SIM800C mais tout d'abord nous allons devoir le connecter avec notre Raspberry Pi.

Sim900-Raspberry-Pi-wiring

La Connection est plutôt simple avec 3 fils comme lors du tutoriel avec Arduino:

SIM900RASPi 4
GNDGND
RXGPIO15
TXGPIO14

Nous utilisons un Raspberry Pi 4, mais ce montage est aussi valable pour un Raspberry 3 ou 2 étant donné qu'il s'agit des mêmes broches.

Nous avons aussi la possibilité d'utiliser le SIM800 ou SIM800C pour Raspberry Pi:

SIM800C pour Raspberry Pi 4 et 3

Module SIM800C pour le Raspberry Pi 4

SIM800 V2.3 - pour Raspberry Pi

SIM800 V2.3 HAT pour Raspberry Pi 4 et 3

L'avantage des modules SIM800 et SIM800C est qu'ils ne nécessitent aucun câblage avec la carte Raspberry Pi, et ne nécessitent aucune alimentation externe contrairement au SIM900 qui est plus désigné pour les carte Arduino, mais fonctionne aussi bien avec un Raspberry Pi.

3.Programmation:

Alors avant de programmer, il faut d'abord activer le port série de votre Raspberry Pi:

  1. Ouvrez le terminal du Raspberry Pi
  2. Tapez la commande: sudo raspi-config
  3. Dans le menu qui apparaît allez sur 'Interfacing Options' + Entrée
  4. Ensuite sur 'Serial' + Entrée
  5. A la question 'would you like a login shell to be accessible over serial', vous mettez 'non' + Entrée
  6. A la question 'would you like the serial port hardware to be enabled?', vous mettez 'oui' + Entrée 2 fois
  7. Puis vous redémarrez votre raspberry pi afin que les modifications soient prises en compte.

2 ENVOI DE SMS ET APPELS:

Etant donné que l'éditeur Blog ne prend pas encore en compte le symbole antislash( Eh oui il l'assimile à du code HTML), il faudra donc remplacer dans le code (antislash) par son symbole, avant de lancer votre script python via le terminal raspberry. Exemple: Python /home/pi/Documents/mon_script.py ou Python3 /home/pi/Documents/mon_script.py.

N.B: mon_script.py est bien entendu enregistré dans le dossier Documents de votre raspberry Pi.

Le sim900 ne prend pas en compte les accents, du coup tous vos sms doivent être rédigés en notation anglo-saxonne, c'est à dire sans accent (sacrebleu!).

Code avec Python 2.7

import serial
import RPi.GPIO as GPIO      
import time 

# Enable Serial Communication
phone = serial.Serial("/dev/ttyS0", baudrate=115200, timeout=1)

phone.write('AT(antislash)r(antislash)n')
time.sleep(2)

phone.write('AT+CMGF=1(antislash)r(antislash)n')
time.sleep(3)

phone.write('AT+CNMI=2,1,0,0,0(antislash)r(antislash)n')
time.sleep(2)

phone.write('AT+CMGS=(antislash)"+33644757223(antislash)"(antislash)r(antislash)n')
time.sleep(2)

phone.write('Hello cher utilisateur, je suis ton Raspberry Pi (antislash)r(antislash)n') #message
time.sleep(2)

phone.write('(antislash)x1A') #Envoi du SMS

time.sleep(2)

phone.write('ATD+33644757223;r"); #appel téléphonique

Code avec Python 3

import serial
import RPi.GPIO as GPIO      
import time

 

# Activation du port série
phone = serial.Serial("/dev/ttyS0", baudrate=115200, timeout=1)


phone.write(b'AT(antislash)r(antislash)n')
time.sleep(2)

phone.write(b'AT+CMGF=1(antislash)r(antislash)n')
time.sleep(3)

phone.write(b'AT+CNMI=2,1,0,0,0(antislash)r(antislash)n')
time.sleep(2)

phone.write(b'AT+CMGS=(antislash)"+33644757223(antislash)"(antislash)r(antislash)n')
time.sleep(2)

phone.write(b'Hello cher utilisateur, je suis ton Raspberry Pi(antislash)r(antislash)n') #message
time.sleep(2)

phone.write(b'(antislash)x1A') #Envoi du SMS
time.sleep(2)

phone.write(b'ATD+33644757223;(antislash)r"); #appel téléphonique

#En ce qui concerne les appels avec le Raspberry Pi, il faut connecter un micro et un Haut-parleur ou des écouteurs au module SIM800C ou SIM900.

3 RECEPTION DE SMS:

Code avec Python 2.7:

import RPi.GPIO as GPIO
import serial
import time


SERIAL_PORT = "/dev/ttyS0" 

ser = serial.Serial(SERIAL_PORT, baudrate = 9600, timeout = 5)

ser.write("AT+CMGF=1(antislash)r") # mode texte
time.sleep(3)
ser.write('AT+CMGDA="DEL ALL"(antislash)r') # efface tous les SMS
time.sleep(3)
reply = ser.read(ser.inWaiting()) # efface le buffer
print "Attente de SMS entrant..."

while True:   # ATTENTION A L'INDENTATION ICI

       reply = ser.read(ser.inWaiting())

       if reply != " ":    # ATTENTION A L'INDENTATION ICI

          ser.write("AT+CMGR=1r")

          time.sleep(3)

          reply = ser.read(ser.inWaiting())

          print "SMS recu. Contenu:"

          print reply

          ser.write('AT+CMGDA="DEL ALL"(antislash)r') # efface tous les SMS

          time.sleep(3) 

code avec Python 3:

Nous allons voir 4 programmes de réception de sms avec python3:

  1. On reçoit un SMS et on envoi une réponse SMS automatique à l'émetteur
  2. On reçoit un SMS et on l'envoi à un numéro tiers (service client, Hotline, intervenant,etc...)
  3. On reçoit un SMS et on enregistre le SMS dans un fichier texte tout en envoyant le SMS à un numéro tiers
  4. On reçoit un SMS et on enregistre le SMS dans un fichier texte tout en envoyant une réponse automatique à l'émetteur du SMS

Pour savoir si un nouveau SMS est arrivé, on lit en permance le buffer de reception du module SIM800 ou SIM900, et on recherche le "REC" comme dans "REC UNREAD". Une fois le mot repéré, on peut alors extraire le numéro de téléphone de l'émetteur, ou encore le contenu du SMS.

Reception de SMS SIM800 et SIM900 Raspberry Pi

Programme 1: Réception de SMS et envoi de réponse automatique

#Programme :Réception de SMS avec Python 3
#Auteur: Christian Joseph
#date: 10/07/2020
#www.eagle-robotics.com

import RPi.GPIO as GPIO
import serial
import time
import binascii



ser = serial.Serial("/dev/ttyS0" , baudrate = 115200, timeout = 1)

ser.write(b'AT+CMGF=1(antislash)r') # mode texte
time.sleep(1)
ser.write(b'AT+CMGDA=(antislash)"DEL ALL(antislash)"(antislash)r') # efface tous les SMS
time.sleep(1)
reply = ser.read(ser.inWaiting())
print ("Attente de SMS entrant")
ser.reset_input_buffer()
a = 1
b = str(a)
c = 1
while True:    # ATTENTION A L'INDENTATION ICI
      reply = ser.read(ser.inWaiting())
      
      if  len(reply) > 0:       # ATTENTION A L'INDENTATION ICI
          ser.write(b'AT+CMGR=')
          ser.write(b.encode())
          ser.write(b'(antislash)r')
          time.sleep(1)
          reply = ser.read(ser.inWaiting())
          reply2 = str(reply)
          m = reply2.find('REC') # on recherche le mot REC ce qui signifie qu'un nouveau SMS est arrivé
          if (m != -1):
                print("Nouveau SMS")
                print (reply)
                nummer = reply2.split(',')
                #Extraction du numéro de l'emetteur
                if (c == 1):
                    numero2 = nummer[2].encode()
                    c = c + 1
                else:
                    numero2 = nummer[1].encode()
                print(numero2)
                a = a + 1
                b = str(a) #on incrémente la donnée pour le prochain sms
                ser.write(b'AT(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CMGF=1(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CNMI=2,1,0,0,0(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'AT+CMGS=')#Destinataire
                ser.write(numero2) #ici on envoi un message automatique à l'émetteur du SMS
                ser.write(b'(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'Merci pour votre message, nous vous recontacterons(antislash)r(antislash)n') #Message à envoyer
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'(antislash)x1A')
                time.sleep(2)
          else: #Attention à l'indentation
              print("Aucun SMS") #Aucun SMS reçu
              
          
          ser.write(b'AT+CMGR=') #SMS suivant si présent
          ser.write(b.encode())
          ser.write(b'(antislash)r')    
          time.sleep(3)


Programme 2: Réception de SMS et envoi du SMS à un numéro Tiers

Dans ce programme, le contenu du SMS ainsi que le numéro de l'émetteur sont envoyés par SMS à un numéro Tiers. Cela peut être le numéro d'un service clientèle, administratif, ou Hotline, etc...

#Programme :Réception de SMS avec Python 3
#Auteur: Christian Joseph
#date: 10/07/2020
#www.eagle-robotics.com

import RPi.GPIO as GPIO
import serial
import time
import binascii



ser = serial.Serial("/dev/ttyS0" , baudrate = 115200, timeout = 1)

ser.write(b'AT+CMGF=1(antislash)r') # mode texte
time.sleep(1)
ser.write(b'AT+CMGDA=(antislash)"DEL ALL(antislash)"(antislash)r') # efface tous les SMS
time.sleep(1)
reply = ser.read(ser.inWaiting())
print ("Attente de SMS entrant")
ser.reset_input_buffer()
a = 1
b = str(a)
c = 1
while True:    # ATTENTION A L'INDENTATION ICI
      reply = ser.read(ser.inWaiting())
      
      if  len(reply) > 0:       # ATTENTION A L'INDENTATION ICI
          ser.write(b'AT+CMGR=')
          ser.write(b.encode())
          ser.write(b'(antislash)r')
          time.sleep(1)
          reply = ser.read(ser.inWaiting())
          reply2 = str(reply)
          m = reply2.find('REC') # on recherche le mot REC ce qui signifie qu'un nouveau SMS est arrivé
          if (m != -1):
                print("Nouveau SMS")
                print (reply)
                nummer = reply2.split(',')
                #Extraction du numéro de l'emetteur
                if (c == 1):
                    numero2 = nummer[2].encode()
                    c = c + 1
                else:
                    numero2 = nummer[1].encode()
                print(numero2)
                a = a + 1
                b = str(a) #on incrémente la donnée pour le prochain sms
                ser.write(b'AT(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CMGF=1(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CNMI=2,1,0,0,0(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'AT+CMGS=(antislash)"+33644757223(antislash)"'(antislash)r(antislash)n')#Destinataire
               
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(reply) #contenu du SMS reçu à envoyer
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'(antislash)x1A')
                time.sleep(2)
          else: #Attention à l'indentation
              print("Aucun SMS") #Aucun SMS reçu
              
          
          ser.write(b'AT+CMGR=') #SMS suivant si présent
          ser.write(b.encode())
          ser.write(b'(antislash)r')    
          time.sleep(3)

Programme 3: Réception de SMS, enregistrement dans un fichier, et envoi du SMS à un numéro Tiers

Vous pouvez créer le fichier et le mettre dans le dossier de votre choix. Vous devez juste modifier le chemin d'accès au fichier dans le programme. Si le fichier n'est pas crée, le programme le fera automatiquement et le mettra dans le chemin que vous aurez spécifié. Dans notre programme nous avons choisi de créer un fichier appelé NouveauxSMS et placé dans le dossiers messages, lequel est dans un dossier SIM800, lequel est dans un dossier Documents, lequel est dans le dossier pi, et lequel est dans le dossier racine home du Raspberry Pi (ouf on y est arrivé!). en clair ça donne ceci=> f = open("/home/pi/Documents/SIM800/messages/MessagesVisiteurs", "a"). Vous pouvez bien évidement avoir moins de dossiers, appeler par exemple votre fichier "MesSMS", et mettre ce fichier où vous le souhaitez, l'essentiel c'est de bien renseigner le chemin d'accès. Notre fichier s'ouvre en mode "a" ou "append" (ajouter en anglais), ce qui veut dire que le programme ajoutera les SMS les uns à la suite des autres à chaque fois qu'il recevra un SMS et qu'il accèdera au fichier "MessagesVisiteurs", à raison d'un SMS par ligne.

Fichier texte sms SIM800 SIM900 Raspberry Pi

#Programme :Reception de SMS avec Python 2
#Auteur: Christian Joseph
#date: 10/07/2020
#www.eagle-robotics.com

import RPi.GPIO as GPIO
import serial
import time
import binascii



ser = serial.Serial("/dev/ttyS0" , baudrate = 115200, timeout = 1)

ser.write(b'AT+CMGF=1(antislash)r') # mode texte
time.sleep(1)
ser.write(b'AT+CMGDA=(antislash)"DEL ALL(antislash)"(antislash)r') # efface tous les SMS
time.sleep(1)
reply = ser.read(ser.inWaiting())
print ("Attente de SMS entrant")
ser.reset_input_buffer()
a = 1
b = str(a)
c = 1
while True:    # ATTENTION A L'INDENTATION ICI
      reply = ser.read(ser.inWaiting())
      
      if  len(reply) > 0:       # ATTENTION A L'INDENTATION ICI
          ser.write(b'AT+CMGR=')
          ser.write(b.encode())
          ser.write(b'(antislash)r')
          time.sleep(1)
          reply = ser.read(ser.inWaiting())
          reply2 = str(reply)
          m = reply2.find('REC') # on recherche le mot REC ce qui signifie qu'un nouveau SMS est arrivé
          if (m != -1):
                print("Nouveau SMS")
                print (reply)
                nummer = reply2.split(',')
                #Extraction du numéro de l'emetteur
                if (c == 1):
                    numero2 = nummer[2].encode()
                    c = c + 1
                else:
                    numero2 = nummer[1].encode()
                print(numero2)
                a = a + 1
                b = str(a) #on incrémente la donnée pour le prochain sms
                #On enregistre le SMS dans un fichier texte appelé MessagesVisiteurs
                f = open("/home/pi/Documents/SIM800/messages/MessagesVisiteurs", "a") #chemin d'accès au fichier
                f.write(reply2)
                f.write("(antislash)r(antislash)n")
                f.close()
                ser.write(b'AT(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CMGF=1(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CNMI=2,1,0,0,0(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'AT+CMGS=(antislash)"+33644757223(antislash)"(antislash)r(antislash)n')#Destinataire
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(reply) #Message à envoyer
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'(antislash)x1A')
                time.sleep(2)
          else:
              print("Aucun SMS") #Aucun SMS reçu
              
          
          ser.write(b'AT+CMGR=') #SMS suivant si présent
          ser.write(b.encode())
          ser.write(b'(antislash)r')    
          time.sleep(3)

Programme 4: Réception de SMS, enregistrement dans un fichier, et envoi d'un SMS automatique à l'émetteur

#Programme :Reception de SMS avec Python 2
#Auteur: Christian Joseph
#date: 10/07/2020
#www.eagle-robotics.com

import RPi.GPIO as GPIO
import serial
import time
import binascii



ser = serial.Serial("/dev/ttyS0" , baudrate = 115200, timeout = 1)

ser.write(b'AT+CMGF=1(antislash)r') # mode texte
time.sleep(1)
ser.write(b'AT+CMGDA=(antislash)"DEL ALL(antislash)"(antislash)r') # efface tous les SMS
time.sleep(1)
reply = ser.read(ser.inWaiting())
print ("Attente de SMS entrant")
ser.reset_input_buffer()
a = 1
b = str(a)
c = 1
while True:    # ATTENTION A L'INDENTATION ICI
      reply = ser.read(ser.inWaiting())
      
      if  len(reply) > 0:       # ATTENTION A L'INDENTATION ICI
          ser.write(b'AT+CMGR=')
          ser.write(b.encode())
          ser.write(b'(antislash)r')
          time.sleep(1)
          reply = ser.read(ser.inWaiting())
          reply2 = str(reply)
          m = reply2.find('REC') # on recherche le mot REC ce qui signifie qu'un nouveau SMS est arrivé
          if (m != -1):
                print("Nouveau SMS")
                print (reply)
                nummer = reply2.split(',')
                #Extraction du numéro de l'emetteur
                if (c == 1):
                    numero2 = nummer[2].encode()
                    c = c + 1
                else:
                    numero2 = nummer[1].encode()
                print(numero2)
                a = a + 1
                b = str(a) #on incrémente la donnée pour le prochain sms
                #On enregistre le SMS dans un fichier texte appelé MessagesVisiteurs
                f = open("/home/pi/Documents/SIM800/messages/MessagesVisiteurs", "a")
                f.write(reply2)
                f.write("(antislash)r(antislash)n")
                f.close()
                ser.write(b'AT(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CMGF=1(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)

                ser.write(b'AT+CNMI=2,1,0,0,0(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'AT+CMGS=')#Destinataire
                ser.write(numero2) #ici on envoi un message automatique à l'émetteur du SMS
                ser.write(b'(antislash)r(antislash)n')
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'Merci pour votre message, nous vous recontacterons(antislash)r(antislash)n') #Message à envoyer
                time.sleep(1)
                rep = ser.read(ser.inWaiting())
                print(rep)
                ser.write(b'(antislash)x1A')
                time.sleep(2)
          else: #Attention à l'indentation ici
              print("Aucun SMS") #Aucun SMS reçu
              
          
          ser.write(b'AT+CMGR=') #SMS suivant si présent
          ser.write(b.encode())
          ser.write(b'(antislash)r')    
          time.sleep(3)

#FIN DES PROGRAMMES

4 ENVOI DE MMS:

Attention: Les modules SIM800, SIM800C et SIM900 ne sont pas configurés de base pour l'envoi de MMS en France. C'est pourquoi nous faisons la mise à jour du firmware de nos modules SIM800, SIM800C et  SIM900  afin de les rendre compatibles pour les MMS avec les réseaux France et Europe.


Pour l'envoi de MMS, nous avons enregistré une image en .jpg sur le raspberry. Nous utiliserons ici les paramètres APN MMS de la Poste Mobile. Si vous utilisez un autre opérateur, voici les données à remplacer dans le code:

SFR: CMMSCURL = http://mms1 ; CMMSPROTO = 10.151.0.1; APN = sl2sfr

ORANGE: CMMSCURL = http://mms.orange.fr ; CMMSPROTO = 192.168.10.200; APN = orange.acte

BOUYGUES: CMMSCURL = mmsbouygtel ; CMMSPROTO = 62.201.129.226; APN =mmsbouygtel.com

FREE MOBILE: CMMSCURL= mms.free.fr ; CMMSPROTO=0.0.0.0 ; APN = mmsfree

Vous pouvez consulter les autres Opérateurs sur ce site: https://blog.ariase.com/mobile/dossiers/apn-point-acces-reseau-smartphone

Tous les codes avec ses différents opérateurs sont disponibles dans notre Kit Raspberry Pi - SIM800

4.1 ENVOI DE MMS SIMPLE

Code avec Python 2.7:

import serial
import RPi.GPIO as GPIO      
import time


#Activation du port série
phone = serial.Serial("/dev/ttyS0", baudrate=115200, timeout=1)

phone.write('AT(antislash)r(antislash)n')
time.sleep(1)

rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+CMMSINIT(antislash)r(antislash)n')
time.sleep(2)

rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+CMMSCURL=(antislash)"mmsdebitel(antislash)"(antislash)r')
time.sleep(1)

rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+CMMSCID=1(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+CMMSPROTO=(antislash)"10.143.156.003(antislash)",8080(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)


#phone.write('AT+CMMSSENDCFG=6,3,0,0,2,4,1,0(antislash)r') #Envoi mms lent

phone.write('AT+CMMSSENDCFG=1,1,0,0,2,4,2,0(antislash)r') #Envoi mms rapide
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+SAPBR=3,1,(antislash)"CONTYPE(antislash)",(antislash)"GPRS(antislash)"(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+SAPBR=3,1,(antislash)"APN(antislash)",(antislash)"mmsdebitel(antislash)"(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+SAPBR=1,1(antislash)r')
time.sleep(4)
rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+SAPBR=2,1(antislash)r')
time.sleep(1)

rep = phone.read(phone.inWaiting())
print (rep)

phone.write('AT+CMMSEDIT=0(antislash)r') #ON EFFACE LE BUFFER
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+CMMSEDIT=1(antislash)r') #ACTIVATION MODE EDITION
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+CMMSDOWN=(antislash)"PIC(antislash)",15683,20000,(antislash)"mon-image.jpg(antislash)"(antislash)r') #la taille de notre image est de 15683 octets. Pensez à regarder la taille de votre image et remplacez ce chiffre.
time.sleep(1)

photo = open ("/home/pi/Desktop/mon-image.jpg", "r")
dataphoto = photo.read()

phone.write(dataphoto)
time.sleep(1)

phone.write('AT+CMMSRECP=(antislash)"+33644757223(antislash)"(antislash)r')
time.sleep(1)

rep = phone.read(phone.inWaiting())
print (rep)


phone.write('AT+CMMSVIEW(antislash)r')
time.sleep(1)

rep = phone.read(phone.inWaiting())
print (rep)

phone.write('AT+CMMSSEND(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)

phone.write('AT+CMMSTERM(antislash)r')
time.sleep(1)

rep = phone.read(phone.inWaiting())
print (rep)

photo.close()

Code avec Python 3:


import serial
import RPi.GPIO as GPIO      
import time

import binascii


#Activation du port série
phone = serial.Serial("/dev/ttyS0", baudrate=115200, timeout=1)

phone.write(b'AT(antislash)r(antislash)n')
time.sleep(1)


rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+CMMSINIT(antislash)r(antislash)n')
time.sleep(2)


rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+CMMSCURL=(antislash)"mmsdebitel(antislash)"(antislash)r')
time.sleep(1)


rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+CMMSCID=1(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+CMMSPROTO=(antislash)"10.143.156.003(antislash)",8080(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)



#phone.write(b'AT+CMMSSENDCFG=6,3,0,0,2,4,1,0(antislash)r') #Envoi mms lent

phone.write('AT+CMMSSENDCFG=1,1,0,0,2,4,2,0(antislash)r') #Envoi mms rapide
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+SAPBR=3,1,(antislash)"CONTYPE(antislash)",(antislash)"GPRS(antislash)"(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+SAPBR=3,1,(antislash)"APN(antislash)",(antislash)"mmsdebitel(antislash)"(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+SAPBR=1,1(antislash)r')
time.sleep(4)
rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+SAPBR=2,1(antislash)r')
time.sleep(1)


rep = phone.read(phone.inWaiting())
print (rep)


phone.write(b'AT+CMMSEDIT=0(antislash)r') #ON EFFACE LE BUFFER
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+CMMSEDIT=1(antislash)r') #ACTIVATION MODE EDITION
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)



ATcmd = 'AT+CMMSDOWN=(antislash)"PIC(antislash)",15683,20000,(antislash)"mon-image.jpg(antislash)"(antislash)r' #la taille de notre image est de 15683 octets. Pensez à regarder la taille de votre image et remplacez ce chiffre.


phone.write(ATcmd.encode())
time.sleep(1)

photo = open ("/home/pi/Desktop/mon-image.jpg", "rb")
dataphoto = photo.read(1)

while dataphoto:#Attention à l'indentation ici

                       phone.write(dataphoto)

                       dataphoto = photo.read(1)
time.sleep(3)


phone.write(b'AT+CMMSRECP=(antislash)"+33644757223(antislash)"(antislash)r')
time.sleep(1)


rep = phone.read(phone.inWaiting())
print (rep)



phone.write(b'AT+CMMSVIEW(antislash)r')
time.sleep(1)


rep = phone.read(phone.inWaiting())
print (rep)


phone.write(b'AT+CMMSSEND(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print (rep)

phone.write(b'AT+CMMSTERM(antislash)r')
time.sleep(1)

rep = phone.read(phone.inWaiting())
print (rep)

photo.close()


4.2 ENVOI DE MMS A PARTIR DE LA CAMERA RASPBERRY PI:

Code avec Python 3:

#Programme :Envoi de MMS via photo prise par la caméra
#avec Python 3
#Auteur: Christian Joseph
#date: 30/03/2021
#www.eagle-robotics.com
import serial
import RPi.GPIO as GPIO
import time
import picamera
import os, sys
import binascii

camera = picamera.PiCamera()
camera.resolution = (256 , 256)

try: #prise de la photo et sauvegarde sur le bureau
camera.start_preview()
time.sleep(5)
camera.capture('/home/pi/Desktop/monimage.jpg') #photo sauvegardée sur le bureau
camera.stop_preview()
finally:
camera.close()
poids = os.stat('/home/pi/Desktop/monimage.jpg') 
print(poids.st_size) #taille de la photo

phone = serial.Serial("/dev/ttyS0", baudrate=115200, timeout=1)

phone.write(b'AT(antislash)r(antislash)n')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)


phone.write(b'AT+CMMSINIT(antislash)r(antislash)n')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSCURL=(antislash)"mmsdebitel(antislash)"(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSCID=1(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSPROTO=(antislash)"10.143.156.003(antislash)",8080(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSSENDCFG=6,3,0,0,2,4,1,0(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=3,1,(antislash)"CONTYPE(antislash)",(antislash)"GPRS(antislash)"(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=3,1,(antislash)"APN(antislash)",(antislash)"mmsdebitel(antislash)"(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=1,1(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=2,1(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSEDIT=0(antislash)r') #on efface le buffer
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSEDIT=1(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

ATcmd = 'AT+CMMSDOWN=(antislash)"PIC(antislash)",'+ str(poids.st_size) +',20000,(antislash)"monimage.jpg(antislash)"(antislash)r'
phone.write(ATcmd.encode())
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

photo = open ("/home/pi/Desktop/monimage.jpg", "rb")

OctetImage = photo.read(1) #Chargement de la Photo
while OctetImage :

phone.write(OctetImage)
OctetImage = photo.read(1)


time.sleep(3)

phone.write(b'AT+CMMSRECP=(antislash)"+33644757223(antislash)"(antislash)r') #numéro du destinataire
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSVIEW(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)


phone.write(b'AT+CMMSSEND(antislash)r')
time.sleep(10)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSEDIT=0(antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSTERM(antislash)r')
time.sleep(1)

photo.close()

4.3 ENVOI DE MMS IMAGE + TEXTE A UNE LISTE DE CONTACTS A PARTIR D'UN FICHIER EXCEL

Nous avons crée un fichier de contact sur une feuille de calcul sur windows et nous l'avons enregistré au format .csv à partir du logiciel gratuit open office. Il est aussi possible d'utiliser excel de Microsoft ou tout autre logiciel et d'enregistrer également le fichier au format .csv . Puis il vous suffira d'importer le fichier dans le Raspberry Pi avec une clé usb, de lancer notre script et le tour est joué.

Nous avons nommé notre fichier "Client.csv" et nous l'avons mis dans le dossier "Clients", lui même contenu dans le dossier "SIM800", lequel est contenu dans le dossier "Documents", lequel est dans le dossier "Pi", et pour finir lequel est dans le dossier "Home", selon le chemin d'accès suivant de notre Raspberry Pi: /home/pi/Documents/SIM800/Clients/clients.csv

Nous souhaitons envoyer notre image qui s'appelle "Robot. jpg" qui se trouve dans un dossier images et dont le chemin d'accès est le suivant: /home/pi/Documents/SIM800/images/robot.jpg

Nous souhaitons aussi envoyer un message texte avec notre MMS lequel se situe dans le dossier "Clients" également selon le chemin d'accès suivant: /home/pi/Documents/SIM800/Clients/message1

Les tailles des fichiers image et texte sont calculés automatiquement dans le script.

Vous aurez juste besoin de faire attention à la taille de votre titre qui doit correspondre au nombre de caractère de votre titre.

Exemple: Si notre Titre est: Paris est magique, alors sa taille est de 17 caractères (Oui Oui les espaces entre les mots comptent aussi!) 

Pensez donc à bien définir la taille de votre titre à la commande ATcmd = 'AT+CMMSDOWN=(Antislash)"TITLE(Antislash)",17,10000.

Liste clients Raspberry pi

Liste clients

#Programme :Envoi de MMS avec Python 3
#Opérateur: LA POSTE MOBILE
#Auteur: Christian Joseph
#date: 10/07/2020
#www.eagle-robotics.com
import serial
import RPi.GPIO as GPIO
import time
import binascii
import csv
import os, sys

with open('/home/pi/Documents/SIM800/Clients/clients.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print('nom:')
print(row['nom'])
print('prenom:')
print(row['prenom'])
print('numero:')
print(row['telephone'])
print('(Antislash)n')

phone = serial.Serial("/dev/ttyS0", baudrate=115200, timeout=1) #baudrate: 9600 ou 115200
#redémarrer SIM800 après modification du Baudrate
poids = os.stat('/home/pi/Documents/SIM800/Clients/image1.jpg')
print(poids.st_size) #Taille de la photo
poids2 = os.stat('/home/pi/Documents/SIM800/Clients/message1')
print(poids2.st_size)#Taille du message

phone.write(b'AT(Antislash)r(Antislash)n')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)


phone.write(b'AT+CMMSINIT(Antislash)r(Antislash)n')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSCURL=(Antislash)"mmsdebitel(Antislash)"(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSCID=1(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSPROTO=(Antislash)"10.143.156.003(Antislash)",8080(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

#phone.write(b'AT+CMMSSENDCFG=6,3,0,0,2,4,1,0(Antislash)r')#MMS Lent
phone.write(b'AT+CMMSSENDCFG=1,1,0,0,2,4,2,0(Antislash)r') #MMS Rapide
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=3,1,(Antislash)"CONTYPE(Antislash)",(Antislash)"GPRS(Antislash)"(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=3,1,(Antislash)"APN(Antislash)",(Antislash)"mmsdebitel(Antislash)"(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=1,1(Antislash)r')
time.sleep(2)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+SAPBR=2,1(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSEDIT=0(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSEDIT=1(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

ATcmd = 'AT+CMMSDOWN=(Antislash)"PIC(Antislash)",'+ str(poids.st_size) +',350000,(Antislash)"image1.jpg(Antislash)"(Antislash)r'
phone.write(ATcmd.encode())

time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

photo = open ("/home/pi/Documents/SIM800/Clients/image1.jpg", "rb") #image à envoyer

OctetImage = photo.read(1)
while OctetImage :

phone.write(OctetImage)
OctetImage = photo.read(1)


time.sleep(3)

ATcmd = 'AT+CMMSDOWN=(Antislash)"TITLE(Antislash)",18,10000(Antislash)r'
phone.write(ATcmd.encode()) #Notre titre fait 18 caractères
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)
phone.write(b'Nouveau Bras Robot')
time.sleep(1)

ATcmd = 'AT+CMMSDOWN=(Antislash)"TEXT(Antislash)",'+ str(poids2.st_size) +',20000,(Antislash)"message1(Antislash)"(Antislash)r'
phone.write(ATcmd.encode())
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

message = open ("/home/pi/Documents/SIM800/Clients/message1", "rb") #Message à envoyer

OctetMessage2 = message.read(1)
while OctetMessage2 :

phone.write(OctetMessage2)
OctetMessage2 = message.read(1)


time.sleep(3)
#numero du destinataire
dest = 'AT+CMMSRECP=(Antislash)"'+row['telephone']+'(Antislash)"(Antislash)r'
phone.write(dest.encode())
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSVIEW(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)


phone.write(b'AT+CMMSSEND(Antislash)r')
time.sleep(10)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSEDIT=0(Antislash)r')
time.sleep(1)
rep = phone.read(phone.inWaiting())
print(rep)

phone.write(b'AT+CMMSTERM(Antislash)r')
time.sleep(1)

photo.close()
time.sleep(10)

ASSISTANCE:

Pour toutes questions ou remarques relatives à ce post, n'hésitez pas à nous écrire à projet@eagle-robotics.com sans oublier les flatteries habituelles et sans lésiner sur les  superlatifs bien entendu ("Oh Illustre Maître de la Robotique...etc etc...) sinon votre requête ne sera pas traitée...Maintenant à vous de voir si je plaisante... ou pas!