2012 Mifare Kart Yazıcı/Okuyucu Modül (MFM-200) İstanbul Yazılım ve Elektronik Teknolojileri 01.01.2012
MFM-200 Mifare Kart Yazıcı/Okuyucu Modül Genel Özellikler Ürün Kodu MFM-200 Protokol ISO14443A, ISO15693 Kart Tipleri Mifare Classic 1K, Mifare Classic 4K Haberleşme Bağlantısı TTL UART TX, RX (RS232) Seri İletişim Parametreleri Parite None Data Bit 8 Stop Bit 1 Baudrate 9600, 19200, 38400, 57600, 115200 bps Sinyaller Reset# Bu pinden (-) sinyal verilirse modül resetlenir. IO_5 (-) sinyal verilirse baudrate 9600 seçilmiş olur. IO_4 (-) sinyal verilirse baudrate 19200 seçilmiş olur. IO_3 (-) sinyal verilirse baudrate 38400 seçilmiş olur. IO_2 (-) sinyal verilirse baudrate 57600 seçilmiş olur. IO_1 (-) sinyal verilirse baudrate 115200 seçilmiş olur. Boy ve Ağırlık Boy 42(W)x32(H)mm Ağırlık - Çalışma Çalışma Voltajı 5V Güç Tüketimi 60mA Sıcaklık -40 / 85 C
Pin Bağlantı Şeması: Açıklamalar: - Mifare Classic 1K ve Mifare Classic 4K kart bloklarını okumak ve yazmak için kullanılır. - Bir RS232 ara devresi ile PC`ye bağlayıp kullanabileceğiniz gibi kendi devrelerinize gömerekte kullanabilirsiniz. - Oldukça basit olan komut seti sayesinde kart okuma/yazma işlemlerinin hızlı ve kolay bir şekilde yapılmasını sağlar.
Haberleşme Formatı: STX Command Data ETX Checksum 2 byte 1 byte 1 byte n byte 1 byte 1 byte Tablo 1 - Haberleşme Paketi Byte Dizilimi STX Command Data ETX Checksum : Başlama işareti. : Paket uzunluğu. STX ve Checksum dahil tüm byte`ların toplamı. : Yapılacak işlemi bildiren komut. : n bayt uzunluğundaki veri. : Son byte işareti. : STX ile ETX arasındaki tüm baytların toplamının son(lsb) baytı. Komut Seti: Kod Komut Açıklama 0x01 Read Tag Info Tag Id`sini okur. 0x02 Load Key Load_Key komutu. 0x03 Read Block Tag`dan 1 blok(16 byte) okur. 0x04 Write Block Belirtilen bloğa 16 byte yazar. 0x80 STX Error Start byte`ı hatalı. 0x81 Error Paket uzunluğu hatalı. 0x82 Command Error Komut hatası. 0x83 ETX Error Son byte hatalı. 0x84 Checksum Error Kontrol byte`ı hatalı. 0x85 Read Block Error Blok okunamadı. 0x86 Write Block Error Blok yazılamadı. 0x87 No Tag İşlem yapılacak bir tag bulunamadı. Tablo 2 - Komut Seti Tag Tipleri: typedef enum TagNone = 0, TagUltraLight = 1, Tag1K = 2, Tag4K = 3, TagDesFire = 4 TagType; Tablo 3 - Tag Tipi
Read Tag Info - 0x01 Bu komut, tag tipini ve id`sini okur. Tag tipleri için Tablo 3`e bakınız. Komut: Command 0x01 6 byte - Paket uzunluğu Tablo 4 - Read Tag Info Yanıt: Response Command Tag Type Tag Id 0x01 11 byte - Paket uzunluğu 1 byte - Tag tipi. (Tag tipleri için Tablo 3`e bakınız.) 4 byte - İlk bayt MSB bayttır. Tablo 5 - Read Tag Info komutuna yanıt Örnek: Komut : 01 02 06 01 03 0D STX Command Data ETX Checksum 01 02 06 01-03 0D Yanıt : 01 02 0B 01 02 6C C6 AB 0A 03 FB STX Command Data ETX Checksum 01 02 0B 01 02 6C C6 AB 0A 03 FB
Load Key - 0x02 Bu komut, tag blokları ile işlem yapabilmek için kullanılan Key A veya Key B anahtar baytlarını cihaza yükler. Modülün varsayılan key baytları 0xFF FF FF FF FF FF`dir ve kimlik doğrulama (authentication) için Key A kullanır. Komut: Command Key Tipi Key Bytes 0x02 13 byte - Paket uzunluğu. 1 byte 0x60 = Key A 0x61 = Key B 6 byte - Key byte`ları. Tablo 6 - Load Key Yanıt: Response Command 0x02 6 byte - Paket uzunluğu. Tablo 7 - Load Key komutuna yanıt Örnek: Komut 01 02 0D 02 60 A0 A1 A2 A3 A4 A5 03 44 STX Command Data ETX Checksum 01 02 0D 02 60 A0 A1 A2 A3 A4 A5 03 44 Yanıt : 01 02 06 02 03 0E STX Command Data ETX Checksum 01 02 06 02-03 0E
Read Block - 0x03 Bu komut, tag bloklarını okumak için kullanılır. Okuma işleminden sonra 16 baytlık blok verisi tag`den yüklenir. Komut: Command Block No 0x03 7 byte - Paket uzunluğu. 1 byte - Okunacak olan blok nosu. Tablo 8 - Read Block Yanıt: Response Command Block No Block Data 0x03 23 byte - Paket uzunluğu. 1 byte - Okunan blok no. 16 byte - Blok verisi. Tablo 9 - Read Block komutuna yanıt Örnek: Komut : 01 02 07 03 01 03 11 STX Command Data ETX Checksum 01 02 07 03 01 03 11 Yanıt : 01 02 17 03 01 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 03 99 STX Command Data ETX Checksum 01 02 17 03 01 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 03 99
Write Block - 0x04 Bu komut, tag bloklarına yazmak için kullanılır. Komut: Command Block No Block Data 0x04 23 byte - Paket uzunluğu. 1 byte - Yazılacak olan blok nosu. 16 byte - Blok içine yazılacak olan veri. Tablo 10 - Write Block Yanıt: Response Command Block No 0x04 7 byte - Paket uzunluğu. 1 byte - Yazılan blok no. Tablo 11 - Write Block komutuna yanıt Örnek: Komut : 01 02 17 04 01 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 03 9A STX Command Data ETX Checksum 01 02 17 04 01 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 03 9A Yanıt : 01 02 07 04 01 03 12 STX Command Data ETX Checksum 01 02 07 04 01 03 12
Örnek Kod: Test.H /* İşaret baytları */ #define STX 0x0102 // Start baytı. #define ETX 0x03 // Stop baytı. /* Komutlar */ #define CMD_READ_TAG_INFO 0x01 // Tag Id`sini okur. #define CMD_LOAD_KEY 0x02 // Load_Key komutu. #define CMD_READ_BLOCK 0x03 // Tag`dan 1 blok(16 byte) okur. #define CMD_WRITE_BLOCK 0x04 // Belirtilen bloğa 16 byte yazar. /* Modülden gelen hata komutları */ #define CMD_STX_ERROR 0x80 // Start byte`ı hatalı. #define CMD_LENGTH_ERROR 0x81 // Paket uzunluğu hatalı. #define CMD_COMMAND_ERROR 0x82 // Komut hatası. #define CMD_ETX_ERROR 0x83 // Son byte hatalı. #define CMD_CHECKSUM_ERROR 0x84 // Checksum hatalı. #define CMD_READ_BLOCK_ERROR 0x85 // Blok okunamadı. #define CMD_WRITE_BLOCK_ERROR 0x86 // Blok yazılamadı. #define CMD_NO_TAG 0x87 // İşlem yapılacak bir tag bulunamadı. typedef enum TagNone = 0, TagUltraLight = 1, Tag1K = 2, Tag4K = 3, TagDesFire = 4 TagType; void uart_send_buffer(unsigned char* buf, unsigned char buf_size); void uart_read_buffer(unsigned char* buf);
Test.C unsigned char Checksum (unsigned char* buf, int length) unsigned char Result = 0; while (length > 0) Result += buf[--length]; return Result; unsigned char Read_Tag_Info (TagType* ttype, unsigned char* Tag_Id) unsigned char buf[11]; buf[0] = STX >> 8; buf[1] = STX; buf[2] = 6; buf[3] = CMD_READ_TAG_INFO; buf[4] = ETX; buf[5] = Checksum(buf, 5); uart_send_buffer (buf, 6); delay(); uart_read_buffer (buf); if (buf[3] == CMD_READ_TAG_INFO) *ttype = (TagType)buf[4]; memcpy (Tag_Id, &buf[5], 4); // STX ilk byte. // STX son byte. // Toplam paket uzunluğu. // Komut. // Son bayt. // Checksum baytını hesapla. // Komut paketini gönder. // Bu süreyi kendiniz tayin ediniz. // Gelen yanıtı al. // Gelen komut CMD_READ_TAG_INFO ise // Tag tipini al. // Tag id`yi al. return buf[3]; // Gelen komutu döndür. int main (void) while (1) if (Read_Tag_Info() == CMD_READ_TAG_INFO) // İşlemler... else Hata_Islemleri(); // Kendi hata kontrolünüzü burada yapabilirsiniz. İstanbul Yazılım ve Elektronik Teknolojileri Tel : 0(212) 220 82 66 Fax: 0(212) 220 83 66 bilgi@istanbulyazilim.com www.istanbulyazilim.com