buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDernière intervention 5 avril 2012
-
3 mars 2006 à 19:41
Hades122
Messages postés4Date d'inscriptionvendredi 17 mars 2006StatutMembreDernière intervention26 mai 2008
-
26 mai 2008 à 17:21
Bonjour,
J'ai une puce électronique branchée sur le port Série (Com1)
Sur delphi, Grâce au composant TComPort (TApdComPort) j'ai réussi à ouvrir et à fermer le port série (Com1), maintenant j'aurais besoin d'un petit coup de pousse de votre part pour m'aider à lire le contenu de la puce dans un Memo.
Ma form s'apelle (Form1)
Mon Memo séapelle (Memo1)
Je voudrais un petit coup de main pour avoir une procédure pour réaliser ce projet.
Merci Beaucoup et A bientôt
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 5 mars 2006 à 14:51
étant donné que tu utilises un TComport il est alors évident que tu cherches à communiqué avec une carte à puce de type asyncrone(Style carte Bancaire, Carte SIM ect..), les cartes syncrones quant à eux on un protocole différent(telle que les télécartes).
Donc dans notre contexte le protocole est connu d'avance puisque à moins de me trompé c'est celui d'une carte à puce ISO7816, j'estime alors que tu dois avoir au moins un coupleur de carte à puce, genre Infinity USB où tout autre coupleur compatible phoenix.
seulement voilà il ne suffit pas de connecter une carte à puce à un coupleur, encore faut-il avoir une connaissance de base de la norme ISO7816-(3-4), en effet ces cartes sont régis par cette norme à savoir
Cla Ins P1 P2 Len (Data)
Cla = Classe c'est donc la classe qui est propre au distributeur de celle-ci
Ins = Instruction, cette instruction est propre au distributeur également..
P1 = 1er Paramètre spécifique
P2 = Second Paramètre spécifique
Len = Longueur des données qui suivent(voir Data)
Data = nBytes Data aussi est lié à Ins + P1 + P2 + Len, d'ailleurs
il existe aussi un protocole au sein même de celui-ci, sachant que le protocole T0 est le plus fréquemment utiliser.
il est à Noter également que la norme prévoit une parité des données, ce qui complique un peu les choses car non seulement il faut configuré le port avec la parité adequate mais également rajouter une petite routine pour l'envoi où la reception des données, ici on parle ISO-Convention(ISO 1177) et il en existe deux
- ISO-DIRECTE
- ISO-INVERSE
l'ISO-DIRECTE : bit de poids faible en premier suivi d'une logique à niveau haut, c'est le meilleur, port->parité-Even, pas de conversion à faire on parle avec la carte directement(suivant la structure de la norme 7816 biensur)
l'ISO-INVERSE : bit de poids fort en premier suivi d'une logique à niveau bas, un peu plus compliquer, port->parité-odd, et oui le dialogue s'effectue avec une parité impaire, ce qui implique un petit algo pour l'envoi des données et la reception.
Example
caractère binaire inverse binaire
0 0000 F 1111
1 0001 7 0111
A 1010 A 1010
et donc une classe A0 s'écrit FA(inverse puis swap)
il faut savoir que généralement avant l'envoi d'une commande il faut faire un reset et lire l'ATR(AnswerToReset)
en autre l'ATR contient des données spécifiques à la convention
TS TO TA1 TB1 TC1 TD1 TA2.. T1..TK TCK
TS c'est le caractère initial, c'est celui qui donne la convention
le reste concerne la fréquence de l'horloge, le vpp(c'est de moins en moins utiliser, généralement vpp=vcc soit 5v)
T1..TK on appel ça des caractères historiques, maximum 15 caractères, le contenu est généralement secret, seul le constructeur/distributeur est censé en connaître le sens, mais généralement on y met la version logiciel, le constructeur de la puce, ça dépend du bon vouloir du constructeur puisque une partie est parfois publique
TCK c'est le checksum, ce caractère est ignoré dans le protocole T0
si le sujet interresse je pourrais plus tard faire une petite appli pour lire le repertoire téléphonique d'une carte SIM, et ainsi mettre en oeuvre mes explications, en attendant voici un lien pour mieux comprendre la norme ISO7816
une notion anglaise est fortement recommader !!!
http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-3.aspx
buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDernière intervention 5 avril 2012 6 mars 2006 à 17:05
Salut, belle démonstration sur le protocole de communication d'une puce.
Mais concrètement mon coupleur est branché sur Com1 et le protocole de communication de ma puce est: ISO7816
Est-ce que c'est tout ce qu'il te faut pour m'aider
Merci de votre aide
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 7 mars 2006 à 14:51
Okay je suis en train de dev un composant qui gère pratiquement tout, tout seul où presque ;), il y aura donc le noyau principal "SmartCardManager", et des librairies telles que ceux de la conversion ISOInverse(optimisé en assembler), mais aussi(pour plus tard), des compo wrapper entre SmartCardMan & Gsm(par exemple activé où désactivé le code Pin, lire le repertoire téléphonique, SMS ...);
bon je ne promet pas de faire tous ça now, mais ça sera au fure et à mesure des updates.
buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDernière intervention 5 avril 2012 7 mars 2006 à 18:16
Salut mais en attendant que tu crée ton composant aurais-tu une procédure à me communiquer permettant simplement de pouvoir lire le contenue de ma puce dans un Memo.
A+
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 8 mars 2006 à 01:05
fonction Reset Compatible Phoenix :
SetRTS(True);
SetRTS(False);
Sleep(220);// petite pause de 220 ms pour lecture complète de l'ATR
Après ceci un événement OnRxChar va se déclencher !!
dans OnRxChar un paramètre Count donne le nombre exacte d'octets transmis par la carte.
suffit alors de lire le contenu du buffer on faisant appel à une routine GetBuffer par exemple
function GetBuffer(Count : Integer):String;
var
Buffer : array[0..255] of byte;
I : Integer;
S : String;
begin
ComPort.Read(Buffer , Count);
S := '';
for i := 0 to Count -1 do
S := S + IntToHex(Buffer[i], 2) + ' ';
result := TrimRight(S);
end;
pour l'envoi c'est simple en respectant la structure ISO7816-(3 & 4)
var
Buffer : array[0..255];
B : Byte;
begin
Buffer[0] := Class
Buffer[1] := Ins
Buffer[2] := P1
Buffer[3] := P2
Buffer[4] := Len
CmdLen := 5;// car pas de Data
for i := 1 to CmdLen do
begin
B := Buffer[i];
ComPort.Write(B, 1);
ComPort.Read (B, 1); // on vide le cache du buffer pour éviter la redondance
Timer.DelayQT(50);// petite pause de 50 microseconde entre chaque instructions; ici un Timer avec une précision en microseconde on trouve ce compo sur Torry http://www.torry.net/vcl/datetime/timers/sanostimer.zip, mais on peut s'en passer !!
end;
Sleep(250); avant la lecture
maintenant OnRxChar va recevoir les Datas, idem on lit le buffer puis translation Byte->Str
Nota : IntToHex se trouve dans l'unité SysUtils donc à mettre dans la clause Uses.
end;
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 8 mars 2006 à 01:10
ah oui l'exemple cité ci-dessus n'est valable que pour la convention ISO-DIRECTE en ISO_INVERSE les données sont inversé faut rajouter une routine pour remettre ça dans l'ordre
buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDernière intervention 5 avril 2012 8 mars 2006 à 15:24
Salut,
j'ai un gros problème. Quand j'essai de constituer ma source avec les procédures que tu m'a communiqués,
j'ai une centaines d'erreurs!!.
Si tu avais le temps, ce serait vraiment sympa si tu pouvais me créer cette petite application sur delphi et
me l'envoyer sur mon adresse mail: jonat100@msn.com ou buguet.jon@voila.fr
là il doit y avoir l'ATR qui va s'afficher dans le champ Atr
après tu peux envoyé des Commandes
le champ maskEdit c'est pour les commandes ISO7816
Cla Ins P1 P2 Len
dans le champ Data
tu mets tes données à savoir au format
xx xx où xxxx où avec autant d'espace que tu veux, car les espaces, saut de lignes et les caractères "-" sont effacer automatiquement.
ya aussi la gestion pour coupleur SmartMouse now :)
@+
Hades122
Messages postés4Date d'inscriptionvendredi 17 mars 2006StatutMembreDernière intervention26 mai 2008 26 mai 2008 à 17:21
bonjour, je remonte un peu ce topic car j'aimerais moi aussi me lancer dans la communication PC - carte asynchrone, possédant déjà un coupleur USB (type Phoenix).
Aprés plusieurs recherches sur le net, je suis finalement tombé sur cette partie du site qui m'a apporté pas mal d'info, et m'a surtout rassuré sur la faisabilité d'une telle action (je me doutais que c'était réalisable en assembleur...mais comment dire...mmmh, l'assembleur et moi...on n'a jamais été trés copain ^^; ).
Du coup, j'aimerais savoir s'il existe quelques tutos (Delphi ou autre, venant personnellement du secteur C++ à la base) permettant de se familiariser avec tout ça ? Des conseils, des techniques, des exemples (je suis plein d'espoir :) )
ps : shining, ton site n'est plus en ligne :(, il le sera à nouveau bientôt ?