Android NFC (Read, Write)

Yakın Alan Teknolojisi (NFC), bu teknolojiyi destekleyen iki uyumlu cihaz arasında kısa mesafeli iletişim sağlayan bir teknolojidir. NFC, bir cihazın verici ve diğerinin alıcı gibi davranmasını gerektirir. NFC özellikli cihazlar iki kategoride gruplanabilir:

  • Aktif

  • Pasif

Aktif NFC cihazları veri gönderip alabilir ve pasif cihazla veri alışverişi yapabilir. Pasif cihazlar, güç kaynağı olmadan diğer NFC özellikli cihazlara veri gönderebilir. Tipik bir pasif cihaz, örneğin reklam sistemi olarak kullanılabilen NFC etiketidir.


NFC teknolojisi en yeni, Android akıllı telefonlarda mevcuttur ve NFC etiketleri aktif reklamcılık, akıllı ödeme vb. için kullanılır. Bu nedenle bu alanda çalışan yazılımcılar için Android'de NFC etiketlerinin nasıl kullanılacağını bilmek önemlidir.



Nasıl Çalışır ?


NFC teknolojisi basittir: radyo frekansı tanımlama (RFID) teknolojisinden geliştirilen bir NFC yongası, kablosuz bağlantının bir parçası olarak çalışır. Başka bir yonga tarafından etkinleştirildikten sonra, birbirine santimetrelerce yakın tutulan iki cihaz arasında küçük miktarlarda veri aktarılabilir. Bağlanmak için eşleştirme kodu gerekmez ve çok düşük miktarda güçle çalışan (veya pasif olarak, daha azını kullanan) yongalar kullandığından, diğer kablosuz iletişim türlerinden çok daha fazla verimlidir.


NFC günlük hayatımızda daha çok kartlarımızı ve cihazlarımı (ve ek olarak banka hesaplarımızı ve diğer kişisel bilgilerimizi) tanımlamak için kullanılır.


NFC'li cihazlar aynı anda üç ana çalışma modunu destekler:

  1. NFC cihazının pasif NFC etiketlerini okumasına ve yazmasına izin veren okuyucu / yazıcı modu.

  2. P2P modu, NFC cihazının diğer NFC akranlarıyla veri alışverişi yapmasına izin verir; bu çalışma modu Android Beam tarafından kullanılır.

  3. NFC cihazının kendisinin bir NFC kartı gibi davranmasına izin veren kart emülasyon modu. Taklit edilen NFC kartına daha sonra NFC satış noktası terminali gibi harici bir NFC okuyucu tarafından erişilebilir.


NFC Teknolojileri Nelerdir ?


Android cihazlar üzerinde NFC kartları ile iletişim kurmak için bir teknoloji listesi bulunmaktadır.


Bu teknolojilere göre NFC etiketlerine erişim sağlayıp okuma/yazma işlemi gerçekleştirilmektedir. NFC kartları ile çalışırken verilerin okunması/yazılması için kullanılan ana format NDEF’tir.


Bir cihaz, NDEF etiketine sahip bir kartı taradığında android üzerinde mesajı ayrıştırır ve NdefMessage içinde mesaj iletimini sağlar. Fakat, NDEF verisi içermeyen bir etiketi taradığımızda veya NDEF verilerinin MIME türünde ya da URI ile eşleşmediği durumlarda olabilmektedir. Bu durumlarda doğrudan etiketle iletişime geçilmesi gerekmektedir. MifareClassic ve MifareUltralight etiketlerine iletişim doğrudan sağlanmalıdır.


Biz demoda NDEF özellikli bir karta önce Android cihazımız ile bir mesaj yazıp ardından aynı cihaz ile yazdığımız mesajı okumayı gerçekleştireceğiz.

Demo Uygulaması


Uygulamamıza başlarken AndroidManifest.xml dosyasından NFC izinlerini tanımlamamız gerekmektedir.

Titreşim iznini ise okuma ve yazma işlemleri sırasında kullanmak için alacağız


Ardından, işlemek istediğiniz NFC Tag teknolojisini / özelliklerini bildirmek için res / xml klasörüne bir res/xml/nfc_tech_filter.xml eklemeniz gerekecektir.


Biz demomuzda NfcB ve NfcF teknolojilerini kullanacağız. Bu nfc teknolojileri ile ilgili daha fazla bilgiye buradan ulaşabilirsiniz.


Hangi etiketleri tespit etmek istediğinizi beyan ettikten sonra, NFC etiketini ilgili etkinliğinize eklemelisiniz. (biz bunun için NFCWriteActivity ve NFCReadActivity sınıflarımızı kullanacağız.)



AndroidManifest dosyasında NDEF_DISCOVRED, TAG_DISCOVERED, TECH_DISCOVERED gibi action'lar gözümüze çarpıyor. Demoya başlamadan önce biraz bunlardan bahsetmek istiyorum.


Android IntentFilters, cihazınızda belirli bir intent için birden fazla uygulama var ise bu intent'i işlemek adına kullanıcıya bir uygulama seçebilmesi için uygulama seçiciyi açacak şekilde çalışmaktadır. Etiket gönderme sistemi (Tag Dispatch System) tarafından üç tür amaç tanımlanabilmektedir:


ACTION_NDEF_DISCOVERED :NDEF yükü olan bir etiket bulunduğunda bir Activity başlatmak amacıyla kullanılmaktadır. Sistem, kendisine gelen NdefMessage içerisindki ilk NdefRecord'u inceler ve bir URI, SmartPoster veya MIME kaydı arar. Bir URI veya SmartPoster kaydı bulunursa, intent veri alanında URI içerir. Eğer bir MIME kaydı bulunursa, intent tür alanında MIME türünü içerir. Bu, activity'lerin etiketlere belirli içeriği hedefleyen IntentFilters kaydetmesine olanak tanır. Etikette bir NDEF yükü varsa bu intent ACTION_TECH_DISCOVERED başlatılmadan önce başlatılır. Herhangi bir activity bu intent'e yanıt verirse ne ACTION_TECH_DISCOVERED ne de ACTION_TAG_DISCOVERED başlatılamaz.


ACTION_TECH_DISCOVERED : ACTION_NDEF_DISCOVERED amacını işleyecek hiçbir Activity bulunamaz ise etiket gönderme sistemi bu intent ile bir uygulama başlatmaya çalışır. taranan etiket bir MIME türüne veya URI'ye eşlenemeyen NDEF verileri içeriyorsa veya etiket NDEF verisi içermiyor ancak bilinen bir etiket teknolojisine sahipse doğrudan başlatılır.


ACTION_TAG_DISCOVERED : ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED intent'lerini işleyen hiçbir activity yoksa bu amaç başlatılır. Mümkünse, en spesifik intent olduğu için ACTION_NDEF_DISCOVERED'i hedeflemelisiniz. En iyi yöntem, bir etiket cihaza okutulduğunda kullanıcıya bir uygulama seçici göstermekten kaçınmaktır. Uygulama, sorunsuz bir deneyim sağlamak için gelen intent'leri olabildiğince kesin olarak tahmin etmelidir.


Bunlara bağlı olarak bir NDEF'in nasıl çalıştığını şu şekilde açıklayabiliriz:


Buraya kadar NFC'nin ne olduğunu, NFC teknolojilerini ve çalışma şeklini incelemeye çalıştık.


Uygulamamızda NFC yazma işlemini gerçekleştireceğimiz NFCWriteActivity ve okuma işlemini gerçekleştireceğimiz NFCReadActivity classları yer almaktadır. MainActivity'den bu ekranlara yönelecek click methodlarımızı tanımlıyoruz.



Anasayfamızı tanımladıktan sonra ilk olarak yazma işlemini gerçekleştireceğimiz NFCWriteActivity sayfasını yazmaya başlayalım ve NFC ile ilgili konulara detaylı bir şekilde bakalım.


İlk olarak bir nfcAdapter tanımlıyoruz. NFCAdapter cihazımız üzerinde yer alan NFC özelliğini kullanmamızı sağlamaktadır.



Activity ayağa kalktığında cihazın NFC desteği var mı? Var ise NFC açık mı? Açık değil ise NFC'nin açılması için yönledirmeleri yaptığımız kısım ise şu şekilde.



Nfc tagleri cihaz ile okunduğunda uygulamamız açıkken onNewIntent fonksiyonu tetiklenmektedir. Eğer uygulama arkaplanda ise onCreate üzerinden tetiklenir. Intent üzerinden etiket bilgisini alıp daha sonra bu etiket bilgisi üzerinden iletişim kurmak istediğimiz teknolojiyi kullanacağız.



Burada yazmak istediğimiz NFC etiketinin ve yazılacak mesajı içeren NdefMessage'ın soyut bir temsilini kabul eder. İlk adım olarak, NFCManager sınıfı NDEF etiketini almaya çalışır.


-Ndef.get(tag): Etiket null olursa uygulama, etiketi "biçimlendirmeye" ve mesajı yazmaya çalışır. Etiket zaten biçimlendirilmişse, Android uygulaması etiket soyut temsiline bağlanmaya ve NdefMessage'ı yazmaya çalışır.


NFC etiketimize yazma işlemini gerçekleştirecek NFCWriteActivity sınıfını bu şekilde tamamlamış olduk. Şimdi kısaca okuma işlemini gerçekleştirecek NFCReadActivity sınıfına bakalım.


NFCWriteActivity'de olduğu gibi NFCReadActivity içinde AndroidManifest tanımlarımızı yaparak başlıyoruz. NFCReadActivity içerisinde de yine cihazın "NFC desteği var mı?" varsa "NFC aktif mi? Değil mi?" kontrollerini yapıyoruz.



Intent içerisinde yer alan eylemin(Intent.action) ACTION_NDEF_DISCOVERED olmasını beklemekteyiz. Bu, uygulamaya gelen NDEF mesajlara en yüksek önceliği vermek için yapılmaktadır, böylece cihazdaki ACTION_NDEF_DISCOVERED öğesini filtreleyen başka bir uygulama, ilettiğimiz mesajı engelleyemeyecektir..


İlgili geliştirmeleri yaptıktan sonra uygulamamız bir NFC destekli etikete basit bir mesaj

yazıp okuyacak duruma gelmiş durumda. Yaptığımız örneğin kaynak kodlarına buradan ulaşabilirsiniz.


Uygulama ile ilgili demomuz ise aşağıdaki gibidir.



Github Repo: https://github.com/klztrk/AndroidNFC


Referanslar :

https://medium.com/coding-in-simple-english/android-nfc-made-easy-b99721bfb88f

https://medium.com/@xabaras/android-nfc-reading-writing-non-ndef-data-3ed0f9c085d7

https://medium.com/the-almanac/how-to-build-a-simple-smart-card-emulator-reader-for-android-7975fae4040f

https://expertise.jetruby.com/a-complete-guide-to-implementing-nfc-in-a-kotlin-application-5a94c5baf4dd

https://medium.com/@ssaurel/create-a-nfc-reader-application-for-android-74cf24f38a6f

https://developer.android.com/guide/topics/connectivity/nfc


#Android #NFC #NDEF #nfcread #nfcwrite #androidnfc

0 yorum

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2020 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın