RFID ve NFC Kartlara Giriş ve Kütüphanesiz RC522 , PN532 ve Android 6.0 Kart Okuyucu Projeleri

Öncelikle bu yazıda neler bulacaksınız bunları söylemek isterim. 
Bu yazıda NFC kart okuyucu ve arduino kullanarak NFC kartları okumayı bulacaksınız. Fakat bu programlama KÜTÜPHANESİZ olacağından NFC kartlarının ve RC522 – PN532 okuyucuların da nasıl çalıştığını öğreneceksiniz. Normalde herşeyi kütüphane yaptığı için bunları öğrenmenize gerek olmuyordu. Bu KÜTÜPHANESİZ programlar, size sadece Arduino ile bağlı kalmamanızı, diğer işlemcilerle de çalışabilmenizi sağlayacaktır. Sadece SPI haberleşme şekillerini diğer işlemcilere adapte ederek tüm fonksiyonları direkt olarak kullanarak işlemci çeşitliliğini sağlayacaktır. 
Bunun yanısıra ANDROID 6.0 ve yukarısı tüm NFC li telefonlarla çalışacak şekilde bir anrdoid program örneği var. Bu android studio ile yapıldı. Nedeni ise MIT APP INVENTOR nfc eklentileri telefonun NFC ayarlarının tekrar tekrar yapılmasını istemesidir. Android studioda bu programa girildiğinde direkt olarak kendi programınız NFC iletişimini kendi üzerinden başlatır. Bu şekilde ayarlarla tekrar tekrar ilgilenmenize gerek kalmaz. 
Neden Android 6.0: Bu programda SDK23 özellikle kullanıldı. Android 6 NFC li eski telefonlarınız varsa, bunları hem deneme için hem de kontrol için kullanabilirsiniz. Eski telefonlarınızın wireless özelliğini kullanarak da NFC okunan bilgileri istediğiniz yere iletebilirsiniz. 

RFID mi NFC mi?

RFID ve NFC sıklıkla birbirinin yerine isim olarak kullanılsa da, aslında NFC, RFID teknolojisinin daha özelleşmiş ve gelişmiş bir alt kümesidir. Aralarındaki temel farkları şu şekilde özetleyebiliriz:

  1. Menzil ve İletişim Mesafesi
  • RFID: Çok geniş bir menzile sahip olabilir. Kullanılan frekansa bağlı olarak (özellikle UHF – Ultra Yüksek Frekans) bir RFID etiketi 10-100 metre mesafeden okunabilir.
  • NFC: Adı üstünde “Yakın Alan İletişimi”dir (Near Field Communication). Güvenlik gereği sadece birkaç santimetre (genellikle 4 cm veya daha az) mesafeden çalışır.
  1. İletişim Yönü (En Önemli Fark)
  • RFID: Genellikle tek yönlüdür. Bir okuyucu vardır ve etiketteki bilgiyi çeker. Etiket pasiftir, sadece cevap verir.
  • NFC: Çift yönlü (interaktif) iletişim kurabilir. Bir NFC cihazı (örneğin telefonunuz) hem bir “okuyucu” gibi davranabilir hem de bir “etiket” gibi davranabilir (kart simülasyonu). Bu sayede iki telefon birbirine veri aktarabilir.
  1. Kullanım Amaçları
  • RFID Kullanım Alanları:
    • Depo stok takibi (yüzlerce ürünü aynı anda uzaktan taramak).
    • Otoyol geçiş sistemleri (HGS/OGS gibi hızlı geçişler).
    • Hayvan takibi (çip takılması).
  • NFC Kullanım Alanları:
    • Temassız ödemeler (Apple Pay, kredi kartları).
    • Dijital kartvizit paylaşımı.
    • Akıllı ev cihazlarını telefonla eşleştirme.

NOT: Kullanılan etiketlerin %99 u pasif moda çalışır. Yani Okuyucu bir manyetik alan oluşturur. Bu alan etiketi enerjilendirir ve içerisindeki bilgi okunur ya da yazılır.

 

Bu kısa bilgilendirmeden sonra artık konumuza dönelim. 

Herşeyden önce NFC kartlarını ve etiketlerini tanımanız lazım. Buna göre yapacağınız projede hangi tip kartı ya da etiketi kullanabileceğinize karar verebilirsiniz.

Arduino deyince herkesin aklına en çok kullanılan RC522 kart okuyucu geliyor. Bu kart okuyucu denemeleriniz için yeterli gibi görünse de çok daha iyi bir okuyucu olan NXP firmasının PN532 okuyucusunu kullanmanızı öneririm.

Yukarıdaki resim benim çalışan modelim. Bu modülü buradan aldım

 

Yukarıdaki resim internet üzerinde çalıştıranı bulamadığım çöp PN532 modül. 
Satıcıdan alırken gerçek satın aldığınız ürün ile satış sitesindeki resim uyumlu mu?
Şayet benzeri derse resim isteyin. resimdeki modül benim çalışan modülüm gibi olmalı. 
Hatta üzerindeki entegrede NXP yazıyor mu diye sorun. Benimkinde vardı. 

RC522 ve arduino ile program yapmak için kütüphanesini indirip okuma yazma yapmanız size hızlı gelebilir. Fakat ya bu programı PIC ya da STM ya da başka bir işlemci ile yapmak isterseniz ne olacak. Hemen kütüphane arayacaksınız. Belki bulamayacaksınız.
O zaman kütüphanesiz nasıl yazabilirim diye düşünüp zaman kaybedeceksiniz.

İşte bu düşünceden yola çıkarak NFC kartlara KÜTÜPHANESİZ olarak nasıl yazılması gerektiğini burada bulacaksınız.
Kartı tanıyacaksınız. Karta nasıl yazmanız gerektiğini bileceksiniz. Hatta SPI ile RC522 veya PN532 okuyucularla register düzeyinde haberleşip programı yazmanız gerekecek.

Programlardan kısaca bahsedeyim yazının en altında daha ayrıntılı ele alınacaktır.

  1. Program yetkili kapı programı: Bu program okuduğu şirket bilgisi ve kapı yetki bilgisini kontrol edip NFC kart ile kapıyı açmaya yarıyor. Ayrıca bu programda zaman damgası kartın kullanım tarihini depoluyor. Buna göre de yetkiniz olsa bile kullanım tarihi geçmişse yetkilendirilmiyorsunuz. 
    Ayrıca bu programda LOG sistemi var. şayet seri port açık ise bilgileri eş zamanlı olarak seri port üzerinden PC ye aktarır. ( Bunun için PYTHON seri port programı vardır ama siz başka seri port programlarını da kullanabilirsiniz. ) Şayet seri port bağlantısı sorun olursa, o zaman arduino kendi içindeki eproma yazar. Seri port bağlantısı yeniden sağlandığında arduino epromu içindeki bilgiler ilk fırsatta PC ye toplu halde aktarılır. Eprom kayıt 0 dan yeniden başlar. 
  2. Program ise biraz daha ileri giderek daha fazla bilgi depolanarak İZMİR deki toplu ulaşımdaki 90dk metodunu gösteriyor. Başta krediniz oluyor ve 90dk lık duruma göre ve tam öğrenci durumuna göre krediniz kartınızı gösterdiğinizde düşüyor.
    Buradaki mantık şudur : 

 

Ayrıca tüm programlar ekran okuması düzgün olsun diye kart içerisine ASCII olarak yazılır. 
Mesela kredi 1000 rakamı diyelim. byte olarak gösteren programlarla baktığınızda 1 0 0 0 olarak göremezsiniz. bunun yerine 0x31 0x30 0x30 0x30 olarak ascii kodunu görürsünüz programlar da gelen bu ascii bilgisini kimi zaman int şekline döndürür ya da string olarak kullanır.  Programı incelerken bu nfctools çıktısına bakarsanız ne demek istediğimiz anlayacaksınız. 
Kart android programıyla okutulduğunda aşağıdaki gibi bir ekran gelecektir. 
UID: 39:EA:E1:06
İsim: Mehmet (4. blok)
Şirket: izbb      (5. blok)
Kapı: 1,2,5,6     (6. blok) ( Bitmask binary 2 byte şekline çevirin. en sağdan 1 olan yer ekranda gördüğünüz kapı numaraları olacak. 2 byte önce yer değiştirilecek 00 33 gibi olacak sonra binary çevrilecek.
00000000 00110011
Kredi: 1000      (8. blok)
Zaman: 19.05.2025 12:49  (9. blok UNIXTIME:1747658966)
Durum: 01        (10. blok)
olacaktır.
Aşağıdaki resim size 4 5 6 8 9 10 bloklarında bu bilgilerin nasıl depolandığını gösterecektir. 
Neden 7. blok  yok diyorsanız, Bunu kart bilgilerini öğrenmeye başladığınızda anlayacaksınız. Buna dikkat edin.

 

Şimdi artık kartları tanımaya başlayabiliriz.
Ben MIFARE CLASSIC 1K kartını ve NTAG213 etiketini kullandım. Sizlerde projenize göre farklı tipler kullanabilirsiniz.

MIFARE CLASSIC 1K 2K 4K KARTLARI TANIYALIM. (13,56 Mhz) Özellikle bu frekansa dikkat edin. 

MIFARE Classic 1K

  • Toplam hafıza: 1024 byte
  • 16 sektör vardır
  • Her sektörde 4 blok
  • Her blok 16 byte

Toplam blok sayısı:
16 sektör × 4 blok = 64 blok

 

Yukarıdaki tabloya baktığınızda ilk sektörde DATA seçeneği 2 tanedir. Çünkü Sektör 0 ve Blok 0 da UID numarası bulunmaktadır. Bundan dolayı diğer sektörlerden farklı bir dizilimi vardır. Buraya bilgi yazamazsınız. 

ÖNEMLİ:

  • Trailer blokları veri için kullanılmaz (7. blok neden yok sorusu) 

  • Trailer içinde:
    • Key A
    • Key B
    • Erişim bitleri ( ACCESS BITS) bulunur
 
MIFARE Classic 2K Bellek Tablosu
MIFARE Classic 2K, toplam 2048 bayt belleğe sahiptir. Bu bellek 32 sektöre ayrılmıştır. Her sektör 4 bloktan oluşur ve her blok 16 bayt veri saklar.
    • Sektör Sayısı: 32 (Sektör 0 – 31)
    • Sektör Başına Blok: 4 (Blok 0 – 3)
    • Toplam Blok Sayısı: 128 (Blok 0 – 127)

Sektör No Blok No (Mutlak) Blok Tipi Fonksiyon / İçerik
Sektör 0 Blok 0 Üretici Bloğu UID (Kart Kimliği) ve Üretici Verisi (Değiştirilemez)
Blok 1 – 2 Veri Bloğu Kullanıcı Verisi
Blok 3 Sektor Fragmanı Key A (6B) + Erişim İzinleri (4B) + Key B (6B)
Sektör 1 – 31 Blok 0 – 2 Veri Bloğu Kullanıcı Verisi
Blok 3 Sektor Fragmanı Key A (6B) + Erişim İzinleri (4B) + Key B (6B)

 
 
MIFARE Classic 4K Bellek Tablosu
MIFARE Classic 4K, toplam 4096 bayt belleğe sahiptir. Bellek tasarrufu sağlamak için yapısı asimetriktir. İlk 32 sektör küçük (4 blok), son 8 sektör ise büyük (16 blok) olarak tasarlanmıştır.
    • Toplam Sektör Sayısı: 40 (Sektör 0 – 39)
        • Sektör 0 – 31: 32 sektör × 4 blok = 128 blok (Her biri 16 bayt)
        • Sektör 32 – 39: 8 sektör × 16 blok = 128 blok (Her biri 16 bayt)

    • Toplam Blok Sayısı: 256 (Blok 0 – 255)

Sektör Aralığı Sektör İçi Blok Blok Tipi Fonksiyon / İçerik
Sektör 0 Blok 0 Üretici Bloğu UID (Kart Kimliği) ve Üretici Verisi (Değiştirilemez)
(Küçük Sektörler) Blok 1 – 2 Veri Bloğu Kullanıcı Verisi
Blok 3 Sektor Fragmanı Key A (6B) + Erişim İzinleri (4B) + Key B (6B)
Sektör 1 – 31 Blok 0 – 2 Veri Bloğu Kullanıcı Verisi
(Küçük Sektörler) Blok 3 Sektor Fragmanı Key A (6B) + Erişim İzinleri (4B) + Key B (6B)
Sektör 32 – 39 Blok 0 – 14 Veri Bloğu Kullanıcı Verisi (Genişletilmiş Veri Alanı)
(Büyük Sektörler) Blok 15 Sektor Fragmanı Key A (6B) + Erişim İzinleri (4B) + Key B (6B)

NOT: 1K ve 2K kartlarda sektör yapısı birebir aynıdır fakat 1K da 16 sektör 2K da ise 32 sektör vardır. 
4K kartlarda ise durum biraz daha farklıdır. 
4K da 0-31 sektörler arası 2K kartlardaki gibidir. Fakat 32-39 sektör arasında her sektörde 16 blok vardır. 
Kart tibi ne olursa olsun Her sektörün son bloğu TRAİLER bloktur ve buraya bilgi yazılırsa blok okunamaz hale geleceğinden buradaki şifreleri sadece güvenlik komutunda okuma olarak kullanabilirsiniz. 

UID Nedir? Neden Önemli?

UID (Unique Identifier):

  • Kartın fabrikada verilen kimliği
  • Genelde 4 byte (bazı kartlarda 7 byte)
  • Blok 0 içinde saklanır
  • Değiştirilemez (bazı klon kartlar hariç)
  • UID + kart içi veri birlikte kullanılır
  • Sadece UID’ye güvenmek zayıf güvenliktir

Bizler sadace DATA kısımlarını kullanırız. Trailer blokları KARTA ERİŞİM BİLGİSİ VE ŞİFRELERİ tutar. Bu blok düzeni bozulursa o bağlı olan bloklara erişilemez. Kartın tamamına değil. Mesela 4 5 6. Bloklara yazdınız. Bu verilere erişebilmek için 7. Bloktaki şifrelere ihtiyacınız olacaktır.
Data blokları 16byte tan oluşur. Şayet buraya yazacağınız veriyi 17 karakter yazmaya çalışırsanız özellikle 6. Blokta bunu yaparsanız, kalan 1 byte 7. Bloğa yazılır ve KEY A dediğimiz şifre bozulur. Kartı tasarlayanlar erişim yanlışlıkla bozulmasın diye KEY A ve KEY B şifreleri koymuşlar. İsterseniz Key A isterseniz Key B ye göre data bloklarına erişebilirsiniz.
Şayet Trailer bloklardaki Access bits denilen bit ler bozulursa şifre doğru bile olsa o bloğa erişim yasaklanabilir. Bundan dolayı TRAILER BLOKLARA VERİ YAZMAMAK İÇİN DİKKAT ETMELİSİNİZ.
Fakat bunun yanı sıra kartın veri yazdığınız bloklarını kimse görmesin, diğer okuyucular bile okuyamasın diyorsanız kendi KEY A ve KEY B şifre bytelarını değiştirmek için TRAILER BLOKLARA YAZABİLİRSİNİZ. Şifreyi unutursanız karttaki o bloktaki bilgilere veda edersiniz. Çünkü şifre doğru değilse erişim bitleri bozulmamış bile olsa o bloklardaki verilere erişemezsiniz. Bu size ne sağlıyor. Bu güvenlik sağlar. Mesela toplu taşıma kartlarını okumak istediğinizde sadece UID okunur verilere ulaşamazsınız. Çünkü kart güvenlik amacıyla Key A ve Key B olarak şifrelenmiştir.

Mifare classic 1K kartlar genelde fabrika çıkışı fiziksel yazabileceğiniz formatta gelir. Bunlarda KeyA =00 00 00 00 00 00 olacaktır ya da FF FF FF FF FF FF olacaktır. Key B ise FF FF FF FF FF FF olacaktır. Bu kartı isterseniz NFCTOOLS ile formatlayabilirsiniz. Bu şekilde şifreler doğru olacaktır.
Fakat NDEF formatında bir bilgi yazmaya kalkarsanız işte o zaman Key A ve Key B değişecektir. NDEF formatında bilgi okumak isteyen programlar bu düzende okuyabilecektir. NFC TOOLS programıyla read memory dediğinizde aradaki farkı görebilirsiniz. Şayet kartın TRAILER bloklarına yanlışlıkla da olsa bir şey yazmadıysanız bu program kartınızı okur ve formatlar.

UID: her kartın benzersiz bir UID numarası vardır. Bu sadece mifare magic card denilen klonlama için üretilen kartlar haricindekilerdedir. Şayet elinizde KLONLANABİLİR MAGIC CARD varsa bu kartlarda UID istenildiği şekilde değiştirilebilir. Bu kartı kullanan kişiler sizin kartlarınızın şifrelerini biliyorlarsa kopyalayabilirler UID dahil olarak.
Bunun dışında standart kartlarda UID değiştirilemez.

Mifare classic kartların içindeki hafıza 15 sektör ve her sektörde 4 blok olarak 64 blokluk bir yapıya sahiptir. 0. Blok UID ve erişime ayrıldığı için 0 blok kullanılmaz. 1 ve 2 Bllokları data olarak kullanılabilir ama genelde kullanılmıyor. Her sektörün 4. Bloğu TRAILER bloktur özel bir durum olmadıkça değiştirilmez.
Buna göre yukarıdaki tabloya bakarsanız verileri yazabileceğiniz DATA alanlarını görebilirsiniz.

NDEF Formatını NFC kartlarda kullanma.

Fiziksel yazma ve okumada her data bloğunu kullanabilirsiniz. Fakat NDEF formatında yazıyorsanız aşağıdaki tablodaki gibi bilgileri bir düzen içerisinde yazmalısınız. NDEF formatı 4. Bloktan başlar. Bu bir standarttır. NDEF 
Ayrıca bu bilgilerde size yol gösterecektir. Ben programlarımda fiziksel okumayı kullandım NDEF kullanmadım. Fakat bu konuda da bilginiz olsun. İleride bu dokümana bu şekilde okuyan programlarda eklenecektir. 
Bu konuda dikkat etmeniz gereken farklılıklar aşağıdadır. 

Mifare Classic 1K kartlar genelde fabrika çıkışı şifresiz formatta gelir. Bunlarda Key A ve Key B değerleri genellikle FF FF FF FF FF FF veya 00 00 00 00 00 00 olacaktır. Bu kartı boş haliyle kendi projelerinizde bu şifreleri kullanarak doğrudan okuyup yazabilirsiniz.

Ancak dikkat edilmesi gereken çok kritik bir detay vardır: Şayet bu kartı NFC Tools gibi bir programla akıllı telefonların ortak dili olan NDEF formatına çevirirseniz, program arka planda kartın sektör şifrelerini (Key A) otomatik olarak değiştirir. Sektör 0 için Key A A0 A1 A2 A3 A4 A5, veri sektörleri için ise D3 F7 D3 F7 D3 F7 yapılır. Telefonlar kartı okurken bu standart NDEF anahtarlarını bildikleri için hafızayı (Read Memory) size yine de gösterebilirler. Fakat siz kütüphanesiz kendi yazdığınız Arduino programınızda hala eski FF FF FF FF FF FF şifresiyle bu kartı okumaya çalışırsanız ‘Authentication Failed’ (Kimlik Doğrulama Hatası) alırsınız. Bu durum kartın bozulduğu anlamına gelmez, sadece kartın artık NDEF dünyasına ait yeni şifrelerle korunduğunu gösterir. Ayrıca şunu da söyleyebiliriz. NDEF formatını oluşturanlar mifare kartlarla uyum sağlamak için KEY A da şifre değişikliğine gitse de KEY B şifresini FF FF FF FF FF FF olarak bırakmışlardır. yani fiziksel olarak erişmek isterseniz KEY B ile blok okumalarını fiziksel olarak yapabilirsiniz. 
Bununla birlikte 0. sektör 1. blok ve 2. blokta yazılan 03 E1 kodları bu kartın NDEF olarak formatlandığını gösteriyor. NFCtools bu 0. sektör bloklarında 03 E1 gördüğünde bu mifare kartının NDEF formatında yazıldığını anlar ve NDEF format gereği 1. sektör 4. bloğu okuyarak NDEF bilgisini almaya başlar ve bilgiyi sona kadar okur. Bunu yaparken ilgili blokları okumak için her sektör değiştiğinde trailer blok şifresini yeniden teyit etmek zorundadır. NDEF formatı aslında NTAG denilen etiketler için geçerlidir. Fakat MIFARE kartlarının çok kullanılmasından dolayı UYUMLU olsun diye bu formatın MIFARE kartlara adaptasyonu bir kurul tarafından yapılmıştır. Bu adaptasyon kodlarına kısaca MAD (Mifare Application Directory) denir. 
Bu kodlama yapısıyla NTAG etiketleriyle uyumlu hale gelip NDEF verisini kullanabilir. 

NDEF formatı kısaca şu şekildedir.

NDEF Mesaj Yapısı (Text yazma için)

Byte

Adı

Açıklama ve Seçenekler

Byte 0

T (Tag)

03 = NDEF Mesajı başlangıcı.

Byte 1

L (Length)

Mesajın toplam uzunluğu (Byte 2’den itibaren ‘FE’ye kadar).

Byte 2

Record Header

Genellikle D1 (Tek bir kısa kayıt, Mesaj Başlangıcı ve Bitişi aynı pakette).

Byte 3

Type Length

Kayıt tipinin uzunluğu. Text için genellikle 01 olur (çünkü tip sadece ‘T’dir).

Byte 4

Payload Length

Gerçek verinin (Dil kodu + metin) toplam uzunluğu.

Byte 5

Type

Kayıt Tipi.
• 54 (ASCII ‘T’): Text (Metin)
• 55 (ASCII ‘U’): URI (Link/Web adresi)
• 53 (ASCII ‘S’): Smart Poster

Buraya göre yazacak olursak
[Hizalama Byte’ları] + [03] + [NDEF Mesaj Boyutu] + [D1 01 … Metin Verisi] + [FE]
örnek yazmak istersek de
00 00 03 0c d1 01 08 54 02 65 6e 48 65 6c 6c 6f FE olacaktır.
Baştaki 00 00 hizalama için verilmiş boş bytelardır. Tabloda yoktur.
Asıl NDEF 03 ile başlıyor.
sonra gelen 0C kendisinden sonraki 12 byte benim yazdığım bilgidir diyor.
 D1 mesaj başlangıcı dese de bir başlama byte tır. Fakat mesajdan önce bazı parametrelerin ayarlanması gerekir.
Mesela aşağıdaki tabloya göre type length kısmı ayarlanır. 

Kayıt Türü

3. Byte (Type Len)

5. Byte (Type)

 

Düz Metin (Text)

01

54 (‘T’)

 

Web Sitesi (URL)

01

55 (‘U’)

 

Mime Tip
(Özel Durum)

08

61 70 70…

 

URL parametreleri ise aşağıdaki gibidir. URL kodu yazıldıktan sonra parametre yazılır. Sonrasında da URL nin kendisi yazılır. 

HEX Kod (1 Byte) Temsil Ettiği Protokol / Parametre
0x00 No Prefix (Kısaltma yok, URL neyse aynen yazılmıştır)
0x01 http://www..
0x02 https://www..
0x03 http://
0x04 https://
0x05 tel: (Telefon araması tetiklemek için)
0x06 mailto: (E-posta göndermek için)
0x0d ftp://ftp.
0x1d

file://

Sonrasında Payload Length ayarlanır. Bu da aşağıdaki tabloya göre ayarlanır.

Byte Konumu

Adı

Açıklama

Byte 6

Status Byte

Dil kodunun uzunluğunu ve karakter kodlamasını (UTF-8/UTF-16) belirler.

Byte 7-8

Language Code

Dil bilgisi (Örn: en veya tr).

Byte 9+

Actual Text

Asıl mesaj ( HELLO )

Bu mesajın sonundaki FE ise mesajın sonundaki nokta gibidir. Verinin bittiğini gösterir. Şayet NDEF formatı yazdıysanız Yazdığınız mesaj 35 karakterden oluşuyorsa 5 byte 4. Bloğa yazıldıysa ardından gelen 16 byte 5. Bloğa yazılır. Ardından gelen 14 byte 6. Bloğa yazılır. Sonunda da 6. Bloğun 15. Byte FE olarak yazılır ve kapatılır.
Ndef formatında 4 5 6 bloklara sığmayan bir mesaj varsa bu mesaj yine 4. Bloktan başlar 4 5 6. Bloklara yazar 7. Blok olan TRAILER bloğunu atlayarak 8. Data bloğuna yazar. Tüm okuyucularda bu şekilde yazıldığını bildiğinden FE değerine kadar okur.

Ayrıca ilk tabloda type length kısmında yazan 0C sayısı 12 byte bilgi olarak okuyacaksın der. Buna kendi yazıldığı byte dahil edilmez. Bu 12 byte mesajın son byte ıdır. FE bu sayıya dahil değildir.

Not: Tablolar başlangıçtaki 00 00 gibi hizalama byte ları olmadan yapılmıştır. Bundan dolayı verilen byte numaraları 2 birim kayabilir. Fakat yine de dizilim tablodaki gibi olacaktır.

Yukarıda verdiğimiz NDEF hello satırının tam açıklaması budur. 

NDEF Satırı: 00 00 03 0c d1 01 08 54 02 65 6e 48 65 6c 6c 6f FE

  • 00 00: Boş dolgu (Null TLV – Blok hizalaması için).

  • 03: NDEF Message TLV başlangıcı.

  • 0C: Kendisinden sonra gelen NDEF paketinin toplam uzunluğu (Ondalık tabanda 12 byte).

  • D1: Record Header (Mesajın başlangıcı, bitişi ve kısa kayıt olduğunu belirtir).

  • 01: Tip Uzunluğu (1 byte, yani sonraki gelen tip belirteci olan ‘T’ veya ‘U’ harfinin boyutu).

  • 08: Payload Uzunluğu (İçerideki net verinin uzunluğu: 8 byte).

  • 54: Record Type (ASCII karşılığı ‘T’ harfidir, yani bunun bir Text kaydı olduğunu söyler).

  • 02 65 6e: Text formatına özel dil tanımı (02 durum byte’ı, 65 6e ise İngilizce anlamına gelen “en” harfleridir).

  • 48 65 6c 6c 6f: Gerçek metin (ASCII karşılığı “Hello”).

  • FE: NDEF Kapanış Byte’ı.

Burada ise URL olarak NDEF satırı örneği ve açıklamasını görüyorsunuz. 

00 00 03 12 D1 01 0E 55 04 67 6F 6F 67 6C 65 2E 63 6F 6D 2E 74 72 FE

  • 00 00 : Boş dolgu (Null TLV – Blok hizalaması için).

  • 03 : NDEF Message TLV başlangıcı.

  • 12 : Kendisinden sonra gelen NDEF paketinin toplam uzunluğu (Ondalık tabanda 18 byte).

  • D1 : Record Header (Mesajın başlangıcı, bitişi ve kısa kayıt olduğunu belirtir).

  • 01 : Tip Uzunluğu (Tipi belirten harfin uzunluğu: 1 byte).

  • 0E : Payload Uzunluğu (Geriye kalan net verinin uzunluğu: 14 byte).

  • 55 : Record Type (ASCII karşılığı ‘U’ harfidir, bunun bir URI/URL kaydı olduğunu söyler).

  • 04 : URI Identifier (URL Ön Eki – Bu kod tek başına https:// anlamına gelir).

  • 67 6F 6F 67 6C 65 2E 63 6F 6D 2E 74 72 : Gerçek veri (ASCII karşılığı sırasıyla google.com.tr harfleridir).

  • FE : Terminator TLV (NDEF veri paketinin bittiğini gösteren kapanış byte’ı).

Buraya kadar MIFARE kart yapısını ve NDEF formatını inceledik.

Şimdi de NTAG213 kart yapısını inceleyelim.

Bu NFC kartların her ikisi de ISO 14443-3A yapısında olduğundan RC522 ve PN532 okuyucular her ikisini de okuyabiliyorlar.
Sadece içlerindeki blok yapısı farklı oluyor. NTAG213 Blok yapısında değil PAGE( sayfa ) yapısındadır.
UID 7 byte olarak okunur. Her sayfa ise 4 byte oluyor. Bundan dolayı UID okunurken özel bir okuma yapılır. Önce 0. Sayfa 3 byte okunur. 4. Byte checksum byte dır.
Sonra ise 1. Sayfadan 4 byte okunur. Toplamda 7 byte UID okunmuş olur.

Okuma ve yazma kısmı ise blok yapısından farklı hatta TRAILER yapısından farklıdır. İlk UID sayfaları okunduktan sonra 4. Sayfadan sonra 39. Sayfaya kadar kullanıcı istediği gibi kullanır seri olarak yazar çünkü arada trailer bloğu gibi bir sorun yoktur.
Fakat 0 ve 1 UID 2. 3. Byte lar ise erişim  sistemidir. Burada bir değişiklik yapılırsa etikete erişilemeyebilir.
40. Byte ve 44. Byte arası etiketin GÜVENLİK paneli gibidir.
44. Sayfa ise sadece okunabilir bir byte tır. Bu da etiketin kaç kez okutulduğunu gösteren bir sayaçtır.

NTAG213 Sayfa Haritası (Genel Yapı)

NTAG213 toplam 45 sayfadan (0’dan 44’e) oluşur. 4-39. Sayfalar kullanıcıya ayrılmıştır.
Toplam 36sayfa x 4byte= 144 byte kullanıcıya ayrılmıştır.

Sayfa No (Hex)

Sayfa No (Dec)

İçerik

Erişim Türü

00h

0

UID (Seri No 0-2), BCC0

Salt Okunur

01h

1

UID (Seri No 3-6)

Salt Okunur

02h

2

BCC1, Dahili Byte, Lock Bytes (Kilitleme)

Okuma/Yazma (Dikkat!)

03h

3

Capability Container (CC)

OTP (Bir kez yazılır)

04h – 27h

4 – 39

Kullanıcı Veri Alanı (144 Byte)

Okuma/Yazma

28h

40

Lock Bytes (Dinamik Kilitleme)

Okuma/Yazma

29h

41

Sayfa Yapılandırma (CFG)

Okuma/Yazma

2Ah

42

PWD (Şifre)

Sadece Yazma

2Bh

43

PACK (Şifre Onayı)

Okuma/Yazma

2Ch

44

Sayfaya Dayalı Sayaç (Counter)

Salt Okunur

Bu tabloda görüldüğü üzere bazı sayfalara dokunulmaması gerektiği gibi bir de özellikle güvenlik için dokunulması gereken sayfalar vardır. Etiket yapısı gereği şifrelenebiliyor. Bu şifreyi yazarken de hangi sayfaların şifre korumalı olacağını seçebiliyorsunuz. Koruma altındakiler şifre yanlış olduğunda okunamıyor ama diğer koruma altında olmayanlar, okunabiliyor ve yazılabiliyor. Aynı zamanda bu son güvenlik bytelarını kullanırken dikkatli olmalısınız. Çünkü okuma korumalı yapılabildiği gibi yazma korumalı da yapılabiliyor bu da tekrar yazılmasını engelleyebiliyor. Bu güvenlik kısmını iyi irdelemeniz lazım.
Benim verdiğim örnek programlarda NTAG213 için şifreleme örneği de var. Buna göre şifreleme yaptığınızda aynı şifre ile okumanız gerekiyor. ŞİFRE 4 BYTE tan oluşuyor.
S,A,F,K olarak şifreyi örnek program yazıyor. Daha sonra okuma programları da şifreyi bu şekilde kontrol ediyor. Ayrıca Android programda da NTAG şifre koyma ve silme bölümleri mevcuttur. 

NFC etiketler dünyasına bir bakalım.

NFC ve RFID dünyası, Mifare Classic ve NTAG serisinden çok daha geniş bir yelpazeye sahiptir. Özellikle güvenlik, kopyalanamazlık (anti-cloning) ve veri kapasitesi açısından farklı standartlar mevcuttur.
İşte en yaygın NFC etiketleri, özellikleri ve bağlı oldukları ISO standartları:

1. ISO Standartları: Temel Protokoller

NFC etiketleri genellikle iki ana ISO standardı üzerinde yükselir:

  • ISO/IEC 14443 (Tip A ve B): En yaygın standarttır. Mifare, NTAG ve temassız kredi kartları bu standardı kullanır. Yakın mesafe (yaklaşık 10 cm) için optimize edilmiştir.
  • ISO/IEC 15693: “Vicinity” (Civar) kartları olarak bilinir. Daha uzun mesafeden (1 metreye kadar) okunabilirler. Genellikle kütüphane ve lojistik sistemlerinde kullanılır (Örn: ICODE serisi).

2. Kopyalanamaz ve Yüksek Güvenlikli Etiketler

Bazı kartların kopyalanamamasının nedeni, içlerinde AES-128 gibi askeri düzeyde şifreleme algoritmaları ve “karşılıklı doğrulama” (mutual authentication) protokolleri barındırmalarıdır.

A. MIFARE DESFire (EV1, EV2, EV3)

  • Özellik: Şu an piyasadaki en güvenli kartlardan biridir. “DESFire” ismi, donanımsal DES/AES şifreleme motorundan gelir.
  • Güvenlik: Kopyalanması neredeyse imkansızdır. Veriler sektörler yerine bir “dosya sistemi” yapısında tutulur.
  • Kullanım: Toplu taşıma (İstanbulkart vb.), yüksek güvenlikli geçiş sistemleri.
  • Standart: ISO 14443-A – ISO 14443-4

B. MIFARE Plus

  • Özellik: Mifare Classic’ten DESFire’a geçiş kartıdır. Classic gibi sektör yapısına sahiptir ama AES şifreleme desteği sunar.
  • Güvenlik: “Security Level 3” moduna alındığında AES şifreleme ile kopyalamaya karşı tam koruma sağlar.
  • Standart: ISO 14443-A – ISO 14443-4

C. NTAG 424 DNA (En Yeni Nesil)

  • Özellik: NTAG213’ün aksine, her okumada değişen (dinamik) bir URL/kod üretir.
  • Güvenlik: “SUN” (Secure Unique NFC) mesajı adı verilen bir sistem kullanır. Kart okunduğunda her seferinde farklı bir şifreli imza gönderdiği için, kartın kopyası oluşturulsa bile imza değişmediği için sistem sahteliği anlar.
  • Kullanım: Lüks tüketim ürünleri doğrulaması (sahte çanta, içki vb. engelleme).

3. Diğer Yaygın NFC Etiket Tipleri

Etiket Ailesi

Standart

Kullanım Amacı

Not

Sony FeliCa

ISO 18092

Ödeme ve Ulaşım

Özellikle Japonya ve Hong Kong’da (Octopus Card) yaygındır. Çok hızlı işlem yapar.

ICODE (NXP)

ISO 15693

Kütüphane ve Depo

Uzun mesafe okuma gerektiren yerlerde tercih edilir.

ST25 Serisi

ISO 14443/15693

Endüstriyel

STMicroelectronics tarafından üretilir, enerji hasadı (energy harvesting) gibi ek özellikleri vardır.

Mifare Ultralight

ISO 14443-A

Tek Kullanımlık

Şifreleme yoktur. Kağıt biletler veya etkinlik bileklikleri için ucuz çözümdür. Ayrıca NTAG213 Ntag 215 gibi etiketlerdir.

4. NFC Forum Etiket Tipleri (Kategorizasyon)

NFC Forum, cihazlar arası uyumluluk için bu etiketleri 5 tipte sınıflandırır:

  1. Tip 1 (Jewel/Topaz): Düşük kapasite, sadece okuma/yazma (ISO 14443-A).
  2. Tip 2 (NTAG/Ultralight): En yaygın tip, hızlı işlem (ISO 14443-A).
  3. Tip 3 (FeliCa): Yüksek hız, karmaşık yapı (ISO 18092).
  4. Tip 4 (DESFire): En yüksek güvenlik ve dosya sistemi (ISO 14443-A/B).
  5. Tip 5 (ICODE): Uzun mesafe iletişimi (ISO 15693).

Bu etiketlerden sonuncusu Tip 5:  UZUN mesafe iletişimi diyor. Acaba ne kadar mesafe? Ya da ne kadar güç gerektirir. Buna bir bakalım. Diğerleri dokunma mesafesi 10 cm ye kadar okunur. Acaba nerelerde kullanılır.

  1. Bu Bir NFC mi yoksa RFID mi?
    Kısa cevap: Her ikisidir.
  • RFID olarak: ICODE, HF (Yüksek Frekans – 13.56 MHz) bandında çalışan bir RFID sistemidir. Genellikle lojistik, kütüphane kitap takibi ve tekstil ürünleri gibi “yakın ama temas gerektirmeyen” alanlarda RFID olarak adlandırılır.
  • NFC olarak: NFC Forum, ISO 15693 standardını “NFC Forum Type 5 Tag” olarak kabul etmiştir. Yani modern bir akıllı telefon (iPhone 7 ve sonrası veya çoğu Android cihaz), ICODE bir etiketi tıpkı NTAG213 gibi okuyup yazabilir.
  1. “Uzun Mesafe” Ne Kadar Uzaktır?

NFC dendiğinde aklımıza gelen 2-4 cm’lik mesafe, ICODE söz konusu olduğunda oldukça genişler.

  • Standart Telefonlar ile: Telefonun anten gücü kısıtlı olduğu için mesafe yine 10-20 cm civarında kalır.
  • Endüstriyel Okuyucular ile: Güçlü bir sabit okuyucu ve geniş bir anten (Gate antenler) kullanıldığında, mesafe 1 metre ile 1.5 metreye kadar çıkabilir.
  • Avantajı: ICODE etiketleri, Mifare gibi “yakınlık” (Proximity) kartları yerine “civar” (Vicinity) kartları olarak geçer. Bir kutunun içindeki tüm kitapları, kutuyu açmadan dışarıdan tarayabilmenizi sağlar.
  1. Anten Gücü ve Enerji Gereksinimi

ICODE etiketleri de pasiftir, yani içinde pil yoktur. Enerjiyi okuyucunun yaydığı manyetik alandan alırlar.

  • Güç Tüketimi: ICODE çipleri çok düşük güçte çalışacak şekilde tasarlanmıştır (mikrowatt seviyelerinde).
  • Okuyucu Çıkış Gücü:
    • RC522 gibi hobi modülleri yaklaşık 200 mW civarında güç verir.
    • Menzili 1 metreye çıkarmak isteyen endüstriyel okuyucular 1 Watt ile 4 Watt arasında RF gücü çıkışı yaparlar.
  • Anten Faktörü: Mesafeyi belirleyen asıl şey sadece “güç” değil, antenin boyutudur (Q faktörü). Okuyucu anteni ne kadar büyükse, manyetik alan o kadar uzağa yayılır ve etiketi o kadar uzaktan “uyandırabilir”.
  1. Neden Mifare Yerine ICODE Seçilir?

Eğer projenizde kartı okuyucuya “dokundurmak” yerine, kullanıcı geçerken cebinden veya çantasından uzaktan algılanmasını istiyorsanız ICODE (Tip 5) doğru tercihtir. Ancak güvenlik (şifreleme) açısından bir DESFire kadar güçlü değildir; önceliği hız ve menzildir.

Özet Karşılaştırma

Özellik

NFC Tip 2 (NTAG)

NFC Tip 5 (ICODE)

Standart

ISO 14443-A

ISO 15693

Frekans

13.56 MHz

13.56 MHz

Maks. Mesafe

~10 cm

~150 cm

Anten Gücü

Düşük

Yüksek (Menzil için)

Kullanım

Ödeme, Etiketleme

Kütüphane, Depo Takibi

Yani özetle; ICODE için “RFID teknolojisinin NFC yeteneği kazanmış halidir” diyebiliriz. Akıllı telefonlarla uyumlu olması, onu endüstriyel takip sistemleri için inanılmaz kullanışlı kılar.

AKILLI ve AKILSIZ kartlar olarak da bakalım.

Bu kartlar hangileridir ve nasıl bir farklılık vardır.
MIFARE NTAG gibi kartlar akıllı kart tipine girmez. Ucuzdurlar, pek çok yerde kullanılabilirler, düşük güvenlikli her yerde kullanılabilirler. Düşük güvenlik deyince hiç güvenlik yok demek değildir. Yukarıdaki bilgilere bakarsanız mifare kartlar UID dahil kopyalanabilir ama bu sadece düşük güvenlikli yerlerde apt kapısı, garaj kapıları gibi yerler ya da fabrika içinde yüksek güvenlik istemeyen kilitli kapılarda kullanılır. Fakat bu bir banka kartı ya da toplu taşıma kartı gibi güvenli kart olmak zorundaysa bu gibi yerlerde klonlanamayan ve yetkisiz erişilemeyen kartlardan bahsediyoruz. Bunlara da AKILLI kart diyoruz.
Bunları ayırmak için kullandığımız bilgi kart ilk okunduğunda elde ettiğimiz SAK değerleridir.
Şayet SAK değeri 0x20 diyorsa bu kartlarda işlemci vardır. Bu kartlar okuyucu ile el sıkışma modunda iletişim başlatırlar. Sonrasında güvenli olduğu anlaşıldığında bilgiler alınır ve verilir.
Bu kartlarda bilgiler blok okuma yazma gibi olmaz. Bir protokolü vardır. Buna göre haberleşmek gerekir.

Bu protokol: APDU (Application Protocol Data Unit) Bu protokol bir komut setinden oluşur.

Bu arada RC522 okuyucular ile bu kartları okumak işkenceye dönüşebilir. Bundan dolayı PN532 okuyucu seçilmesi daha uygundur.
PN532 okuyucu, kendi içerisinde akıllı kartlarla konuşma protokolünü barındırdığından, biz sadece PN532 ile haberleşiriz. PN532 ise kart ile haberleşmeyi, el sıkışmayı tamamlayıp kartın içindeki bilgileri bize hazır sunacaktır. Yani işimiz kolaylaşacaktır.

NFCTOOLS programıyla MIFARE ve NTAG kartlarını READ modunda okursanız kartın uid sini sak değerlerini görebilirsiniz fakat ATS bilgisi gelmez. Çünkü ATS bilgisi, Akıllı kartların ilk el sıkışma anında gönderdiği bir bilgidir yani SAK=0x20 gibi akıllı kartlara özgü bir özelliktir.

1. ATS (Answer To Select) Nedir?

ATS, sadece ISO 14443-4 standardındaki kartlarda (Banka kartları, DESFire, Plus, İşlemcili kartlar) bulunan bir kimlik belgesidir.

  • Görevi: Kart uyandıktan sonra, okuyucuya “Benim iletişim hızım şu, veri paketlerim en fazla bu kadar büyük olabilir, şu protokolleri destekliyorum” bilgisini verir.
  • UID’den Farkı: UID kartın seri numarasıyken, ATS kartın iletişim kapasitesini belirten teknik bir protokoldür.
  • Neden bazılarında aynı? İki tane “Mifare Plus S” kartın ATS değerinin aynı olması normaldir; çünkü aynı fabrikadan, aynı donanım özellikleriyle çıkmışlardır. Tıpkı iki özdeş bilgisayarın model numarasının aynı olması gibi.

2. Neden SAK Değeri Hep 0x20 Çıkıyor?

Programlarımda kullandığım SAK (Select Acknowledge) değeri, kartın katman (layer) bilgisini verir.

  • SAK = 1K 0x08, 2K 0x09 veya 0x19, 4K 0x18: “Ben bir Mifare Classic 1K 2K veya 4K kartıyım” demektir.
  • SAK = 0x20: “Ben ISO 14443-4 uyumlu bir işlemci kartıyım” demektir.
  • SAK = 0x00: “Ben NTAG 213,215,216 etiketlerinden biriyim demektir. 
    Neden NTAG213, 215, 216 aynı SAK numarasına sahiptir. Nasıl ayrılacak. Bunu ayırmak için GET_VERSION (0x60) komutunu göndermek gerekiyor. Bu şekilde hangi etiket olduğunu ayırabiliyorsunuz. 
    Aşağıdaki tablo NTAG etiketlerinin arasındaki farklılıkları gösteriyor.

 

Banka kartları (PayPass/payWave), DESFire ve Plus kartların hepsi üst düzey güvenlikli “Akıllı Kart” protokolünü kullandığı için hepsi okuyucuya 0x20 yanıtını döner. Bu değer okuyucuya şunu der: “Tamam, UID’yi aldın ama benimle veri alışverişi yapmak istiyorsan artık ISO-DEP protokolüne geçmelisin, basit blok okuma komutları bende çalışmaz.”

3. ATQA (Answer To Request) Değeri Neden Değişiyor?

ATQA değeri, kartın antendeki manyetik alana girdiği ilk anda (henüz UID bile okunmadan) verdiği cevaptır.

  • 0x0044 ve 0x0344 Farkı: Buradaki fark genellikle kartın UID uzunluğunu ve çip mimarisini fısıldar.
    • 0x0044 genellikle 7-byte UID’li standart kartlarda görülür.
    • 0x0344 gibi değerler DESFire EV1 gibi kartların kendilerini diğerlerinden ayırmak için (anti-collision aşamasında) kullandığı bir “bayrak”tır.

Kartları kısaca tanıdık. Şimdi de Okuyucuları tanıyalım.

RC522 NFC okuyucuyu arduino dünyasında birçok kişi tanır. Fakat kullananlar bileceklerdir. Okuma kısmında kartların antenleri yeterince iyi olmalılar. Telefonda okunan kart, PN532 de okunan kart, RC522 de okuma yapılırken yaklaştırmak yetmiyor. Bazen eğimli tutmak gerekiyor, bazen de okuma hatası verebiliyor. Bu şekilde bir dert ile karşılaşmak istemiyorsanız MFRC522 yerine PN532 okuyucuyu seçebilirsiniz. Çok daha güzel okuma yapıyor. Daha stabil çalışıyor. Hatta üzerindeki dip switch ile RS232, SPI, I2C modunda haberleşebiliyor.
Hassasiyet olarak 2 okuyucu da farklı görünüyor. RC522 için Bazı anten gücünü arttıran daha iyi algılamasını sağlayan arduino kütüphaneler var. Onları deneyebilirsiniz. Fakat ben aradaki farkı anlayamadım. Yine bazı kartlarda okuma hatası yapabiliyordu.

Bunun yanı sıra Çalışma şekilleri de farklıdır. RC522 register sistemiyle çalışıyor. Karttan okumayı bile kendiniz programla yapmanız gerekiyor.
PN532 ise komut sistemiyle çalışıyor.
Git kart hazırsa oku, bilgileri bana ver diyorsunuz. O kart gelesiye kadar bekliyor ve kartı okuduktan sonra siz hangi veriyi istiyorsanız o bilgileri size veriyor.

PN532 daha kolay gibi görünse de haberleşme biraz hassas bir dengede. Seri olarak birçok bilgi verdiği için katarı doğru zamanlamayla başlatıp, sonuna kadar doğru bir şekilde almanız gerekiyor ve haberleşmede verilen ACK sinyallerini ve IRQ sinyallerini de doğru bir şekilde yakalamanız gerekiyor. Bu hassasiyet için yaptığım kütüphanesiz programda ilgili fonksiyonlar var. Okuma yapıyorsa haberleşmenin sonu için ACK bilgilerini teyit etmesi gerekiyor. Bunun için fonksiyonlar var. Bu fonksiyonlar her okuma ya da yazma işleminden sonra senkronu sağlıyor.

Yani kodlama şu şekilde. KARTI OKU, Bana şu bilgiyi ver, ACK bekle, sonra bilgiyi bekle, tekrar ACK bekle sıralamasıyla gidiyor.

Mümkün olduğu kadar programlar modüler yapıldı ki başka işlemcili programlar için fonksiyonlar aktarılabilsin.
Bunun yanı sıra Arduino harici bir işlemciye geçilecekse zaten Arduino C dili ile yazıldığından STM ve PIC gibi işlemciler için C dili ile küçük ayarlamalar yaparak uyarlayabilirsiniz.

Okuyucuların Kapasitesi

  • RC522: Bu modül fiziksel olarak 13.56 MHz sinyal yayar ve ISO 14443-A protokolünü destekler. DESFire kartlar da bu protokolü kullanır. RC522 ile DESFire kartın UID’sini alabilirsin ama içindeki şifreli dosyalara erişmek için kütüphanenin sunduğu standart fonksiyonlar yetersiz kalır; ham komut (raw command) göndermen gerekir.
  • PN532: Bu modül RC522’den çok daha yeteneklidir.  Bu da 13,56Mhz frekansta çalışır. İçinde yerleşik olarak ISO 14443-4 desteği barındırır. Eğer DESFire ile profesyonel bir çalışma yapacaksanız, PN532 işinizi çok daha kolaylaştırır. Çünkü APDU komutlarını göndermek için hazır fonksiyonları vardır.

KÜTÜPHANESİZ PROGRAMLARA BAKIŞ,

Öncelikle şunu bilmelisiniz. İlk yaptığım programlar RC522 ile yapıldı. Bu programlarda güvenlik önlemleri için de bazı fonksiyonlar kullanıldı. Mesela Arka arkaya 5 kez oku okunamadıysa hata ver gibi. Bu bir güvenlik önlemi hem de kartın okuma hatası vermemesi için bir önlemdi. Ayrıca aynı kart mı diye de kontrol ediliyor. Bu da bir güvenlik önlemi. Çünkü birileri okuyucuyu kullanarak defalarca okuma yaparak şifreyi çözebilir. Bunu engellemiş oluyoruz.
Bunun yanı sıra başka fonksiyonlarda kullanıldı. Fakat bu sadece 1-2 programda yapıldı. Diğerlerinde sadece okuma yazma hesaplama yapıldı.
Arduinoya RTC modül eklendi RTC tarih zaman damgası özellikle kredili sistemde kullanılıyor bile olsa da kapı giriş programlarında LOG tutmak için de zaman damgasına ihtiyaç var. Zaman damgası dediğimiz UNIXTIME olarak yazılan zaman damgasıdır. Normal tarih saat formatında değildir. Bu da hesaplamalarda kolaylık sağlıyor.
Ayrıca BIP fonksiyonları var. Bunlarda başarılı okumada seri monitörde BİP kelimesini ekliyor hatalıysa da BIP BIP olarak ekliyor arduinoya buzzer takılınca bu sesle ikaza dönüşecektir.

Bir de karta bilgi yazmadan bahsetmek lazım. Karta bilgi ASCII kodunda yazılıyor. Okuyucu ise bize ASCII kodunun karşılığını veriyor. Yazarken 1 byte bilgiyi hex olarak 30 yazdığınızda okuyucu size ekranda 0 rakamını gösterecektir. Bir zaman damgası 10 byte yer tutar.
zaman damgasını 1234567890 yazdığınızda HEX 31 32 33 34 35 36 37 38 39 30 olarak yazacaksınız demektir. Bundan dolayı kart bilgileri hex olarak okunduktan sonra ascii olduğu için bunlar string olarak toplanarak ekrana 1234567890 şeklinde yazılır. Hesaplamaya girecekse de bu değer INT değişkenine bu şekilde aktarılır ve hesaplamalarda kullanılır.

Kapı yetki programında izbb denilen şirket adına göre şirket kontrolü yapılır. Şirket kontrolü doğru ise okuyucunun bulunduğu kapı numarası BİTMASK şeklinde yazdığımız kapı binary kodunda var mı diye bakılır. BITMASK 2 bytelık bir bilgidir. Bu da kartların içerisine yazılmadan önce hesaplanır ve 2 byte ya da 4 byte olarak işleme girer. Bu bir binary mantıktır. Şöyle hesaplanır. Örnek: 1001001001101011 gibi bir 16 bitlik 2 byte sayımız var. Bu bize ne anlatıyor. En sağdan itibaren bakarsak. En sağdaki 1 rakamı 1. Kapının yetki dahilinde olduğunu sola doğru 1 seviyesindekiler yetkili olunduğunu 0 lar ise yetkisiz olunduğunu söylüyor. Bu okuyucu ki bizim programlarımızda 2 numaralı kapı sabit olarak işlenecektir. Bu okuyucu kart içerisinde böyle bir binary kod bulunduğunu görürse 2. Bit 1 olduğundan bu kişinin şirket ismi de doğruysa, kapıyı açacaktır. KAPI YETKİLİ DER. Seri monitör neden yetkisiz derse orada ya kapı yüzünden ya da şirket yüzünden diyebilir. Burada sonradan yapılan geliştirmeyle KAPI yetkilendirme programında ZAMAN DAMGASI da kontrol olarak kullanıldı. Bunun sebebi ise misafir kartlarının bir süre sonunda kullanılamaz hale gelmesi. misafir kartı unutsa bile sonradan geldiğinde zaman itibarıyla kart kullanım dışı olduğundan kapılardan geçemeyecektir. 
Kullandığım sabitler
şirket ismi : izbb
kapı numarası: 2
Normal vatandaş için 30 kredi ve 5 kredi hesaplama yapar.
indirimli öğrenci için 15 ve 2 kredi hesaplaması yapar.
buna göre okuyucu işlemlerini yapar.

Kredili sistem de şirket ismine bakar doğruysa kredi hesaplama kısmına gider. Burada ise toplu ulaşım simülasyonu olduğundan durum değişkeninin 2. Byte kısmına bakar. Şayet 2. Byte 1 ise öğrenci indirimi uygular 2 ise şehit gazi gibi kişiler için ücretsiz aktarma der.
Kredili sistemde izmirdeki 90 dk sistemi temel alındığından bu tabloya göre kredi hesaplama yapılır. 2. Byte hangi durumları hangi rakamlarla ilişkilendirir bu program içerisinde bulunacaktır. Fakat RC522 ile yapılan programlar Öğrenci indirime bakmaz. Çünkü durum bilgisinin 2. Byte kısmı NTAG213 de devreye alındı eski programlarda bulamazsınız. Eski programlarda durum 1. Byte a göre aktarma şekli yer alır.

Kart üzerindeki Zaman Damgası ile RTC de gösterilen şimdiki zaman arasındaki fark, 90 dk dan fazla olmuşsa durum 0 yapılır sonra bir aktartma daha yapılırsa 90 dk içinde 1 yapılır ve diğer 90 dk içindeki aktarmalarda durum byte güncellenmez ve 1 kalır.
Ayrıca şöyle bir şey daha ekleyebiliriz bu programları incelediğinizde görebileceğiniz bir şeydir.
90dk dan fazla olduysa
kredi güncellenir
zaman güncellenir
durum güncellenir
2. Aktarma da kredi güncellenir
durum güncellenir
zaman güncellenmez.
3. Aktarma ve sonrasında ise 90 dk içinde
hiçbir şey güncellenmez ücretsiz aktarmadır.
Programlar buna göre çalışır.

NTAG213 için verilerimizi koyduğumuz sayfaları bu tablodan görebilirsiniz.

 
Yukarıdaki tabloda MIFARE kartlarda 4 5 6 8 9 10 blokları kullanılırken neden bu kadar çok sayfa kullanıldı derseniz, cevabı: bloklar MIFARE kartlarda 16 byte olduğundan, burada ise 4 byte =1 sayfa olduğundan 1BLOK karşılığı 4 sayfa kullanılmıştır. 

Kişi Tipi
(Stat)

İlk Geçiş
(90 dk Dışı)

1. Aktarma
(0-90 dk Arası)

2. Aktarma
ve Sonrası

Normal (0)

30 Kredi Düşer

5 Kredi Düşer

Ücretsiz (0 Kredi)

Öğrenci (1)

15 Kredi Düşer

2 Kredi Düşer

Ücretsiz (0 Kredi)

Sosyal (2, 3, 4)

Ücretsiz (0 Kredi)

Ücretsiz (0 Kredi)

Ücretsiz (0 Kredi)

Okuyucu kartların BAĞLANTILARI:

RC522 ve Arduino bağlantısı aşağıdaki gibi olacaktır. RC522 kartı resimde görülen karttır. Bu kart için Arduino ile direkt bağlantı yapılabilir. IO giriş çıkışları 5V seviyede sorun olmadan çalışıyor araya seviye dönüştürücü koyarsanız o zaman RC522 kartının MISO ucunu Arduino nun MISO ucuna direkt bağlantı yapmalısınız.

NOT: Tüm okuyucular Mutlaka 3V3 ile beslenecektir. IO girişleri RC522 de toleranslı olduğundan direkt olarak Arduino dijital pinlerine bağlanabilir. 
Fakat PN532 IO girişlerinde böyle bir tolerans olmadığı için mutlaka arada 5V tan 3V3 e düşürücü seviye düşürücü kart kullanmalısınız. 

Arduino UNO – RC522 Bağlantı Örneği

RC522

Arduino UNO

SDA
SS / CS

D10
SS / CS

SCK

D13 ( CLK )

MOSI

D11 ( MOSI )

MISO

D12 ( MISO )

RST

D9

GND

GND

3.3V

3.3V

Not: UNO’da SPI pinleri sabit donanım pinleridir.
MOSI pinleri MOSI pinlerine, MISO pinleri MISO pinlerine bağlanır.
ÇAPRAZ BAĞLANTI YAPILMAZ.

Not: RC522 Okuyucu her ne kadar MIFARE ve NTAG etiketlerini okuyor olsa da anten probleminden dolayı çok hata yapabilir. Bazı kartları okuyamayabilir ya da hatalı erişim yapabilir.

PN532 SPI Bağlantısı (Arduino UNO)

Level Shifter Bağlantısı ( Kesinlikle kullanılmalı transistörlü tercih edin )

NOT: PN532 MISO ucu ile Arduino MISO ucu direkt bağlanacak.

NOT: Bu pinler Arduino donanımsal spi pinleridir. Ayrıca  D3 ve D2 ise Adafruit kütüphanesiyle aynı yapılmıştır Deneme gerekirse uyumlu olsun diye.
PN532 kütüphanelerinde IRQ sadece I2C bağlantısında kullanılıyor dese de biz KÜTÜPHANESİZ programlarda senkron sağlamak amacıyla IRQ pinini kullanıyoruz.
Yani SPI kütüphanesiz program deneyecekseniz IRQ pinini bağlamalısınız.

NOT: Buradan satın alırken yine de resimdeki benim kullandığıma benziyorsa bile resimdeki ile gönderilecek ürün aynı mı  diye sorun. Ben buradan satın aldım

Yoksa resim temsili deyip bana gönderdikleri çalıştırılamayan, hatta kütüphanelerle bile uyumsuz bir model yollarlar saçınızı başınızı yolarsınız saatleriniz internette geçer ama boşa kürek çekmiş olursunuz. 
Ayrıca buradan aldığım modelde entegre üzerinde orjinal NXP yazısı var. 

ÖNEMLİ NOT: 
PN532 ile çalışıyorsanız NFC kartınızı modüle yapıştırmayın. 1-2cm uzakta tutun. MFRC522 de yapıştırmak zorunda kalıyoruz ama burada yapıştırırsanız manyetik alan etkisi sanırım azalıyor, okuma hatası veriyor. 
Siz de denemeyle bunu göreceksinizdir. Doğru bağlantı yaptıysanız , modül bozuk değil ise programlar direkt çalışacaktır. İsterseniz önce adafruit pn532 kütüphanesiyle mem_dump programıyla kartın içeriğini görün sistem çalışıyorsa kütüphanesiz programları deneyebilirsiniz.

Aşağıda çeşitli kartların NFCTOOLS ile alınmış görüntüleri vardır. Özellikle ilk 2 satır ve SAK satırına dikkat edin. 

 

Yukarıdaki ANKARA İSTANBUL gibi yerlerde kullanılan toplu taşım kartı okuması. 

 

Yukarıdaki İZMİR toplu taşım kartı okuması

 

Yukarıdaki BANKA kartı okuması.

 

Yukarıdaki KART bilgisi Mifare classic Fiziksel blok yazma modunda formatlandığında bu şekilde görünür. 
Şayet NDEF olarak formatlanmışsa Yukarıda NDEF anlatım bölümündeki resim gibi görünür. 

Programları buradan indirebilirsiniz.

RC522  programları
PN532 programları
Android Studio okuma, yazma, kredili sistem ve ntag_şifreleme programı.
Python Seri Port Programlar

Buraya kadar NFC ve okuyucularla ilgili bilgi vermeye çalıştım. 
Bir de hayat içerisinde neler olduğuna bakalım. 
Öncelikle profesyonel programlara bir bakalım. NFCTOOLS programı bu projelerde çok işinize yarayacak. Özellikle MIFARE CLASSIC kartları için. NTAG etiketleri için de bu program kullanılıyor. Fakat program bazı şeyleri size tam vermiyor. Mesela Trailer bloklarındaki şifreleri doğru göstermiyor ya da ÇİN malı NTAG etiketlerinin ayrımını yapmıyor. 
NXP firmasının NXP tag info programını playstore dan indirip, kartlara baktığınızda ya da NTAG etiketlerine baktığınızda, ayrımları çok net görebiliyorsunuz. 
Mesela NFCtools, trailer Key A şifresini 00 00 00 00 00 00  gösterirken Key B şifresini FF FF FF FF FF FF gösteriyor. Siz key A ya göre çalışacağım NFCtools 00 diyor derseniz, hata yaparsınız. NXP tag info programı size gerçek trailer üzerindeki Key A ve Key B şifrelerini gösterecektir. 
Ayrıca NDEF formatlamada NFCtools her şifreyi 00 00 00 00 00 00  gibi göstermesine rağmen 0. sektör 3. blok şifresi Key A: A0 A1 A2 A3 A4 A5 olarak gösterecektir. Bu da NDEF formatında olması gereken şifredir. Yani Kütüphanesiz program yapıyorsanız Elinizdeki kartların gerçek şifrelerini NXP Tag İnfo programına göre yapmanız gerekiyor. 
Bununla birlikte NFCtools programı farklı avantajları oluyor çünkü formatlama, tag kopyalama, yeni NDEF tag yazma gibi işlemler daha kolay oluyor. 
Bununla birlikte NXP tag info programı bize NTAG etiketinin ve MIFARE kartlarının orjinal olup olmadığını gösterir. Çin malı etiketler de Mifare kartlarda bu kütüphanesiz projelerde güzel çalıştı. Amatör işlerde güzel çalışabilir. Fakat güvenlikli profesyonel projelerde kullanmamanızı öneririm.  Nedeni ise Çin mallarında UID klonlanabiliyor olabilir. Ya da kart güvenliği NXP kadar kontrollü olmayabilir. Ayrıca yazma silme yapılıyor. Özellikle Kredili sistemlerde. Bu yazma silme ömrü vardır. Bu ömür çin malı ucuz kartlarda kısa olabilir. Ya da kartların kaplamaları ince olabilir ve kısa sürede kırılabilir çatlayabilir. Yukarıdaki kart resmine bakarsanız kartın içerisinde çepe çevre anten bulunmakta. Bu tip kartlarda anten çatlaması demek kartın okunamaması demektir. 
Bununla birlikte orjinal kartların 500.000 kez yazma, silme ömrü olsa da yine de kartlar 3-5 senede bir değişmek zorunda kalabilir.
Mesela BANKALAR bir kullanım tarihi belirlerler ve bu tarihe göre yeni kart verirler. Bu da yıpranma çalışmama durumlarının önüne geçer. 

Ayrıca NXP Ntag info programı size NFCTOOLS programının göstermediği bir şeyi daha gösterir. 
Bu bilgi ise NTAG etiketinin UID numarasının ilk BYTE’ının FF ile başladığında etiketin orjinal olmadığını gösterir. NXP olsaydı bu byte 0x04 olacaktı. Bu şekilde profesyonel firmalar NTAG etiketlerini kullanırken ilk byte 0x04 olarak aradığında kopya ya da çin malı etiketlerin o okuyucuda okuma hatası vereceğini sadece orjinal etiketin okutulması gerektiğini de söyleyecektir. Yani GÜVENLİK olarak sadece orjinal kabul ediyorum diyorsanız. NTAG etiketlerinde bu UID ilk byte ını da kontrol etmeniz yerinde olacaktır. 

Gelelim bizim ülkemizde ve dünyada bu işlerin nasıl yapıldığına. 
Elbette bizim ülkemizde düzen hala oturmamış durumda. Her belediye, belediye işlemleri için ve toplu ulaşım için kart sistemini uzun yıllardır kullanıyor. 
İhale şartnamesini doğru yazmadıklarından ve bazı güvenlik unsurlarından kaçındıklarından ya da masraf yapmak istememelerinden dolayı, ihaleyi yaparken firma bazlı kapalı okuyucular kullanırlar. Bu firmalar kartlarını da belediyeye kendileri programlayıp verdiklerinden, İHALE yenilendiğinde eski şirket kazanamazsa, tüm okuyucular HURDA oluyor. Tüm kartlar da HURDA oluyor. Maalesef eski şirket şifreleri yeni şirket ile paylaşmıyor. Yeni şirket ise kendi kapalı okuyucularını getiriyor. Bu şekilde o şirkette gidince maalesef bunlarda HURDA oluyor. 
İzmir, Manisa ve bazı şehirler HESAP TABANLI SİSTEM kullanmaya başladılar. 
Bu sistemde krediler kart üzerine yazılmaz. Kart okutulur fakat bu okuma sadece ID numarasını okur. Sonrasında bunu internet üzerinden belediye sunucularına gönderir ve bu sunucularda kredi düşülerek kart kullanıcı toplu ulaşıma biner. Kısa bir zaman alır. 
YA İNTERNET kesilirse diyeceksiniz. Bu da düşünülmüş kart geçirildiğinde internet kesik ise kart onaylanır. Toplu ulaşım aracı bunu kayıt eder ve son durağa geldiğinde ya da internet tekrar bağlandığında bu bilgiyi sunucuya iletir. Sunucu bunu doğrular ve hatasız işlem gerçekleşir. 
Ya YETERSİZ bakiye durumunda birisi internet kesik olduğunda toplu ulaşımı kullanırsa ne olur. Bu durumda ise toplu ulaşım aracı yine ONAY VERİR. Sonrasında internet YETERSİZ bakiye verse de o an işlem yapılmaz. Fakat akşam toplu ulaşım araçları son durağa geldiğinde bu kişilerin kartları yetersiz bakiye ve internetsiz ortamda geçiş yaptığı için BORÇLU kabul edilse de okuyuculara bu kartların ID numarası bildirilir. Bu kara liste günlüktür. Bir dahaki Yetersiz bakiye durumunda internet olmasa bile okuyucu YETERSİZ bakiye mesajı ile kartı ret eder. Bu şekilde kart kullanıcısı tekrar bakiye yüklediğinde bu işlem de sunucuda gerçekleştiğinden dolayı BORÇ bakiyeleri yeni dolumdan hemen düşülür ve hesap eşitlenir. 
Diyeceksiniz ki İhale yenilendiğinde neler olacak. Artık bu kartların okuyucuları değişse bile kart içlerinde kredi olmadığı için sistem kilitlenmeden herkes yeni kart alıp hemen kullanmaya başlayabilecek.

Bu tip belediyelerde tüm şifreler ve krediler sunucuda tutulduğundan yeni ihaleyi alana bunlar teslim edilir ve eski kartlar ile eski okuyucular kullanılır. 

Bundan önceki büyük sorunlara örnek olarak İZMİRİN KENTKART & KARTEK 2015 sorununu sayabiliriz. 
16 yıl KENTKART sistemi kullanıldıktan sonra İHALE yi KARTEK firması kazanınca 1 Haziran 2015 tarihinde Şehirdeki tüm kart okuyucular kilitlenmiş ve problem çözülesiye kadar tüm ulaşım ücretsiz hale getirilmek zorunda kalınmıştır. 
Bu sadece İZMİR belediyesinin değil, Türkiyedeki bir çok belediye ve kurumun sorunuydu. Hala da bazı belediyelerin sorunu devam etmektedir. 

Hesap tabanlı mı yoksa GENEL AMAÇLI AÇIK KAYNAK OKUYUCU lar kullanmalı mı?
Hesap tabanlı çözüm gibi görünse de belediyede sunucu güvenliği devamlı tehdit altında olacaktır. Bu da bir saldırı sorunu yaşanırsa, tüm kart sahiplerinin kartlarını çalışmaz hale getirecektir.
Şifrelerin BELEDİYE bünyesinde tutulması ve Genel amaçlı okuyucuların devreye girmesi ile kart ve okuyucu sistemler HURDA olmayacaktır. 
Nitekim AB ülkeleri bu sisteme geçtiler. 
AB ülkelerinde Hesap tabanlı değil, Genel amaçlı açık kaynaklı kuyucular kullanılır. Aynı zamanda krediler kart içerisinde tutulur. Kartların içerisinde ise DEĞİŞİM süresi bulunmaktadır. Okuma yazma devamlı yapıldığından 3-5 sene içerisinde yeni kart ile değiştirilirler. Bu da kart okuma yazma işleminde hata olmamasını garanti eder. 
AB ülkeleri başka ne yaptı derseniz: MOBİL telefonları NTAG etiket gibi kullanıp banka hesaplarına bağladılar. Bu konuda APPLE firması bile NFC bilgilerini Avrupa ile paylaşmak zorunda kaldı. Yoksa sadece ANDROID cihazlar ile bu yapılabilirdi. Bu da etik olmayacaktı. Bundan dolayı Hem android hem de IPHONE cihazlarının NTAG etiket gibi kullanılmasıyla PLASTİK KARTLARIN kullanılmasının önüne geçilmiştir. Tabii ki bu tüm vatandaşlara aktarılasıya kadar bir süreç alacaktır. 
Bunu yaparken AB ülkeleri KART kullanımlarında VISA ve MASTERCARD gibi ABD firmalarına komisyon ödüyordu. Tüm ödeme işlemlerini MOBİL hayata uyumlu hale getirdiklerinden bu komisyonları ödemiyorlar. 

Peki Türkiye ne yapıyor derseniz,

Türkiye TROY kart ile VİSA MASTERCARD komisyonlarından kurtulmak istiyor. Ulaşımda da TROY kartı kullanılmasıyla vatandaşların VISA MASTERCARD kartlarını almamalarını sağlamaya çalışıyorlar. Bu şekilde yine komisyon veriliyor. Fakat bu komisyon ABD ye ödenmiyor. 
AB bunu mobil uygulamaya NTAG etiketi gibi davranmasını öğretmiş. Bu şekilde komisyon vermiyor. 
Türkiyede 2 handikap var. 
Birincisi APPLE şirketi AB ye tanıdığı bu NFC bilgilerini Türkiyeye vermiyor. Türkiye bunu zorlayamadığı için. 
İkincisi ise Türkiyede bir çok kişide akıllı telefon yok veya NFC li telefon yok. Bu da Türkiyede uygulamanın yetersiz kalacağını söylüyor. 
Şu anda bile BELEDİYELER ve KURUMLARIN kendi başlarına hareket etmelerinden dolayı TROY kart bile ülke içindeki tek erişim ulaşım kartı olarak kullanılamıyor. 

Belki yakın gelecekte TROY kart ya da MOBİL uygulamalar ile kartsız erişim ulaşım sağlanacaktır. Fakat birçok bürokratik meselenin çözümlenmesi gerekiyor. 

İŞTE BURADA YENİ YAZIMIN KONUSU ORTAYA ÇIKIYOR. 
Yeni yazımda NFC li ANDROID 6.0 telefonlarınızı, nasıl NTAG etiketine dönüştürebileceğinizi bulacaksınız. 
Beni Takip Etmeye Devam edin. 

 

 

 

 

 

 

 

Videolar. 

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir