Communiquer avec module USB RFID (ACR 122 et autres)
-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Communiquer avec module USB RFID (ACR 122 et autres)
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?
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?
Dernière modification par totorcalais le mar. 01/nov./2016 16:15, modifié 1 fois.
Re: Communiquer avec module USB RFID ACR 122?
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
http://www.purebasic.fr/french/search.p ... Rechercher
http://www.purebasic.fr/english/search. ... mit=Search
-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Re: Communiquer avec module USB RFID ACR 122?
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?
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?
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.
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?
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
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
-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Re: Communiquer avec module USB RFID ACR 122?
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.
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.
-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Re: Communiquer avec module USB RFID ACR 122?
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.
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.
Dernière modification par totorcalais le mer. 26/oct./2016 17:09, modifié 1 fois.
Re: Communiquer avec module USB RFID ACR 122?
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

(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

-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Re: Communiquer avec module USB RFID ACR 122?
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ù.
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ù.
Dernière modification par totorcalais le mer. 26/oct./2016 17:23, modifié 1 fois.
Re: Communiquer avec module USB RFID ACR 122?
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)
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)
-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Re: Communiquer avec module USB RFID ACR 122?
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 :
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
"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 :
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).Le périphérique USB\VID_072F&PID_2200\6&1c25adea&0&3 nécessite que l'installation soit poursuivie.
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
-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Re: Communiquer avec module USB RFID ACR 122?
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...
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?
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.
Mesa.
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
-
- Messages : 67
- Inscription : mer. 27/sept./2006 12:45
Re: Communiquer avec module USB RFID ACR 122?
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 :
Il me met
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):
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 :
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)
Serait ce le fait que j'utilise une version 64bits?[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)
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 :
Je cherche les similitudes avec les données récupérées, et hormis le TCK, rien ne correspond...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
Re: Communiquer avec module USB RFID ACR 122?
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/