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

WinDev Discussion :

lecteur ACR122USB et unique id d'une carte [WD22]


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2019
    Messages : 81
    Points : 91
    Points
    91
    Par défaut lecteur ACR122USB et unique id d'une carte
    Bonjour a tous,

    grâce a des contributions précédentes j'ai réussi à lire une partie de l'identifiant unique d'une carte NFC,
    par exemple 04 84 70 8A alors sursous windev mobile je lis l intégralité par exemple pour le meme badge : 04 84 70 8A03 3E 80

    mle code que j'utilise est le suivant :

    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
    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
     
    PROCEDURE GetUIDMifare1K()
    //Lecture UID badge Mifare 1K
    nCodeRes est un entier
    hContext is a int
    hCard is a int
     
    hDLL is a int
     
    bufKeyA is a Buffer  = 0x60
    bufKeyB is a Buffer  = 0x61
     
    mszReaders is a Buffer on 255 bytes
    ReaderList is a string
    CardReaderName is a string
     
    mszGroups is a int = 0
    pcchReaders is a int = 255
    NullSeparator is a Buffer = 0x00
     
    dwShareMode is a int = 0x01 //connect to the card in exclusive mode (no other connection allowed)
    dwPreferredProtocols is a int = 0x0002 // Protocole T1
    pdwActiveProtocol is a int 
    szReader is a string
     
    pioSendPci is a int = 0
    pbSendBuffer is a Buffer = 0x040000caff
     
    cbSendLength is a int = 5
    pioRecvPci is a int = 0
    pbRecvBuffer is a Buffer on 32 bytes
    pcbRecvLength  is a int = 32
    RecvBuffer is a string
     
    dwDisposition is a int = 0x0000 //Leave
     
     
    //Etablissement contexte Winscard
    hDLL = LoadDLL("WinSCard.dll")
    SELON Vrai
    	CAS API("WinSCard.dll","SCardEstablishContext",2,Null,Null,&hContext) = 0 //Contexte établi
    		nCodeRes = 1
     
    	AUTRE CAS
    		RENVOYER 1
    FIN
     
    //Selection lecteur NFC
    SI nCodeRes = 1 ALORS //On exécute
    	SELON Vrai
    		CAS API("winscard.dll","SCardListReadersA",hContext,mszGroups,&mszReaders,&pcchReaders) = 0 //Selection lecteur NFC OK
    			ReaderList = mszReaders
    			CardReaderName = ChaîneSupprime(ReaderList,NullSeparator)
    			nCodeRes = 2
     
    		AUTRE CAS
    			RENVOYER 2
    	FIN
    FIN
     
    //Connexion badge NFC
    SI nCodeRes = 2 ALORS //On exécute
    	szReader = CardReaderName
    	SELON Vrai
    		CAS API("winscard.dll","SCardConnectA",hContext,szReader,dwShareMode,dwPreferredProtocols,&hCard,&pdwActiveProtocol) = 0 ET hCard <> 0 //Handle valide créé pour le badge NFC
    			nCodeRes = 3
     
     
    		AUTRE CAS
    			RENVOYER 3
    	FIN
    FIN
     
    //Lecture UID badge
    SI nCodeRes = 3 ALORS //On exécute
    	SELON Vrai
    		CAS API("winscard.dll","SCardTransmit",hCard,pioSendPci,&pbSendBuffer,cbSendLength,pioRecvPci,&pbRecvBuffer,&pcbRecvLength) = 0 ET hCard <> 0
    			FOR i = 1 TO 3
    				RecvBuffer = RecvBuffer + NumériqueVersChaîne(Asc(pbRecvBuffer[[i]]),"02X") + " "
    			END
    			RecvBuffer = RecvBuffer + NumériqueVersChaîne(Asc(pbRecvBuffer[[4]]),"02X")
    		AUTRE CAS
    			RENVOYER 4
    	FIN
    FIN
     
     
     
    //Déconnexion badge NFC
    SI nCodeRes >= 2 ALORS //On exécute
    	SELON Vrai
    		CAS API("winscard.dll","SCardDisconnect",hCard,dwDisposition) = 0 ET hCard <> 0 //Déconnexion badge NFC réussie
     
     
    		AUTRE CAS
     
    	FIN
    FIN
     
     
    //Relache contexte Winscard
    SI nCodeRes >= 1 ALORS //On exécute
    	SELON Vrai
    		CAS API("WinSCard.dll","SCardReleaseContext",hContext) = 0 //Relachement contexte winscard réussi
     
     
    		AUTRE CAS
     
    	FIN
     
    FIN
     
    RENVOYER RecvBuffer

    idées et suggestions bienvenues. Bon WE à toutes et tous

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 207
    Points : 9 208
    Points
    9 208
    Par défaut
    Bonjour,

    Ta demande est un peu légère dans le sens où tu nous donnes ton code et à nous de nous débrouiller...

    Ce que je vois, dans l'exemple que tu donnes, c'est qu'il te manque un bout de la chaine mais tu ne nous dis pas si le buffer est plein. Il faudrait mettre des points d'arrêt et faire du pas à pas pour regarder le contenu des variables.

    Autre point : je n'aime pas ton code car tu utilises des SELON vrai alors que les utilises comme des SI ALORS SINON. Ca perturbe la lecture
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2019
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    Bonjour

    merci frenchsting d avoir pris le paine de jeter un oeil sur mon problème, et je prends en considération tes remarques.

    Alors déjà pour commencer le bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /Lecture UID badge
    SI nCodeRes = 3 ALORS //On exécute
    	SELON Vrai
    		CAS API("winscard.dll","SCardTransmit",hCard,pioSendPci,&pbSendBuffer,cbSendLength,pioRecvPci,&pbRecvBuffer,&pcbRecvLength) = 0 ET hCard <> 0
    			FOR i = 1 TO 3
    				RecvBuffer = RecvBuffer + NumériqueVersChaîne(Asc(pbRecvBuffer[[i]]),"02X") + " "
    			END
    			RecvBuffer = RecvBuffer + NumériqueVersChaîne(Asc(pbRecvBuffer[[4]]),"02X")
    		AUTRE CAS
    			RENVOYER 4
    	FIN
    FIN
    est erroné car il faut faire un FORT i = 1 to pbRecvBuffer

    Cela me remonte davantage de données mais la seconde partie est erronée.

    Voici ce que j'ai lorsque j exécute le code pas a pas :
    Nom : trace1.JPG
Affichages : 552
Taille : 33,5 Ko
    Nom : trace2.JPG
Affichages : 537
Taille : 26,9 Ko
    Nom : trace3.JPG
Affichages : 540
Taille : 28,3 Ko
    cela remonte UDI = "04 A6 AB 8A 90 00 8A"


    alors que l'iD correct est le suivant : 04 A6 AB 8A 03 3E 80

    Merci d'avance
    Images attachées Images attachées   

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 207
    Points : 9 208
    Points
    9 208
    Par défaut
    Bonjour,

    Je ne suis pas sûr qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR i = 1 to pbRecvBuffer
    fonctionne.

    Plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR i = 1 to pbRecvBuffer..taille
    ou qqchose dans ce goût là me paraît plus logique.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2019
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    bonjour,

    en fait la déclaration du buffer définit une taille de 32, cela ne change pas le résultat érroné dont je te faisais part.

    Merci pour ton aide

  6. #6
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 207
    Points : 9 208
    Points
    9 208
    Par défaut
    Ton code peut être "simplifié" en écrivant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FOR i = 1 TO 4
    	RecvBuffer += [ " "] + NumériqueVersChaîne(Asc(pbRecvBuffer[[i]]),"02X")
    END
    Il y a un truc que je ne comprends pas : dans ton code, tu vas lire 4 "éléments" (du numérique / des octets ?) et tu génères ta chaine (= 4 nombres hexa). Tu me dis qu'il te manque des éléments (2 nombres Hexa). Ca me paraît logique vu que tu n'en lis que 4, tu ne peux pas en avoir 6 à l'arrivée.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2019
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    par exemple enfaisant for i=1 to 3, j obtiens
    04 84 7D 8A
    mais en faisant for i *=1 to 32 j'obtiens
    04 84 7D 8A 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8A
    ce qui est faux

    Merci encore pour tes éclairages

  8. #8
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 374
    Points : 629
    Points
    629
    Billets dans le blog
    1
    Par défaut
    Salut tu écris que en windev mobile ton résultat est juste
    Mais je doute que ce soit le même code que pour windev car tu fais appel à une DLL

    En tout cas une piste c'est tes string
    Qui sont par défaut en ANSI sur windev et UNICODE en Windev mobile
    Donc soit tu met ton projet en unicode soit tu précises que tes chaînes le sont
    En effet en unicode c'est 2 fois plus long (en byte)
    A toi de me dire si je suis sur la bonne piste.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2019
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    Bonjour à tous

    a force de chercher j'ai enfin trouvé.

    sur une cart MIFARe CLassic 1K l'uid est composé de 4 Bytes lus sur la page 00 alors que sur les cartes Mifare ultralight l'uid est composé de 8 bytes lus sur la page 00 et sur la page 01. En lisant la page 01 je retrouve ce qui me manque

    merci encore de vous etre penchés sur mon probleme,

    et pour répondre a Frenchsting qui a tout a fait raison je viendrai poster un code plus "propre" qui prend en compte ces deux versions (ca pourra peut être aider quelqu'un)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 25/09/2019, 13h49
  2. Récupérer le MIFARE d'une carte RFID (Lecteur Omnikey)?
    Par Aziraphal dans le forum VBA Access
    Réponses: 3
    Dernier message: 13/08/2015, 14h19
  3. Réponses: 1
    Dernier message: 14/09/2013, 01h33
  4. Code pour lire une carte RFID via un lecteur RFID (connexion USB)
    Par sethgreen dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 20/04/2012, 17h56
  5. Accès au port 700h pour une carte d'interface
    Par haypo dans le forum Matériel
    Réponses: 3
    Dernier message: 07/11/2002, 11h30

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