<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>koras.pl - Orest Hrycyna portfolio &#38; blog &#187; c#</title>
	<atom:link href="http://koras.pl/category/projekty/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://koras.pl</link>
	<description></description>
	<lastBuildDate>Mon, 07 Jun 2010 23:25:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Obsługa czytnika kart w C#</title>
		<link>http://koras.pl/2010/01/07/obsluga-czytnika-kart-w-c/</link>
		<comments>http://koras.pl/2010/01/07/obsluga-czytnika-kart-w-c/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 00:56:47 +0000</pubDate>
		<dc:creator>Orest Hrycyna</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[projekty]]></category>
		<category><![CDATA[studia]]></category>
		<category><![CDATA[smartcard]]></category>

		<guid isPermaLink="false">http://koras.pl/blog/?p=228</guid>
		<description><![CDATA[Poszukiwałem odpowiedniego rozwiązania problemu obsługi czytnika kart w C#, w przeciwieństwie niestety do Javy nie mamy do dyspozycji wbudowanej implementacji tego problemu. Na wielu angielskich stronach i blogach znalazłem jakieś kawałki kodu, nawet jakiś framework, ale niestety nic tak do końca nie chciało działać. W końcu z tego wszystkiego udało mi się uzyskać kawałek kodu, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koras.pl/blog/go.php?http://koras.pl/blog/2010/01/07/obsluga-czytnika-kart-w-c/" title="(99 hits)"><img src="http://koras.pl/blog/wp-content/uploads/2010/01/smartcard.gif" alt="Obsługa czytnika kart w C#" title="Obsługa czytnika kart w C#" width="240" height="124" class="alignleft size-full wp-image-229" align="left" /></a>Poszukiwałem odpowiedniego rozwiązania problemu obsługi czytnika kart w C#, w przeciwieństwie niestety do Javy nie mamy do dyspozycji wbudowanej implementacji tego problemu. Na wielu angielskich stronach i blogach znalazłem jakieś kawałki kodu, nawet jakiś framework, ale niestety nic tak do końca nie chciało działać. W końcu z tego wszystkiego udało mi się uzyskać kawałek kodu, który zadziałał i może się komuś przyda. Zasada odczytu danych z karty jest dosyć prosta. Jedyne czego potrzebujemy to czytnik kart (oczywiście pod USB), kartę zbliżeniową bądź kontaktową oraz najważniejsze &#8211; specyfikację techniczną karty dzięki której poznamy komendy bitowe pozwalające na operacje na karcie. </p>
<p><span id="more-228"></span><br />
Pierwszym krokiem jest dodanie do projektu biblioteki GemCard: klikamy prawym przyciskiem na projekcie, <em>Add Reference&#8230;</em>, wybieramy plik dll z dysku.<br />
Następnie w klasie gdzie chcemy implementować bibliotekę dodajemy:</p>
<pre class="prettyprint lang-cs">
<span class="nocode">1:</span>        using GemCard;
</pre>
<p>Tworzymy obiekty potrzebne do obsługi czytnika i wydawania komend, dodajemy jeszcze stałe oznaczające odpowiedź zapytania. W naszym wypadku będą to stany prawidłowej odpowiedzi oraz &#8220;w trakcie&#8221;.</p>
<pre class="prettyprint lang-cs">
<span class="nocode">1:</span>        static APDUCommand apduSelectFileMF = new APDUCommand(0x00, 0xA4, 0x00, 0x0C, null, 0x02);
<span class="nocode">2:</span>        static APDUCommand apduReadRecord = new APDUCommand(0x00, 0xB0, 0xFF, 0xFF, null, 0xFF);
<span class="nocode">3:</span>        CardNative iCard = new CardNative();
<span class="nocode">4:</span>        APDUParam apduParam = new APDUParam();
<span class="nocode">5:</span>        APDUResponse apduResp;
<span class="nocode">6:</span>        const ushort SC_OK = 0x9000;
<span class="nocode">7:</span>        const byte SC_PENDING = 0x9F;
</pre>
<p>Kolejnym krokiem będzie napisanie kilku prostych metod:</p>
<pre class="prettyprint lang-cs">
<span class="nocode">1:</span>        /// <summary>
<span class="nocode">2:</span>        /// Pobiera liste podlaczonych czytnikow oraz laczy sie z pierwszym na listy
<span class="nocode">3:</span>        /// </summary>
<span class="nocode">4:</span>        public void initReader()
<span class="nocode">5:</span>        {
<span class="nocode">6:</span>            string[] readers = iCard.ListReaders();
<span class="nocode">7:</span>            iCard.Connect(readers[0], SHARE.Shared, PROTOCOL.T0orT1);
<span class="nocode">8:</span>        }
<span class="nocode">9:</span>
<span class="nocode">10:</span>        /// <summary>
<span class="nocode">11:</span>        /// Rozlacza czytnik kart
<span class="nocode">12:</span>        /// </summary>
<span class="nocode">13:</span>        public void disconnect()
<span class="nocode">14:</span>        {
<span class="nocode">15:</span>             iCard.Disconnect(DISCONNECT.Unpower);
<span class="nocode">16:</span>             iCard.StopCardEvents();
<span class="nocode">17:</span>        }
</pre>
<p>Pozostaje już tylko napisanie odpowiednich metod wykonujących np. operację wyboru pliku lub odpytujących kartę o dane:</p>
<pre class="prettyprint lang-cs">
<span class="nocode">1:</span>        public void selectFile()
<span class="nocode">2:</span>        {
<span class="nocode">3:</span>            apduParam.Data = new byte[] { 0x3F, 0x00 };
<span class="nocode">4:</span>            apduSelectFileMF.Update(apduParam);
<span class="nocode">5:</span>            apduResp = iCard.Transmit(apduSelectFileMF);
<span class="nocode">6:</span>            if (apduResp.Status != SC_OK &#038;&#038; apduResp.SW1 != SC_PENDING)
<span class="nocode">7:</span>                throw new Exception(apduResp.ToString());
<span class="nocode">8:</span>        }
<span class="nocode">9:</span>
<span class="nocode">10:</span>        public byte[] readRecord()
<span class="nocode">11:</span>        {
<span class="nocode">12:</span>            apduParam.Reset();
<span class="nocode">13:</span>            apduReadRecord.Update(apduParam);
<span class="nocode">14:</span>            apduResp = iCard.Transmit(apduReadRecord);
<span class="nocode">15:</span>            if (apduResp.Status != SC_OK)
<span class="nocode">16:</span>                throw new Exception(apduResp.ToString());
<span class="nocode">17:</span>
<span class="nocode">18:</span>            return apduResp.Data;
<span class="nocode">19:</span>        }
</pre>
<p>Gotowe! Wystarczy teraz tylko zabrać się za pisanie programów dających dostęp do komputera, systemów a może nawet pomieszczeń? Powodzenia.</p>
<p><a ><img src="http://koras.pl/blog/wp-content/uploads/2009/12/Save.png" alt="Zapisz plik" title="Zapisz plik" width="24" height="24" class="alignnone size-full wp-image-265" /> GemCard.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://koras.pl/2010/01/07/obsluga-czytnika-kart-w-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
