PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV Mobile (versões anteriores) → [WD mobile 17] Image par Socket
[WD mobile 17] Image par Socket
Iniciado por NicoSab, abr., 23 2014 3:48 PM - 4 respostas
Publicado em abril, 23 2014 - 3:48 PM
Bonjour à tous,

Avant d'écrire se pots, j'ai bien entendu cherché de mon coté et écumé les forums à la recherche de solutions.
Pour envoyer une image par socket certains disent d'utiliser , fChargeTexte, fChargeBuffer, de la crypter...et autres.
Malheureusement aucune de ses solutions ne fonctionne.
Je me suis penché sur cette idée : http://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/101547-wd12-socket-donnees/read.awp
Mon programme lance l'API de windows pour la prise de photo sur un terminal mobile. Après que le photo soit prise je souhaite la transferer sur le serveur via les sockets.
Ce qui me donne :
//Lancement de l'API de photo pour les diagnostiques
//chemin de l'image
chImage est une chaîne //Chemin et nom de la photo prise
idfile est un entier //résultat de l'ouverture de l'image
BuffFile est un Buffer
//Déclaration des variables
chErreur est une chaîne //contient l'erreur


//On appel la procedure de prise de photo
CameraDiagnostique.sNomPhoto = SansEspace(gstrInfoVhl:ImmatCarteGrise)+"_"+DateSys()+"_"+HeureSys()
chImage = PhotoPlaque(CameraDiagnostique,chErreur) //chemin de la photo sur le terminal
//en cas d'erreur ont n'affiche pas la photo
SI chErreur<>"" ALORS
Erreur(chErreur)
RETOUR
SINON
//Ouverture de la photo
idfile = fOuvre(chImage)
SI idfile <> -1 ALORS
Info(idfile) //=2
//On envoie les packets de l'image tous les 100 octets
TANTQUE PAS fPositionne(idfile, 0, fpCourant) <> fpFin
Info("3 -"+fPositionne(idfile, 0, fpCourant))
BuffFile = fLit(idfile, 100)
EnvoiMessage(cstPHOTO,gstrInfoVhl:NumDossier+TAB+BuffFile[[ A Taille(BuffFile)]],0)//SocketEcrit
FIN
fFerme(idfile)
SINON
Info("erreur ouverture Photo")
FIN
//Fin de l'envoie
EnvoiMessage(cstPHOTO,"FIN",0)
//Affichage de l'image dans le champ image
cimgVisualisation = chImage
geIndice = 1
//on passe au deuxieme plan pour visualiser la photo
FEN_PhotoDiagnostique..Plan = 2
FIN


CAS EXCEPTION:
ExceptionActive()
Erreur(ExceptionInfo(errMessage))


Malheureusement je ne passe jamais dans le TANTQUE PAS. Il ne doit pas aimer ouvrir l'image même si il l'ouvre bien.
Mes envois de socket sont géré par la procédure "EnvoiMessage" et son bien lues. (DEBUT et FIN)
Auriez-vous une idée ?
Membro registado
946 mensagems
Popularité : +102 (110 votes)
Publicado em abril, 23 2014 - 4:08 PM
Bonjour
avant de transferer l'image par socket je l'encode en base64 (inconvéniant +30% en taille)
Publicado em abril, 23 2014 - 4:52 PM
Bonjour,

Merci pour ta réponse, je vais essayer ta solution et je te tiens au courant.
Sinon tu utilises la même méthode que moi ?

Cordialement,
NicoSab
Publicado em abril, 24 2014 - 10:12 AM
Bonjour,

j'ai utilisé la fonction Crypte avec encodeBASE64 mais mon image n'est toujours pas reçu correctement.

Coté client mobile :
//Lancement de l'API de photo pour les photos
//chemin de l'image
chImage est une chaîne //Chemin et nom de la photo prise
bufImageCrypteest un Buffer//une chaine //chaine de l'image a envoyer par socket
CrypteImage est une chaîne
idfile est un entier //résultat de l'ouverture de l'image
BuffFile est un Buffer
//Déclaration des variables
chErreur est une chaîne //contient l'erreur


//On appel la procedure de prise de photo
CameraDiagnostique.sNomPhoto = SansEspace(gstrInfoVhl:ImmatCarteGrise)+"_"+DateSys()+"_"+HeureSys()
chImage = PhotoPlaque(CameraDiagnostique,chErreur)
//en cas d'erreur ont n'affiche pas la photo
SI chErreur<>"" ALORS
Erreur(chErreur)
RETOUR
SINON
//Affichage de l'image dans le champ image
cimgVisualisation = chImage
geIndice = 1
//bufGsImage = dSauveImageJPEG(chImage,enMémoire)
//envoie de l'image par socket
// Envoi du message "de debut
EnvoiMessage(cstPHOTO,"DEBUT"+TAB+gstrInfoVhl:NumDossier+TAB+chImage,0)//chImageCrypte+TAB+

//Pause entre chaque envoie
Multitâche(100)

//cryptage en mode64
BuffFile = fChargeTexte(chImage)
BuffFile = Crypte(BuffFile,"",encodeBASE64)
//envoie de l'image cryptée
EnvoiMessage(cstPHOTO,BuffFile,0)

//pause
Multitâche(100)
//Fin de l'envoie
EnvoiMessage(cstPHOTO,"FIN",0)

//on passe au deuxieme plan pour visualiser la photo
FEN_PhotoDiagnostique..Plan = 2
FIN


CAS EXCEPTION:
ExceptionActive()
Erreur(ExceptionInfo(errMessage))


Puis coté serveur :
CAS gchPHOTO
//Message a afficher dans le journal
InfoJournalEvenements("Ajout PHOTO Dossier : "+ExtraitChaîne(SansEspace(sMessage),7)+" - "+ExtraitChaîne(SansEspace(sMessage),8)+" - "+ExtraitChaîne(SansEspace(sMessage),9))
//debut de l'envoie de la Photo
SI ExtraitChaîne(SansEspace(sMessage),7) = "DEBUT" ALORS
InfoJournalEvenements("DEBUT")
sCheminPhotoPoste = ComplèteRep("D:\WINSUR\PHOTO\"+ExtraitChaîne(SansEspace(sMessage),8))
sCheminPhotoTSP = ExtraitChaîne(SansEspace(sMessage),9)
bufBufferPhoto = "vide"
NomPhotoTSP = ExtraitChaîne(sCheminPhotoTSP,rangDernier,"\")
InfoJournalEvenements(sCheminPhotoPoste)
sCheminPhotoTSP = sCheminPhotoPoste+["\"]+NomPhotoTSP
InfoJournalEvenements(NomPhotoTSP)
InfoJournalEvenements(sCheminPhotoTSP)
//Création du répertoire de photo du dossier si il n'existe pas
SI PAS fRépertoireExiste(sCheminPhotoPoste) ALORS
fRepCrée(sCheminPhotoPoste)
FIN
SINON
//Packets de la photo
SI ExtraitChaîne(SansEspace(sMessage),7) <> "FIN" ALORS
//bufBufferPhoto += ExtraitChaîne(SansEspace(sMessage),7)
bufBufferPhoto = ExtraitChaîne(SansEspace(sMessage),7)
bufBufferPhoto = Décrypte(bufBufferPhoto,"",encodeBASE64)
SIfSauveBuffer(sCheminPhotoPoste,bufBufferPhoto) ALORS
InfoJournalEvenements("Echec sauveBuffer")
SINON
InfoJournalEvenements("Buff "+bufBufferPhoto)
FIN
//Fin des packets de la photo
SINON
//On ajoute la photo dans son répertoire
InfoJournalEvenements("FIN : "+ComplèteRep(sCheminPhotoPoste+NomPhotoTSP)+" - ")
FIN
FIN


Au debut ma chaine est du style : YMBhKh7Kirg+lUP+SnQZSrrvWLezJ4.... et après fSauveBuffer : ÿ.

Je vous avoue que là je suis perdu...
En tout cas merci pour votre attention et vos réponses.
Publicado em julho, 30 2014 - 10:38 PM
Bonjour NicoSab,

Comme toi, j'ai tourné pendant près de 4 mois pour l'envoie d'images depuis un terminal mobile.
J'ai pas essayé avec les socket, mais j'ai fait de tout .... envoi en http Post , cryptage , compression , codage etc.
Les solutions n'étaient jamais fiables ... car l'échec ou la reussite variait selon la memoire du telephone de test.

Ma solution actuelle est :) : L'envoi par FTP .
L'avantage est aussi la possibilité de créer des repertoires de destination.
La communication est directe et l'envoi est sans echec tant que tu as internet.
Meme les Images HD sont envoyées sans pb. mais la durée de transfert en prend un coup.

Cette solution, je l'ai pensée sur un coup de tête dans un état de desespoir.

En esperant être utile pour toi.
Cdlt.