IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Erreur de curseur (MySQLi avec Serveur TCP - GPIO - Liaison Série)


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 18
    Par défaut Erreur de curseur (MySQLi avec Serveur TCP - GPIO - Liaison Série)
    Bonjour à tous,

    Je suis en charge de la mise en place d'un garage à vélo sécurisé. M'étant déjà référé au forum pour un problème d'indentation, je recopie ma synthèse du système :

    - Une raspberry avec lecteur NFC s'occupe de l'identification des badges, en Python, aucun problème de ce côté
    - Cette dernière va envoyer l'identifiant de la personne en question à une autre Raspberry (via socket TCP) lorsqu'un utilisateur présente son badge.
    - Cette deuxième Raspberry va dans un premier temps ouvrir la gâche de la porte (GPIO) puis la gâche du casier de l'utilisateur (toujours GPIO)
    - Ensuite, elle va piocher dans une base MySQL le prénom et le solde de l'utilisateur, et les balance à un afficheur LED fait maison en Série (USB vers un NodeMCU)

    Voici l'erreur en question :
    Nom : 2019-06-03_15-31-12_vncviewer.png
Affichages : 130
Taille : 161,4 Ko

    Ainsi que mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    import time
    import MySQLdb
    import sys
    import serial
    serial = serial.Serial('/dev/ttyUSB0', 115200)
     
    paramMysql = {
    'host'   : '172.17.18.42',
    'user'   : 'raspberryGachesAfficheur',
    'passwd' : 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
    'db'     : 'velo'
    }
     
    gache = [17,27,22,0,0,0,0,0,0,0,0,0]
     
    def ouvrirGache(numGache):
        print "called OuvrirGache"
        if (numGache > 0): ouvrirGache(0)
        GPIO.output(gache[numGache],True)
        time.sleep(2)
        GPIO.output(gache[numGache],False)
     
     
    host = ''        # Toutes les interfaces réseau
    port = 15555     # Port
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))
     
    GPIO.setmode(GPIO.BCM)
     
    for i in range(0,12):
      GPIO.setup(gache[i],GPIO.OUT) # Gaches
     
    GPIO.setup(12,GPIO.OUT)         # Eclairage
     
    GPIO.setup(16,GPIO.IN)          # Intrusion
     
     
    print host , port
     
    while True:
     
        s.listen(1)
        conn, addr = s.accept()
        print('Connected by', addr)
     
        while True:
     
            received_idcasier = conn.recv(1024)
     
            if not received_idcasier: break
     
            if (int(received_idcasier) < 42):
     
                received_idcasier = int(received_idcasier)
     
                ouvrirGache(received_idcasier)
     
                connexion = MySQLdb.connect(**paramMysql)
                cursor = conn.cursor(MySQLdb.cursors.DictCursor)
                requete_sql = """SELECT prenom, soldepoints FROM Cyclistes WHERE idcasier = %s"""
                cursor.execute(requete_sql, (received_idcasier, ))
                rows = cursor.fetchall()
                for row in rows:
                    prenom = row['prenom']
                    soldepoints = row['soldepoints']
                    print(prenom)
                    print(soldepoints)
                    string = "Bienvenue "+prenom+"  Bravo tu as "+str(soldepoints)+" points."
                    string_encode = string.encode()
                    serial.write(string_encode)
    Nota Bene : Les avertissements liés aux GPIO ne posent pas de problèmes, ils sont dûs à l'arrêt du script sans "clean" des GPIO utilisés, cela n'empêche pas le bon fonctionnement du reste du script

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connexion = MySQLdb.connect(**paramMysql)
    cursor = conn.cursor(MySQLdb.cursors.DictCursor)
    Ca ne devrait pas être connexion au lieu de conn ? conn étant le retour de accept(), c'est un socket.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 18
    Par défaut
    Salut Bktero,
    En effet c'était cela qui bloquait, merci à toi

    J'ai rajouté une gestion des exceptions et la fermeture de la connexion à la fin (ce qui faisait également planter le script)

    Le code suivant vient remplacer tout ce qu'il y avait après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ouvrirGache(received_idcasier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
                try:
     
                    conn = MySQLdb.connect(**paramMysql)
                    cursor = conn.cursor(MySQLdb.cursors.DictCursor)
                    requete_sql = """SELECT prenom, soldepoints FROM Cyclistes WHERE idcasier = %s"""
                    cursor.execute(requete_sql, (received_idcasier, ))
                    rows = cursor.fetchall()
                    for row in rows:
                        prenom = row['prenom']
                        soldepoints = row['soldepoints']
                        print(prenom)
                        print(soldepoints)
                        string = "Bienvenue "+prenom+"  Bravo tu as "+str(soldepoints)+" points."
                        string_encode = string.encode()
                        serial.write(string_encode)
     
                except Error as e :
                    print ("Error while connecting to MySQL", e)
                finally:
                    #closing database connection.
                    if(conn.is_connected()):
                        conn.close()
                        print("MySQL connection is closed")
    Les données sont correctement récupérées dans la base et envoyées via série mais seulement une fois, ensuite le script plante. Voici l'erreur :
    Nom : 2019-06-03_19-02-29_explorer.png
Affichages : 106
Taille : 457,0 Ko
    Une idée ?
    Images attachées Images attachées  

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Peut-être ouvrir ses yeux ?

    Ce sont des erreurs similaires : tu dois te tromper de variable ou te tromper de type pour cette variable.

    http://mysql-python.sourceforge.net/...ection-objects --> effectivement un objet Connection n'a pas de telles méthodes : pourquoi tentes-tu de les appeler ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 18
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Peut-être ouvrir ses yeux ?

    Ce sont des erreurs similaires : tu dois te tromper de variable ou te tromper de type pour cette variable.

    http://mysql-python.sourceforge.net/...ection-objects --> effectivement un objet Connection n'a pas de telles méthodes : pourquoi tentes-tu de les appeler ?
    Ayant par le passé utilisé MySQLi, j'ai utilisé la doc de ce dernier au lieu de MySQLdb. J'ai mis à jour le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    conn = MySQLdb.connect(**paramMysql)
                cursor = conn.cursor(MySQLdb.cursors.DictCursor)
                requete_sql = """SELECT prenom, soldepoints FROM Cyclistes WHERE idcasier = %s"""
     
                cursor.execute(requete_sql, (received_idcasier, ))
                rows = cursor.fetchall()
                for row in rows:
                    prenom = row['prenom']
                    soldepoints = row['soldepoints']
                    print(prenom)
                    print(soldepoints)
                conn.close()
     
                string = "Bienvenue "+prenom+"  Bravo tu as "+str(soldepoints)+" points."
                string_encode = string.encode()
                serial.write(string_encode)
    conn.close() permet de fermer la connexion comme je le voulais mais une erreur subsiste, laquelle était déjà présente avant que je ne rajoute les mauvais objets (notamment sur la capture malencontreusement jointe à mon post précédent), la voici :
    Nom : 2019-06-03_19-51-46_explorer.png
Affichages : 136
Taille : 494,0 Ko

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par Waryard Voir le message
    conn.close() permet de fermer la connexion comme je le voulais mais une erreur subsiste, laquelle était déjà présente avant que je ne rajoute les mauvais objets (notamment sur la capture malencontreusement jointe à mon post précédent)
    Si vous avez un socket et une connexion à la base de données, normal d'avoir 2 variables différentes pour y stocker les objets correspondants.

    Un peu de pratique de la programmation est un bon apprentissage pour faire attention et ne pas se mélanger les pinceaux lorsqu'on utilise chacune de ces variables et éviter de les écraser tant qu'on en a besoin.

    Apprenez à lire le message d'erreur, il vous donne la ligne de code en défaut. Relisez votre code autour de cette ligne pour essayer de comprendre le pourquoi de l'erreur. note: si cela vous paraît trop compliqué, ouvrez un tuto. et apprenez à programmer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Problème d'indentation (Serveur TCP - GPIO - MySQLi - Tx Série)
    Par Waryard dans le forum Général Python
    Réponses: 6
    Dernier message: 31/05/2019, 21h43
  2. Réponses: 4
    Dernier message: 20/05/2019, 16h54
  3. Réponses: 4
    Dernier message: 20/04/2009, 19h49
  4. Erreur 530 avec serveur ftp (pure-ftpd & proftpd)
    Par Arnard dans le forum Debian
    Réponses: 3
    Dernier message: 18/03/2007, 18h18
  5. Réponses: 1
    Dernier message: 11/05/2006, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo