Aide boucle/socket

a marqué ce sujet comme résolu.

Bonjour,

Est ce que quelqu’un pourrait m’arranger le code s'il vous plait, pour que, quand je lance le programme cela écrit les donnée reçu et quand un client se connecte sur le serveur, la partie du programme qui écrit dans le fichier texte s'arrête et passe à la suite du programme, transmission etc …

Voici le programme complet :

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/python
# -*- coding: utf-8 -*-

import serial
import time
import socket
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
boucle=1
boucle2=1
Principal=1
c=0
ser = serial.Serial('/dev/ttyAMA0', baudrate=1200, timeout=0.1,bytesize=7)


def receive():
    while True:
        try:
            time.sleep(0.01)
            state = ser.readline()
            return state
        except:
            pass
        time.sleep(0.1)

while True:

    while boucle==1:
        boucle2=1
        #LED rouge
        GPIO.output(11,True)
        GPIO.output(16,False)

        #Initialisation du serveur
        ConnexionPrincipale=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ConnexionPrincipale.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        ConnexionPrincipale.bind(('', 20000))
        ConnexionPrincipale.listen(5)
        print("Le serveur écoute à présent sur le port 20000")
        print("Attente d'un client ... ")
        print("")

        #Quand le client se connecte
        ConnexionClient, InfosConnexion = ConnexionPrincipale.accept()
        MessageRecu = "Client connectee"
        print(MessageRecu)
        print("")
        c=1

        #Ecriture des données
        while Principal==1:
                if c!=0:
                    #print("lol")
                    Principal=0
                    break       
                m = open('dataFile.txt','a')
                PI = open('PI.txt','a')
                puissance=0
                COMPTEUR = receive()  
                m.write(COMPTEUR)
                m.close()
                m = open('DataFile.txt','a')
                fichier = open('DataFile.txt', 'r')
                for ligne in fichier:
                    if "APAA" in ligne:
                        donnee=ligne.split(" ")
                        if abs(int(donnee[1])-puissance) <40:
                            puissance=int( donnee[1])
                            print(donnee[1])
                            PI.write(puissance)

        #LED verte
        GPIO.output(11,False)
        GPIO.output(16,True) 

        #Boucle message
        while boucle2 == 1:
            MessageRecu = ConnexionClient.recv(1024)

            #Puissance instantanée
            if MessageRecu.startswith(b'PI'):
                g = open("PI.txt", "r")
                print("")
                print("Demande...")
                while 1:
                    data=g.readline()
                    if not data:
                        break
                    print (data)
                    ConnexionClient.send(data)
                    print("Message envoyée")

            #Consommation éléctrique
            if MessageRecu.startswith(b'CE'):
                g = open("CE.txt", "r")
                print("")
                print("Demande...")
                while 1:
                    data=g.readline()
                    if not data:
                        break
                    print (data)
                    ConnexionClient.send(data)
                    print("Message envoyée")

            #Reinitialisation    
            if MessageRecu.startswith(b'Fin'):
                boucle2 = 0     
                print("Fermeture de la connexion")
                ConnexionClient.close()

    #Les 2 LEDS éteintes
    GPIO.output(11,False)
    GPIO.output(16,False)

Le programme est un assemblage de 2 programmes. le 1er sert a récupérer les données d'une borne EDF et d'écrire dans un fichier texte les donnée voulue qui est hébergée par une raspberry

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/python
# -*- coding: utf-8 -*-
import serial, time
ser = serial.Serial('/dev/ttyAMA0', baudrate=1200, timeout=0.1,bytesize=7)

def receive():
    while True:
        try:
            time.sleep(0.01)
            state = ser.readline()
            #print state
            return state
        except:
            pass
        time.sleep(0.1)

f = open('dataFile.txt','a')
PI = open('PI.txt', 'a')
puissance=0

while 1 :
    COMPTEUR = receive()  
    f.write(COMPTEUR)
    f.close()
    f = open('DataFile.txt','a')
    fichier = open('DataFile.txt', 'r')
    for ligne in fichier:
        if "APAA" in ligne:
            donnee=ligne.split(" ")
            if abs(int(donnee[1])-puissance) <40:
                puissance=int( donnee[1])
                print(donnee[1])
                PI.write(puissance)

Le 2ème programme sert a la liaison entre la raspberry et le client (une tablette Android). Il va lire les fichiers textes du premier programme et envoie les donnée a la tablette.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# -*- coding: utf-8 -*-
import socket
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
boucle=1

while True:

    boucle=1
    #LED rouge
    GPIO.output(11,True)
    GPIO.output(16,False)

    #Initialisation du serveur
    ConnexionPrincipale=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ConnexionPrincipale.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    ConnexionPrincipale.bind(('', 20000))
    ConnexionPrincipale.listen(5)
    print("Le serveur écoute à présent sur le port 20000")
    print("Attente d'un client ... ")
    print("")

    #Quand le client est connectée
    ConnexionClient, InfosConnexion = ConnexionPrincipale.accept()
    MessageRecu = "Client connectee"
    print(MessageRecu)
    print("")

    #LED verte
    GPIO.output(11,False)
    GPIO.output(16,True) 

    #Boucle message
    while boucle == 1:
        MessageRecu = ConnexionClient.recv(1024)

        #Puissance instantanée
        if MessageRecu.startswith(b'PI'):
            f = open("PI.txt", "r")
            print("")
            print("Demande...")
            while 1:
                data=f.readline()
                if not data:
                    break
                print (data)
                ConnexionClient.send(data)
                print("Message envoyée")

        #Consommation éléctrique
        if MessageRecu.startswith(b'CE'):
            f = open("CE.txt", "r")
            print("")
            print("Demande...")
            while 1:
                data=f.readline()
                if not data:
                    break
                print (data)
                ConnexionClient.send(data)
            print("Message envoyée")

        #Reinitialisation    
        if MessageRecu.startswith(b'Fin'):
            boucle = 0     
            print("Fermeture de la connexion")
            ConnexionClient.close()

#Les 2 LEDS éteintes
GPIO.output(11,False)
GPIO.output(16,False)

J'ai donc essayer de les assemblée mais je n'y arrive pas trop :/ Il faut que les 2 programme marche en 1 programme.

Plusieurs questions :

  • Pourquoi passes-tu par un fichier pour transférer les données de la borne à la tablette ?
  • Pourquoi veux-tu rassembler les programmes puisque les données sont accessibles depuis le fichier ?
+0 -0

Tout simplement que c'est a la base un projet scolaire et que chacun a sa partie a faire, moi je m'occupe de la liaison et mon amie de récupérer les donnees de la borne. On ne peut pas lancer les 2 programmes sur la raspberry donc il faut qu'on assemble nos 2 programmes.

Tu pourrais remplacer les lignes 23 et 24 (au passage, je ne comprends pas l'intérêt de cette dernière) du premier programme du second message (l'écriture dans le fichier) par le bout de code transmettant les informations à la tablette. Tu aurais un truc du genre :

1
2
3
4
Initialisation du serveur
Connexion du client
    Reception d'une information de la borne EDF
    Transmission de cette information au client
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte