Page 1 sur 4

Communiquer avec module USB RFID (ACR 122 et autres)

Publié : mer. 26/oct./2016 11:17
par totorcalais
Bonjour,

Je cherche à créer un programme permettant de vérifier et loguer les passages de cartes sur mon périphérique ACR 122 branché en USB.

Quelqu'un aurait il déjà réfléchi à la façon de faire ?

comment faire pour dialoguer en I/o USB avec le périphérique?

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 13:11
par djes
Petite aide à la recherche (pas toujours évidente avec des mots courts)
http://www.purebasic.fr/french/search.p ... Rechercher
http://www.purebasic.fr/english/search. ... mit=Search

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 15:06
par totorcalais
Oui, j'avais fait cette recherche sans véritable succès. Du moins, pas de réponse précise de mon point de vue.

Dans les liens fournis, le forum anglais m'apporte une piste avec les DeviceIoControl.

Le problème est que cela n'est pas plus facile d'accès (je veux dire en exemples).

J'ai pris le probleme à l'envers et j'ai effectué une recherche à partir de l'exemple en VisualBasic fourni avec le SDK qui faisait référence à la dll : WinScard.dll

J'ai trouvé ce wrapper (voir fin du message) sur le forum anglais.

Il semble dater (j'ai du changer isfunction par getfunction).

Quelqu'un aurait il déjà travaillé avec?

Code : Tout sélectionner


;*******************************************************
;
;  PureBasic : PCSC Wrapper
;  Author : Leo Mijnders
;  Date : 29 March 2004
;  Doc : http://msdn.microsoft.com/library/en-us/security/security/authentication_functions.asp?frame=true#smart_card_functions
;
;*******************************************************

#SCARD_SHARE_EXCLUSIVE = 1 ; This application is not willing To share this
                           ; // card with other applications.
#SCARD_SHARE_SHARED = 2    ; This application is willing To share this
                           ; // card with other applications.
#SCARD_SHARE_DIRECT = 3    ; // This application demands direct control of

#SCARD_PROTOCOL_T0               =$0001   ;/* T=0 active protocol. */
#SCARD_PROTOCOL_T1               =$0002   ;/* T=1 active protocol. */
#SCARD_PROTOCOL_RAW              =$0004   ;/* Raw active protocol. */


#SCARD_UNKNOWN                   =$0001   ;/* Unknown state */
#SCARD_ABSENT                    =$0002   ;/* Card is absent */
#SCARD_PRESENT                   =$0004   ;/* Card is present */
#SCARD_SWALLOWED                 =$0008   ;/* Card not powered */
#SCARD_POWERED                   =$0010   ;/* Card is powered */
#SCARD_NEGOTIABLE                =$0020   ;/* Ready For PTS */
#SCARD_SPECIFIC                  =$0040   ;/* PTS has been set */

#SCARD_LEAVE_CARD                =$0000   ;/* Do nothing on close */
#SCARD_RESET_CARD                =$0001   ;/* Reset on close */
#SCARD_UNPOWER_CARD              =$0002   ;/* Power down on close */
#SCARD_EJECT_CARD                =$0003   ;/* Eject on close */

#SCARD_S_SUCCESS                 =$00000000
#SCARD_E_CANCELLED               =$80100002
#SCARD_E_CANT_DISPOSE            =$8010000E
#SCARD_E_INSUFFICIENT_BUFFER     =$80100008
#SCARD_E_INVALID_ATR             =$80100015
#SCARD_E_INVALID_HANDLE          =$80100003
#SCARD_E_INVALID_PARAMETER       =$80100004
#SCARD_E_INVALID_TARGET          =$80100005
#SCARD_E_INVALID_VALUE           =$80100011
#SCARD_E_NO_MEMORY               =$80100006
#SCARD_F_COMM_ERROR              =$80100013
#SCARD_F_INTERNAL_ERROR          =$80100001
#SCARD_F_UNKNOWN_ERROR           =$80100014
#SCARD_F_WAITED_TOO_LONG         =$80100007
#SCARD_E_UNKNOWN_READER          =$80100009
#SCARD_E_TIMEOUT                 =$8010000A
#SCARD_E_SHARING_VIOLATION       =$8010000B
#SCARD_E_NO_SMARTCARD            =$8010000C
#SCARD_E_UNKNOWN_CARD            =$8010000D
#SCARD_E_PROTO_MISMATCH          =$8010000F
#SCARD_E_NOT_READY               =$80100010
#SCARD_E_SYSTEM_CANCELLED        =$80100012
#SCARD_E_NOT_TRANSACTED          =$80100016
#SCARD_E_READER_UNAVAILABLE      =$80100017


Enumeration
  #SCARD_SCOPE_USER            ;    0x0000/* Scope in user space */
  #SCARD_SCOPE_TERMINAL        ;    0x0001/* Scope in terminal */
  #SCARD_SCOPE_SYSTEM          ;    0x0002/* Scope in system */
EndEnumeration 


Global fSCardEstablishContext, fSCardConnect, fSCardStatus, fSCardDisconnect, fSCardTransmit
Global fSCardListReaders

Global g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci

Procedure.l InitPCSC(Lib.l)
  If OpenLibrary(Lib, "WinSCard.dll")

    ; Pointers to SCARD_IO_REQUEST structures
    
    g_rgSCardT0Pci= GetFunction(Lib,"g_rgSCardT0Pci")
    g_rgSCardT1Pci= GetFunction(Lib,"g_rgSCardT1Pci")
    g_rgSCardRawPci= GetFunction(Lib,"g_rgSCardRawPci")

    ; Pointers to Basic PCSC Functions
    
    fSCardEstablishContext= GetFunction(Lib,"SCardEstablishContext")
    fSCardConnect= GetFunction(Lib,"SCardConnectA")
    fSCardStatus= GetFunction(Lib,"SCardStatusA")
    fSCardDisconnect= GetFunction(Lib,"SCardDisconnect")
    fSCardTransmit= GetFunction(Lib,"SCardTransmit")
    fSCardListReaders= GetFunction(Lib,"SCardListReadersA")
    
    ProcedureReturn 0
  EndIf
  ProcedureReturn -1
EndProcedure 

Procedure.l sSCardEstablishContext(self.l, a.l, b.l, c.l, d.l)
  ProcedureReturn CallFunctionFast(fSCardEstablishContext, a, b, c, d)
EndProcedure

Procedure.l sSCardConnect(self.l, a.l, b.l, c.l, d.l, e.l, f.l)
  ProcedureReturn CallFunctionFast(fSCardConnect, a, b, c, d, e, f)
EndProcedure

Procedure.l sSCardStatus(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ProcedureReturn CallFunctionFast(fSCardStatus, a, b, c, d, e, f, g)
EndProcedure

Procedure.l sSCardDisconnect(self.l, a.l, b.l)
  ProcedureReturn CallFunctionFast(fSCardDisconnect, a, b)
EndProcedure

Procedure.l sSCardTransmit(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ProcedureReturn CallFunctionFast(fSCardTransmit, a, b, c, d, e, f, g)
EndProcedure

Procedure.l sSCardListReaders(self.l, a.l, b.l, c.l, d.l)
  ProcedureReturn CallFunctionFast(fSCardListReaders, a, b, c, d)
EndProcedure

Interface IF_PCSC
  EstablishContext(a.l, b.l, c.l, d.l)
  Connect(a.l, b.l, c.l, d.l, e.l, f.l)
  Status(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  Disconnect(a.l, b.l)
  Transmit(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ListReaders(a.l, b.l, c.l, d.l)
EndInterface

Structure strucInterface
  a.l
  b.l
  c.l
  d.l
  e.l
  f.l
EndStructure

SCard.IF_PCSC
Struc.strucInterface

Struc\a=@sSCardEstablishContext()
Struc\b=@sSCardConnect()
Struc\c=@sSCardStatus()
Struc\d=@sSCardDisconnect()
Struc\e=@sSCardTransmit()
Struc\f=@sSCardListReaders()

AddStruc.l=@Struc
PokeL(@SCard,@AddStruc)

Structure IO_REQ
  P.l
  A.l
  B.b[512]
EndStructure

outPCI_T0.IO_REQ

outPCI_T0\P=1
outPCI_T0\A=512


; *************************** CompilerIf 0 if used as IncludeFile  or  1 = if test IncludeFile

CompilerIf 0

  Procedure.s HexString(Source.l, L.l) 
    result.s = ""
    For i = 0 To L-1
        result = result + Right("00" + Hex(PeekB(Source+i)), 2) 
    Next i
    ProcedureReturn result
  EndProcedure
  
  hCTX.l
  Buf.s=Space(1000)
  ATRL.l
  ATR.l=AllocateMemory(2,100)
  hCARD.l
  AP.l
  L.l
  S.L
  In.l=AllocateMemory(3,100)
  Out.l=AllocateMemory(4,100)
  OutL.l

  ; APDU to genarate 8 byte Random at TB100 smartcard

  PokeB(In,$BC)
  PokeB(In+1,$C4)
  PokeB(In+2,$00)
  PokeB(In+3,$00)
  PokeB(In+4,$08)

  If InitPCSC(10)=0
    A=SCard\EstablishContext(0,0,0,@hCTX)
    MessageRequester("hCTX", Hex(A)+" "+Hex(hCTX),0)
    L.l=1000
    A=SCard\ListReaders(hCTX,0,@Buf,@L)
    MessageRequester("Reader", Hex(A)+" "+Buf,0)
    A=SCard\Connect(hCTX,@"TOWITOKO CHIPDRIVE 0",#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
    MessageRequester("Connect", Hex(A),0)
    A=SCard\Status(hCARD,@Buf,@L,@S,@AP,ATR,@ATRL)
    MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+Hex(PeekL(ATR)),0)
    A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
    MessageRequester("Disconnect", Hex(A))
    A=SCard\Connect(hCTX,@"TOWITOKO CHIPDRIVE 0",#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
    MessageRequester("Connect", Hex(A),0)
    A=SCard\Status(hCARD,@Buf,@L,@S,@AP,ATR,@ATRL)
    MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+HexString(ATR,ATRL),0)
    For I=1 To 10
      OutL=10
      A=SCard\Transmit(hCARD, g_rgSCardT0Pci, In, 5, @outPCI_T0, Out, @OutL)
      MessageRequester("Transmit", Hex(A)+" "+HexString(Out,OutL)+" "+Hex(OutL),0)
    Next  
    A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
    MessageRequester("Disconnect", Hex(A))
  Else
    MessageRequester("Error", "Lib not loaded",0)
  EndIf  
  
CompilerEndIf

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 15:14
par Mesa
Il existe une library faite par un russe, "User_Russian" sur le forum uk, mais elle date un peu:
http://www.purebasic.fr/english/viewtop ... 14&t=41729

Il a créé un module plus récent pour PB5.2 qui semble fonctionner en PB5.5, avec des exemples.
http://purebasic.mybb.ru/viewtopic.php?id=471

Mesa.

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 15:35
par Marc56
Tu es sous Windows ou autre ?

Si tu es sous Windows, une fois les drivers du périphérique installés, le port USB connecté est-il 'mappé' vers un port série ?
(comme pour une carte Arduino, une imprimante 3D etc) ou a-t-il son système ?

D'après la doc en ligne, ce lecteur est compatible avec la norme CCID + PC/SC

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 16:02
par totorcalais
Oui, je suis sous windows.

Je vais jeter un Œil sur cette librairie HID et voir ce qu'elle donne.

Pour le reste, je dois avouer qu'il n'est pas simple de s'y retrouver dans toute cette jungle de normes :)

En tout cas, merci de vos aides, c'est vraiment formidable cet esprit d'entraide.

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 16:57
par totorcalais
Je viens d'essayer la HID sous un vieux Purebasic 4.60 et le code sous 5.5.

CA passe mais je ne retrouve pas mon périphérique dans la liste des "devices" trouvés avec l'exemple "device info"... (Il y a même moins de données avec le code 5.5 que le 4.60 (mais elles étaient récurrentes) : il voit mes périphériques tels que clavier, souris et

C'est très déroutant.

Car pour ce que je veux faire, il me manque juste les moyens de communiquer avec ce périphérique pour avancer.

Je veux détecter un passage de carte/badge, contrôler avec le contenu d'une SGBD et loguer le passage.

A terme, je veux commander une interface Arduino ou autre pour commander une ouverture ou une action physique.

PS: je sais qu'on peut le faire avec l'arduino mais je voulais tester ce périphérique USB pour une utilisation sur un ordi.

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 17:05
par Marc56
Quand le lecteur est connecté (avec ses drivers installés), dans le gestionnaire de périphériques, rien dans la section Ports COM ?
(S'il est mappé sur un port COM, alors c'est facile de communiquer avec la lib PB Serial)

D'après la doc il devrait déjà apparaitre au niveau racine du gestionnaire de périphérique comme
Smart card Readers
/ USB Smart Card Reader


Doc:
http://www.acs.com.hk/en/products/3/acr ... fc-reader/
Application Programming Interface

PS. Pour l'arduino, il faut mettre un shield supplémentaire (USB Host Shield)

Je n'ai pas de lecteur, donc je ne fais que citer la doc
:wink:

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 17:19
par totorcalais
Il n'y a aucun port com ni LPT dans ma machine (dans le gestionnaire de périphérique).

En effet, j'utilise une imprimante réseau et donc, à priori, aucun périphérique Sur un port Série.

IL n’apparaît pas aussi clairement dans le gestionnaire mais il apparaît bien dans les périphériques avec le nom indiqué et sur propriétés nous obtenons : Emplacement 0 (Port_#0003.Hub_#0001).

PS: j'ai installé le dernier driver et redémarré la machine au cas où.

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 17:22
par Marc56
et dans le gestionnaire de périphérique y a-t-il:

Smart card Readers / USB Smart Card Reader

Voir page 7 de la doc
http://www.acs.com.hk/en/products/3/acr ... _downloads
Application Programming Interface (tout en bas, PDF à télécharger)

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 17:25
par totorcalais
ACR122U PICC Interface est son nom en tant que périphérique.


"ACR122 Smart card Readers" apparaît dans les propriétés avec comme indication : lecteur de cartes à puces.

Pas d'indication d'USB, en effet.

EDIT : OK, trouvé dans le gestionnaire : en fait, il apparaît comme lecteur de carte à puces
Il apparaît également cette information troublante :
Le périphérique USB\VID_072F&PID_2200\6&1c25adea&0&3 nécessite que l'installation soit poursuivie.
Vous avez déja rencontré ce probleme? il semble pourtant fonctionner correctement. Quand j'utilise les utilitaires fournis, il réagit. et quand je met une carte, il l'affiche comme un nouveau périphérique (donc la détecte bien).

Je précise que je suis sous windows 10...

EDIT 2 : Bon, j'ai réinstallé. Il m'a mis a jour les événements avec une installation sans le même message. J'obtiens dans les proprités : USB\VID_072F&PID_2200\8&144B21F8&0&3

Re: Communiquer avec module USB RFID ACR 122?

Publié : mer. 26/oct./2016 17:49
par totorcalais
J'ai de nouveau testé avec le code du site russe pour 5.5.

Aucune erreur mais ce périphérique s'obstine à ne pas apparaître la liste de ceux que le programme teste.

C'est très déroutant.

Comme s'il ne le considérait pas comme un périphérique USB(il n'est d'ailleurs pas dans la liste USB sauf celle que l'on obtient pour retirer le périphérique )

Quand je place une carte Mifare dessus, il me la détecte et me l'installe également comme un périphérique...

Re: Communiquer avec module USB RFID ACR 122?

Publié : jeu. 27/oct./2016 9:56
par Mesa
Apparemment, le lecteur communique en PC/SC, donc passer par l'usb ne sert à rien à mon avis. D'autant plus que Windows ne détecte pas le lecteur comme un périf usb mais comme une carte à puce.

Il faut donc se tourner vers le protocole PC/SC.
Ton intuition de passer par un wrapper me semble être la bonne solution avec les instructions données dans le pdf trouvé par Marc56
http://www.acs.com.hk/download-manual/4 ... U-2.03.pdf


Peut-être faut-il s'assurer que les pilotes PCSC soient installés, pour ton lecteur:
http://www.acs.com.hk/en/products/3/acr ... _downloads
http://www.acs.com.hk/download-driver-u ... n-4100.zip

Wikipedia nous dit que Windows a une api carte à puce depuis Win2000
https://fr.wikipedia.org/wiki/PC/SC
En effet :
https://msdn.microsoft.com/en-us/library/bb742533.aspx
Comment se connecter à une carte à puce avec l'api windows:
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
https://msdn.microsoft.com/en-us/librar ... _functions

Heureusement un français a écrit du code dans 20 langages différents dont le C, JS, PHP, en utilisant un wrapper adapté à chaque fois.
Code à adapter en fonction de http://www.acs.com.hk/download-manual/4 ... U-2.03.pdf
http://ludovicrousseau.blogspot.fr/2010 ... uages.html
http://ludovic.rousseau.free.fr/softwares/
http://ludovic.rousseau.free.fr/softwares/pcsc-tools/
https://www.springcard.com/en/download/software

Sinon les spécifications du pcsc sont ici
http://www.pcscworkgroup.com/library/relatedlinks.php

De plus, j'ai corrigé le code qui ne fonctionnait pas.

Code : Tout sélectionner


;*******************************************************
;
;  PureBasic : PCSC Wrapper
;  Author : Leo Mijnders
;  Date : 29 March 2004
;  Doc : http://msdn.microsoft.com/library/en-us/security/security/authentication_functions.asp?frame=true#smart_card_functions
;
;*******************************************************

#SCARD_SHARE_EXCLUSIVE = 1 ; This application is not willing To share this
                           ; // card with other applications.
#SCARD_SHARE_SHARED = 2    ; This application is willing To share this
                           ; // card with other applications.
#SCARD_SHARE_DIRECT = 3    ; // This application demands direct control of

#SCARD_PROTOCOL_T0               =$0001   ;/* T=0 active protocol. */
#SCARD_PROTOCOL_T1               =$0002   ;/* T=1 active protocol. */
#SCARD_PROTOCOL_RAW              =$0004   ;/* Raw active protocol. */


#SCARD_UNKNOWN                   =$0001   ;/* Unknown state */
#SCARD_ABSENT                    =$0002   ;/* Card is absent */
#SCARD_PRESENT                   =$0004   ;/* Card is present */
#SCARD_SWALLOWED                 =$0008   ;/* Card not powered */
#SCARD_POWERED                   =$0010   ;/* Card is powered */
#SCARD_NEGOTIABLE                =$0020   ;/* Ready For PTS */
#SCARD_SPECIFIC                  =$0040   ;/* PTS has been set */

#SCARD_LEAVE_CARD                =$0000   ;/* Do nothing on close */
#SCARD_RESET_CARD                =$0001   ;/* Reset on close */
#SCARD_UNPOWER_CARD              =$0002   ;/* Power down on close */
#SCARD_EJECT_CARD                =$0003   ;/* Eject on close */

#SCARD_S_SUCCESS                 =$00000000
#SCARD_E_CANCELLED               =$80100002
#SCARD_E_CANT_DISPOSE            =$8010000E
#SCARD_E_INSUFFICIENT_BUFFER     =$80100008
#SCARD_E_INVALID_ATR             =$80100015
#SCARD_E_INVALID_HANDLE          =$80100003
#SCARD_E_INVALID_PARAMETER       =$80100004
#SCARD_E_INVALID_TARGET          =$80100005
#SCARD_E_INVALID_VALUE           =$80100011
#SCARD_E_NO_MEMORY               =$80100006
#SCARD_F_COMM_ERROR              =$80100013
#SCARD_F_INTERNAL_ERROR          =$80100001
#SCARD_F_UNKNOWN_ERROR           =$80100014
#SCARD_F_WAITED_TOO_LONG         =$80100007
#SCARD_E_UNKNOWN_READER          =$80100009
#SCARD_E_TIMEOUT                 =$8010000A
#SCARD_E_SHARING_VIOLATION       =$8010000B
#SCARD_E_NO_SMARTCARD            =$8010000C
#SCARD_E_UNKNOWN_CARD            =$8010000D
#SCARD_E_PROTO_MISMATCH          =$8010000F
#SCARD_E_NOT_READY               =$80100010
#SCARD_E_SYSTEM_CANCELLED        =$80100012
#SCARD_E_NOT_TRANSACTED          =$80100016
#SCARD_E_READER_UNAVAILABLE      =$80100017


Enumeration
  #SCARD_SCOPE_USER            ;    0x0000/* Scope in user space */
  #SCARD_SCOPE_TERMINAL        ;    0x0001/* Scope in terminal */
  #SCARD_SCOPE_SYSTEM          ;    0x0002/* Scope in system */
EndEnumeration 


Global fSCardEstablishContext, fSCardConnect, fSCardStatus, fSCardDisconnect, fSCardTransmit
Global fSCardListReaders

Global g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci

Procedure.l InitPCSC(Lib.l)
  If OpenLibrary(Lib, "WinSCard.dll")
    Debug "dll ok"
    ; Pointers to SCARD_IO_REQUEST structures
    
    g_rgSCardT0Pci= GetFunction(Lib,"g_rgSCardT0Pci")
    g_rgSCardT1Pci= GetFunction(Lib,"g_rgSCardT1Pci")
    g_rgSCardRawPci= GetFunction(Lib,"g_rgSCardRawPci")
    
    ; Pointers to Basic PCSC Functions
    
    fSCardEstablishContext= GetFunction(Lib,"SCardEstablishContext")
    fSCardConnect= GetFunction(Lib,"SCardConnectA")
    fSCardStatus= GetFunction(Lib,"SCardStatusA")
    fSCardDisconnect= GetFunction(Lib,"SCardDisconnect")
    fSCardTransmit= GetFunction(Lib,"SCardTransmit")
    fSCardListReaders= GetFunction(Lib,"SCardListReadersA")
    
    ProcedureReturn 0
  EndIf
  ProcedureReturn -1
EndProcedure 

Procedure.l sSCardEstablishContext(self.l, a.l, b.l, c.l, d.l)
  ProcedureReturn CallFunctionFast(fSCardEstablishContext, a, b, c, d)
EndProcedure

Procedure.l sSCardConnect(self.l, a.l, b.l, c.l, d.l, e.l, f.l)
  ProcedureReturn CallFunctionFast(fSCardConnect, a, b, c, d, e, f)
EndProcedure

Procedure.l sSCardStatus(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ProcedureReturn CallFunctionFast(fSCardStatus, a, b, c, d, e, f, g)
EndProcedure

Procedure.l sSCardDisconnect(self.l, a.l, b.l)
  ProcedureReturn CallFunctionFast(fSCardDisconnect, a, b)
EndProcedure

Procedure.l sSCardTransmit(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ProcedureReturn CallFunctionFast(fSCardTransmit, a, b, c, d, e, f, g)
EndProcedure

Procedure.l sSCardListReaders(self.l, a.l, b.l, c.l, d.l)
  ProcedureReturn CallFunctionFast(fSCardListReaders, a, b, c, d)
EndProcedure

Interface IF_PCSC
  EstablishContext(a.l, b.l, c.l, d.l)
  Connect(a.l, b.l, c.l, d.l, e.l, f.l)
  Status(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  Disconnect(a.l, b.l)
  Transmit(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ListReaders(a.l, b.l, c.l, d.l)
EndInterface

Structure strucInterface
  a.l
  b.l
  c.l
  d.l
  e.l
  f.l
EndStructure

SCard.IF_PCSC
Struc.strucInterface

Struc\a=@sSCardEstablishContext()
Struc\b=@sSCardConnect()
Struc\c=@sSCardStatus()
Struc\d=@sSCardDisconnect()
Struc\e=@sSCardTransmit()
Struc\f=@sSCardListReaders()

AddStruc.l=@Struc
PokeL(@SCard,@AddStruc)

Structure IO_REQ
  P.l
  A.l
  B.b[512]
EndStructure

outPCI_T0.IO_REQ

outPCI_T0\P=1
outPCI_T0\A=512


; *************************** CompilerIf 0 if used as IncludeFile  or  1 = if test IncludeFile



Procedure.s HexString(Source.l, L.l) 
  result.s = ""
  For i = 0 To L-1
    result = result + Right("00" + Hex(PeekB(Source+i)), 2) 
  Next i
  ProcedureReturn result
EndProcedure

hCTX.l
Buf.s=Space(1000)
ATRL.l
*ATR=AllocateMemory(100)
hCARD.l
AP.l
L.l
S.L
*IN=AllocateMemory(100)
*OUT=AllocateMemory(100)
OutL.l

; APDU to genarate 8 byte Random at TB100 smartcard

PokeB(*IN,$BC)
PokeB(*IN+1,$C4)
PokeB(*IN+2,$00)
PokeB(*IN+3,$00)
PokeB(*IN+4,$08)

If InitPCSC(10)=0
  A=SCard\EstablishContext(0,0,0,@hCTX)
  MessageRequester("hCTX", Hex(A)+" "+Hex(hCTX),0)
  L.l=1000
  A=SCard\ListReaders(hCTX,0,@Buf,@L)
  MessageRequester("Reader", Hex(A)+" "+Buf,0)
  A=SCard\Connect(hCTX,@"TOWITOKO CHIPDRIVE 0",#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
  MessageRequester("Connect", Hex(A),0)
  A=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
  MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+Hex(PeekL(*ATR)),0)
  A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
  MessageRequester("Disconnect", Hex(A))
  A=SCard\Connect(hCTX,@"TOWITOKO CHIPDRIVE 0",#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
  MessageRequester("Connect", Hex(A),0)
  A=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
  MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+HexString(*ATR,ATRL),0)
  For I=1 To 10
    OutL=10
    A=SCard\Transmit(hCARD, g_rgSCardT0Pci, *IN, 5, @outPCI_T0, *OUT, @OutL)
    MessageRequester("Transmit", Hex(A)+" "+HexString(*OUT,OutL)+" "+Hex(OutL),0)
  Next  
  A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
  MessageRequester("Disconnect", Hex(A))
Else
  MessageRequester("Error", "Lib not loaded",0)
EndIf  


Mesa.

Re: Communiquer avec module USB RFID ACR 122?

Publié : jeu. 27/oct./2016 10:24
par totorcalais
Merci du temps que tu as passé pour me répondre. Je suis très impressionné.

Sur le code du wrapper que tu proposes, je rencontre une erreur sur la ligne 196 :

Code : Tout sélectionner

A=SCard\EstablishContext(0,0,0,@hCTX)
Il me met
[11 :21 :27] Attente du démarrage du programme...
[11 :21 :26] Type d'exécutable: Windows - x64 (64bit, Unicode)
[11 :21 :27] Exécutable démarré.
[11 :21 :27] [ERREUR] Ligne: 196
[11 :21 :27] [ERREUR] Accès mémoire invalide. (erreur de lecture à l'adresse 1074021468)
Serait ce le fait que j'utilise une version 64bits?

EDIT: J'ai testé sur la version x86 et ok, ca passe. Ca me donne des infos, y compris des "chinoiseries" que je dois exploiter maintenent. Ca progresse et cela grâce à ton aide précieuse.

Voici mes retours de debug du code précédent et compte tenu de mon matériel (sans carte sur le lecteur):
dll ok
dll ok
A : 0 hCTX: FFFFFFFFCD010000
Reader : 0 buffer: 䍁⁓䍁ㅒ㈲〠
Connect : valeur A : FFFFFFFF80100009
Status : valeur A : 6 : valeur S : 0 : valeur AP : 0 : valeur ATRL : 0 : valeur ATR : 0
Disconnect : valeur A : 6
Connect : valeur A : FFFFFFFF80100009
Status : valeur A : 6 : valeur S : 0 : valeur AP : 0 : valeur ATRL : 0 : valeur ATR : 0
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A

Et avec une carte posée dessus (led verte) : On obtient les mêmes résultats.

Quand j'utilise le logiciel permettant d'analyser l'ATR : voici ce que j'obtiens :
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A
Initial character:
TS = 3B --> Using Direct Convention
Format byte:
T0 = 8F
- Y1 = 08 --> Interface Bytes Transmitted: TD1
- K = 0F --> # Historical Bytes = 15
Interface bytes:
TD1 = 80
- Y1 + 1 = 08 --> Interface Bytes Transmitted: TD2
- Protocol T = 0
TD2 = 01
- Y2 + 1 = 00 --> Interface Bytes Transmitted: none
- Protocol T = 1
Historical bytes: 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00
Check Byte:
TCK = 6A
Je cherche les similitudes avec les données récupérées, et hormis le TCK, rien ne correspond...

Re: Communiquer avec module USB RFID ACR 122?

Publié : jeu. 27/oct./2016 12:23
par djes
Pourquoi n'utilises-tu pas l'API (et la dll) fournie sur la page du constructeur, ce serait peut-être plus simple, non ? En bas de http://www.acs.com.hk/en/products/3/acr ... fc-reader/