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

  1. #1
    Membre régulier
    intégrer lecteur PC/SC (mifare) dans une application
    bonsoir à tous !

    j'ai un petit projet où je souhaite utiliser un lecteur NFC compatible PC/SC afin de seulement lire la le contenu du block 0 de la carte.
    le lecteur est un ACS modèle ACR122U.

    j'ai trouvé des exemples sur le forum de pc-soft, mais qui utilise une vieille version d'une dll (winscard.dll).
    Donc qui n'utilise pas le driver standard PC/SC de windows.

    il existe un composant également, EZACS3, mais semble très compliqué pour ce que je veux faire...

    J'ai le SDK du lecteur, ce qui me permet de savoir quelle commande envoyée au lecteur et ainsi de récupérer la réponse...

    Mais je n'arrive pas à débuter dans le projet !

    Comment intégrer ça dans un projet windev ?
    Comment déclarer mon lecteur ?
    comment intercepter l'évènement d'une carte qui serait posée sur le lecteur ?
    comment envoyer une commande au lecteur (c'est pas une socket, c'est pas un port COM, ...) ?

    si vous avez une piste de départ ? de la doc ?

    merci d'avance !!!

  2. #2
    Membre éprouvé
    Bonjour,

    Si c'est du port COM il va falloir utiliser les commandes sXxx (sOuvre, sEcrit,...)

    Sans plus d'infos c'est tout ce que je peux te donner.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  3. #3
    Membre régulier
    nan il s'agit d'un lecteur USB...

    ça aurait été trop facile sur le port COM

  4. #4
    Membre éprouvé
    que dit le sdk ? Tu as une dll en .net ?
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  5. #5
    Membre régulier
    ben il me donne les différentes fonctions et paramètres, les retours, ...

    mais pas comment l'intégrer dans un projet...

  6. #6
    Membre éprouvé
    dans le sdk il y a une dll. Il faut utiliser API ou AppelDLL32. Il y a un exemple dans l'aide de l'api, ainsi qu'un fichier d'aide en chm..
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  7. #7
    Membre régulier
    j'ai pas mal de doc dans le SDK, ainsi, que des exemples, mais dans d'autres languages, je vais y faire un tour...

  8. #8
    Membre éprouvé
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  9. #9
    Membre régulier
    Ton lien me télécharge un ficher pour linux ou mac...
    Je travaille sous windows

    Il y a un exemple dans l'aide de l'api, ainsi qu'un fichier d'aide en chm..
    en effet, j'ai bien le fichier d'aide .chm...

    mais je trouve pas de dll !!!

  10. #10
    Membre régulier
    on est bien d'accord, je devrais trouver quelque part, une dll et un document qui me dit quelle fonction utiliser pour telle opération, avec toutes les explications qui vont bien ?

    parce que je trouve pas...

    maintenant pour la dll, il se pourrait qu'il utilisent la dll windscard.dll, en standard de windows...

  11. #11
    Membre éprouvé
    Au temps pour moi je n'ai pas copié le bon lien mais en cherchant avec ton moteur de recherche préféré tu aurais trouvé ceci :https://www.acs.com.hk/download-driver-unified/5134/ACS-Unified-LIB-CTAPI-Win-1011-P.zip

    Il y a bien la dll dans le dossier avec le fichier d'aide. Après y'a plus qu'à...
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  12. #12
    Membre régulier
    merci !!

    tu as cherché avec quels mots clé ?

  13. #13
    Membre éprouvé
    ACR122U
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  14. #14
    Membre régulier
    ben on dirait bien que c'est ça !

    merci pour ton aide !!

    je tiens au courant de l'avancement

  15. #15
    Membre régulier
    alors c'est pas mal

    j'ose me permettre de te solliciter encore...

    il y a 3 fonctions : pour l'init, pour envoi de commande et pour le close.

    Après configuration d'un fichier .INI, la fonction Init et Close fonctionne bien.

    Par contre pour le l'envoi de commande, j'ai pas d'erreur d'execution, mais je récupère pas de valeurs.
    Je suis scrupuleusement l'exemple fourni écrit en C...
    Je pense avoir des soucis avec le typage des variables (surtout pour les buffer en hexa).

    voici le bout de 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
    SendBuffer est un  Buffer = HexaVersBuffer("FF00480000") //commande pour recevoir la version du Firmware
    ReceiveBuffer est un Buffer sur 10 = []
     
    LengthSend est un entier = Taille(SendBuffer)
    LenghtReceive est un entier = Taille(SendBuffer)
     
    nCtn est un entier = 1
    bufDad est un Buffer = 1
    bufSad est un Buffer = 2
     
    sRes est une chaîne = ""
     
    sRes = AppelDLL32("ctacs.DLL", "CT_data", nCtn, &bufDad, &bufSad, LengthSend, SendBuffer, &LenghtReceive, ReceiveBuffer)
    ListeInsère(LISTE_SansNom1,sRes)
     
    SI sRes = 0 ALORS
    	POUR i = 1 À Taille(ReceiveBuffer)
    		Trace(BufferVersHexa(ReceiveBuffer[i]))
    	FIN
    FIN


    et j'obtiens une suite de 10 "00"

    si tu as une idée ?

  16. #16
    Membre éprouvé
    Perso je ferais ça:
    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
    SendBuffer est un  Buffer = HexaVersBuffer("FF00480000") //commande pour recevoir la version du Firmware
    ReceiveBuffer est un Buffer sur 10 = []
     
    nLengthSend est un entier sans signe = Taille(SendBuffer)
    nLenghtReceive est un entier sans signe = Taille(SendBuffer)
     
    nCtn est un entier sans signe = 1
    nDad est un entier sans signe sur 1 octet = 1
    nSad est un entier sans signe sur 1 octet = 2
     
    sRes est une chaîne = ""
     
    sRes = AppelDLL32("ctacs.DLL", "CT_data", nCtn, &nDad, &nSad, nLengthSend, SendBuffer, &nLenghtReceive, ReceiveBuffer)
    ListeInsère(LISTE_SansNom1,sRes)
     
    SI sRes = 0 ALORS
    	POUR i = 1 À Taille(ReceiveBuffer)
    		Trace(BufferVersHexa(ReceiveBuffer[i]))
    	FIN
    FIN


    Ensuite je ne sais pas si le buffer est applicable pour un tableau d'entier sans signe sur 1 octet. A voir.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  17. #17
    Membre régulier
    ai essayé, change rien...

    Je continue a essayer de trouver d'autres exemple...

    Je pense qu'on est tout près du but

    dommage de bloquer sur les types....

  18. #18
    Expert éminent
    Bonjour,

    Je m'immisce dans la discussion : concernant les types, as-tu trouvé des exemples en VB6 ?
    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.

    Make it real not fantasy.

  19. #19
    Membre éprouvé
    Le seul exemple est celui-ci et il est c++ à mon avis

    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
    #include <stdio.h>
    #include <ct_api.h>
     
    int main(int argc, char *argv[])
    {
    	char ret;
    	unsigned short ctn;
    	unsigned short pn;
    	unsigned char sad;
    	unsigned char dad;
     
    	// REQUEST ICC
    	unsigned char command[] = { 0x20, 0x12, 0x01, 0x00, 0x00 };
    	unsigned short lenc = sizeof(command);
     
    	unsigned char response[300];
    	unsigned short lenr = sizeof(response);
    	unsigned short i;
     
    	ctn = 1;
    	pn = 1;
     
    	// Initialize card terminal
    	ret = CT_init(ctn, pn);
    	if (ret != OK)
    	{
    		printf("Error: CT_init failed with error %d\n", ret);
    		return 1;
    	}
     
    	sad = 2; // Source = Host
    	dad = 1; // Destination = Card Terminal
     
    	// Send command
    	ret = CT_data(ctn, &dad, &sad, lenc, command, &lenr, response);
    	if (ret != OK)
    		printf("Error: CT_data failed with error %d\n", ret);
    	else
    	{
    		// Display response
    		printf("Response: ");
    		for (i = 0; i < lenr; i++)
    			printf("%02X ", response[i]);
    		printf("\n");
    	}
     
    	// Close card terminal
    	ret = CT_close(ctn);
    	if (ret != OK)
    		printf("Error: CT_close failed with error %d\n", ret);
     
    		return 0;
    }
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  20. #20
    Membre régulier
    dans le dossier SDK, y a un exemple en VB6, mais il utilise la dll windscard.dll (celle de windows).

    je souhaite utiliser la dll du constructeur.

    Je me retourne vers celle de windows en plan B

    Je pense que le soucis que j'ai se trouve au niveau de la variable de retour "response", contenant les valeurs.
    On dirait qu'il y a un problème de type, car dans l'exemple en C++ que cite @philouZ, il s'agirait d'un tableau de caractères.

    et dans un autre fichier ct_api.h (dans le dossier "include"), on dirait que c'est un pointeur...

    j'avoue ne pas être à l'aise avec ce type de données...