ça fait un moment que j’ai écrit ce programme donc il fonctionne en python 2.7
à noter que le fichier envoyer ( une image) fait 6783 octets.
comme je n’ai fais que des tests, le programme ,n’est pas paramétrable ( il est fait pour free - notion d’APN à changer suivant ton opérateur )
le fichier envoyé est:/home/pi/Documents/python_gsm/camille1.jpg
le numéro appelé est +33NNNNNNN
le fichier envoyé est celui là ( si tu utilises un autres il faudra changer la taille ds la ligne:
["AT+CMMSDOWN=\"PIC\",6753,30000,\"camille1.jpg\"\r","","nop"]
![camille1](https://forum.raspberry-pi.fr/uploads/default/original/2X/0/0e592c474c93b72fe317d63970de50fa7769cd2e.jpeg)
et le programme qui tue ![:wink: :wink:](https://forum.raspberry-pi.fr/images/emoji/twitter/wink.png?v=12)
#!/usr/bin/python
# -*- coding: utf-8 -*-
import serial
import time
import os
from threading import Thread, RLock
verrou = RLock()
_global_variable = {
'value': "",
}
_global_commande = {
'value': [],
'retour': [],
'action': [],
'iter': 0,
'flag': True,
'fin': False,
}
class entree(Thread):
"""Thread chargé d envoyer la commande """
def __init__(self, ser):
Thread.__init__(self)
self.ser = ser
def run(self):
""" code execute """
print "thread entree\n"
while _global_commande['fin'] == False:
time.sleep(2)
with verrou:
if _global_commande['flag'] == True:
if len(_global_commande['value']) > _global_commande['iter']:
_global_variable['value'] = ""
if _global_commande['value'][_global_commande['iter']][0:2] == "AT":
ser.write(_global_commande['value'][_global_commande['iter']])
time.sleep(3)
else:
exec(_global_commande['value'][_global_commande['iter']])
_global_commande['iter'] += 1
_global_commande['flag'] = False
else:
_global_commande['fin'] = True
_global_commande['flag'] = True
class sortie(Thread):
"""Thread chargé de lire la reponse du HAT """
def __init__(self, ser):
Thread.__init__(self)
self.ser = ser
def run(self):
print "thread sortie\n"
while _global_commande['fin'] == False:
# with verrou:
while _global_commande['flag'] == False:
while "OK" not in _global_variable['value'] and "ERROR" not in _global_variable['value'] and _global_commande['retour'][_global_commande['iter']-1] not in _global_variable['value']:
while ser.inWaiting()>0:
_global_variable['value'] = _global_variable['value'] + ser.readline(None)
if _global_commande['action'][_global_commande['iter']-1] != "nop" and _global_commande['retour'][_global_commande['iter']-1] in _global_variable['value']:
_global_commande['value'].insert(_global_commande['iter'],_global_commande['action'][_global_commande['iter']-1])
_global_commande['retour'].insert(_global_commande['iter'],"nop")
_global_commande['action'].insert(_global_commande['iter'],"nop")
if "ERROR" in _global_variable['value']:
_global_commande['fin'] = True
print " erreur on arrete !!!\n"
# _global_commande['flag'] = False
_global_commande['flag'] = True
print "T2 : \n" + _global_variable['value'] + "\n"
#fonction test retour
def test(cherche, res):
message = ""
retour = False
if "OK" in res:
ok =True
if cherche in res:
retour = True
else:
retour = False
message = cherche + " n'est pas dans la réponse"
# print message
else:
ok = False
message = "commande en erreur"
return ok,retour,message
# ouverture connection
ser = serial.Serial("/dev/ttyS0", 9600, timeout=5)
# variables fichier joint
"""
type_fichier = "TEXT"
nom_fichier = "/home/pi/Documents/python_gsm/test1.txt"
if exists(nom_fichier):
taille_fichier = os.path.getsize(nom_fichier)
print "la taille du fichier ", nom_fichier," est de ",taille_fichier,"."
else:
print "le fichier ",nom_fichier," n'existe pas !!!"
exit(5)
"""
type_fichier = "PIC"
nom_fichier = "/home/pi/Documents/python_gsm/camille1.jpg"
if os.path.isfile(nom_fichier):
taille_fichier = os.path.getsize(nom_fichier)
print "la taille du fichier ", nom_fichier," est de ",taille_fichier,"."
else:
print "le fichier ",nom_fichier," n'existe pas !!!"
exit(5)
# chargement plusieurs commandes
#liste = [
#["AT+CGATT?\r","nop","nop"],
#["print \"python\"\nser.write(AT\r)","nop","nop"], apres le code python on attend "OK" dans la reponse du modem grace a la commande AT envoyée au modem
#["AT+CGACT?\r","+CGACT 1,0","AT+CGACT=1,1\r"], permet apres un test sur le code retout d executer une action (si "+CGACT 1,0" est ds la reponse on execute "AT+CGACT=1,1\r"
#["AT\r","nop","nop"], on execute la commande "AT" sans code retout special ni action conditionnée
#["ser.write(\"AT+CMMSDOWN=\"TEXT\",65,30000,\"text1.txt\"\r\")\ntime.sleep(2)\nf = open(\"/home/pi/Documents/text1.txt\",\"r\")\ntout = \"\"\nwhile True:\n bytes = f.read(1)\n if bytes == \"\":\n break;\n tout = tout + bytes\nf.close()\nser.write(tout\r)" on execute AT+CMMSDOWN on attend connect et on insert puis on execute action le ser.write envoi le fichier lu au modem
# a etoffer avec type de fichier, taille, timeout et nom du fichier en variable
#]
#format :
# commande AT ou python a executer
# code retour attendu
# action qui devient la commande suivante si code retour trouvé ds la reponse de la commande
# un code retour et une action entraine donc la creation d une commande suivant la commande en cours si code ds la reponse de la commande
# un code retour avec une action a "nop" permet juste a la commande de stopper avec un code different de "OK" ou "ERROR" ( CONNECT par exemple)
# les commande commençant par AT sont envoyées au modem, les autres (code python) sont executées par exec(<commande>)
#["AT+CMMSTERM\r","nop","nop"],
#["AT+CMMSINIT\r","nop","nop"],
liste=[
["AT+CGATT?\r","+CGATT: 0","AT+CGATT=1\r"],
["AT+CGDATA=?\r","nop","nop"],
["AT+CMMSSCONT?\r","nop","nop"],
["AT+CGDCONT?\r","nop","nop"],
["AT+CGACT?\r","+CGACT: 1,0","AT+CGACT=1,1\r"],
["AT+CMMSINIT\r","nop","nop"],
["AT+SAPBR=3,1,\"APN\",\"mmsfree\"\r","nop","nop"],
["AT+SAPBR=1,1\r","nop","nop"],
["AT+CMMSEDIT?\r","+CMMSEDIT: 0","AT+CMMSEDIT=1\r"],
["AT+CMMSDOWN=\"PIC\",6753,30000,\"camille1.jpg\"\r","","nop"],
["f = open(\"/home/pi/Documents/python_gsm/camille1.jpg\",\"r\")\ntout = \"\"\nwhile True:\n bytes = f.read(1)\n if bytes == \"\":\n break;\n tout = tout + bytes\nf.close()\nser.write(tout\r)\ntime.sleep(3)","nop","nop"],
["AT+CMMSRECP=\"+33NNNNNNN\"\r","nop","nop"],
["AT+CMMSVIEW\r","nop","nop"],
["AT+CMMSSEND\r","nop","time.sleep(5)"],
["AT+CMMSEDIT=0\r","nop","nop"],
["AT+CMMSTERM\r","nop","nop"],
]
for enreg in liste:
# print enreg[0:1]
commande = enreg[0:1]
res = commande[0]
_global_commande['value'].append(res)
retour = enreg[1:2]
res = retour[0]
_global_commande['retour'].append(res)
action = enreg[2:3]
res = action[0]
_global_commande['action'].append(res)
#print _global_commande
thread_2 = sortie(ser)
thread_1 = entree(ser)
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()
#fermeture connection
ser.close()
enfin un truc dont je me souvient plus c’est le resultat de la commande AT+CMMSSCONT? qui donne notamment un profile ( chez moi ;+CMMSPROFILE: « http://wap.huawei.com/uaprof/HuaweiU1250v100GPRS.xml » )
j’avais du trouvé ça là : http://validator.openmobilealliance.org/cgi/validation/profiles.html
je me souviens plus si c’est utile ou non de définir un tel profile ![:roll_eyes: :roll_eyes:](https://forum.raspberry-pi.fr/images/emoji/twitter/roll_eyes.png?v=12)
bien sur il faut avant d’exécuter ne pas démarrer gammu et envoyer le code pin pour connecter le réseau.
have fun ![:wink: :wink:](https://forum.raspberry-pi.fr/images/emoji/twitter/wink.png?v=12)