ç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"]
et le programme qui tue
#!/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
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