2009/05/21

RFID初接觸-Mifare

因為最近接觸的系統都有用到RFID的技術


加上學校的教職員證與學生證也都改用RFID了


所以這一個月研究了一下有關RFID中的其中一種 Mifare


講mifare可能大家都不知道,其實台北捷運的悠遊卡就是mifare卡


但是由於mifare有保護機制,所以不能去改其他家的卡片(天殺的我也想改)


為了整理自己這個月所獲得的,所以會慢慢把一些實務上已經測試成功的方法寫出來


所以這系列的文章著重於開發程式來使用mifare,至於卡片怎麼讀取的原理請參考專業書籍(因為我看不懂XDD)


=========廢話終於結束了==========


<<RFID卡有那些規格>>












資料來源:wiki


 


因為我只接觸過mifare,所以只打mifare的部份


mifare使用的是ISO 14443的規範,使用13.56 MHz的頻率進行通訊


不同的規範跟不同的頻率是不能混用低,所以買讀卡機與卡片時請注意是否規格相符


 


<<開發RFID需求>>



  1. 一部電腦(這個最重要!)

  2. 一台讀卡機,要能讀RFID的,我是用acs的acr122U
    acr122nfccols3.gif
    選這台不是因為它支援NFC,是因為它比較漂亮XDD

  3. 一張卡片,前面說過了,要找mifare的卡片

  4. 開發環境:我使用m$ VisualStudio Express 2008開發程式,個人使用是免錢低


 


<<程式開發使用元件>>


當然,控制硬體端的東西不可能自己生出來(生的出來我就不在這裡了),所以要用人家寫好的函式庫來使用。
Windows就有內建一"Winscard.lib"可以控制讀卡機來讀取卡片資料,程式新手要直接用還真難。


<<程式開發流程>>


假設現在要對讀卡機下命令,程式需要的流程(我寫的很簡單)



  1. 建立一個資源準備連線讀卡機,並取得讀卡機名稱

  2. 資源建立後,建立與讀卡機的連線

  3. 連線成功後,可以準備送指令請讀卡機做事啦~

  4. 指令是使用APDU(Application Protocol Data Unit) 其實我到現在還是不知道這是啥

  5. 讀取完成後,關閉連線,關閉資源


事情有這麼簡單天下就太平了 囧
傳送資料的時候,會有兩~四個步驟才能夠完成


  1. 傳送指令給讀卡機(例  程式:我要讀取這張卡片的卡號)

  2. 讀卡機收到後回傳是否成功(例  讀卡機:(成功)好,來讀吧! OR (失敗)蛤?你共啥?)

  3. 程式判斷是否成功,成功才可以繼續(例  程式:把你剛剛讀到的資料給我吧!)

  4. 讀卡機把讀取的值回傳(例 讀卡機:這是您要的資料,主人(羞) )


很麻煩吧~來寫外星人語(>>:給讀卡機, <<:給程式)


  1. >> FF 00 00 00 04 D4 4A 01 00

  2. << 61 0E

  3. >> FF C0 00 00 0E

  4. << D5 4B 01 01 00 01 18 04 11 22 33 44 90 00


以上是抓卡號的APDU Command 有些數字是我亂掰的,所以請勿當真
你確定要還繼續嘛?XDD

<<程式開發使用函數>>


在此要先謝謝這篇文章:[分享]第五部份 Smartcard 讀寫器函數庫的使用說明
如果不是這篇文章我可能要摸更久,所以各位轉過去看吧~(喂)



  1.  

    1. 建立資源 SCardEstablishContext

    2. 列出讀卡機  SCardListReaders

    3. 建立連線 SCardConnect

    4. 傳送命令 SCardTransmit

    5. 關閉連線 SCardDisconnect

    6. 釋放資源 ScardReleaseContext



 


<<雜記>>


很雜的東西我想到都會放這,之後再來整理



  1. mifare的規格設定其實還有很多,除非跟我拿到同款的機器才可能可以直接套用。沒有讀卡機廠商的SDK還是無法控制讀卡機,有興趣可向廠商購買sdk的開發包。

  2. 此頁寫的版本是使用APDU指令,需要相容PC/SC的讀卡機才可使用,要讀取IC卡也可以這樣做


===


2 則留言:

  1. 您好:請問你當初此台讀卡機買多少錢?另外,如果不使用APDU,是不是就是要用SDK呢?謝謝你的回覆^^

    版主回覆:(04/05/2009 04:53:00 AM)


    含SDK開發包大概五千多,是的,但是只差在傳送指令不同,使用的函式都差不多

    回覆刪除
  2. 你好:
    想向你請教一下,他的SDK是否可有支援Linux的,因為目前有需要使用在Linux下操作。
    謝謝你的回覆~

    版主回覆:(08/17/2009 01:53:45 PM)


    SDK驅動沒有LINUX,所以應該沒有

    回覆刪除