NFC (near field communication) adalah teknologi konektifitas nirkabel jarak pendek berbasis standar yang dapat membuat interaksi dua arah yang sederhana dan intuitif antar perangkat elektronik. Komunikasi antara dua perangkat NFC dilakukan secara nyaman yaitu dengan menyentuh satu sama lain.
Sebagai contoh, pada ponsel yang terintegrasi dengan teknologi NFC, kamu dapat dengan mudah menyentuhkan ponsel kamu ke perangkat NFC lain untuk membeli barang, berbagi kartu bisnis, mengunduh kupon diskon, dan lain-lain. Kamu akan melihat lebih banyak penggunaan berbasis NFC yang dikembangkan kedepannya.
Artikel ini mengenalkan teknologi berbasis NFC dan mode penggunaannya pada pasar saat ini. Lalu akan dijabarkan bagaimana cara menggunakan NFC dalam aplikasi Android. Terakhir, akan diperlihatkan dua studi kasus tentang bagaimana cara mengembangkan aplikasi pembaca / penulis NFC.
Arsitektur Teknologi NFC
NFC berbasis teknologi RFID pada 13.56 MHz, dengan jarak operasi biasanya hingga 10 cm. Rata-rata kecepatan pertukaran data hingga 42 kilobits/s. Dibandingkan dengan teknologi komunikasi lainnya, keuntungan paling besar dari NFC adalah cepat dan mudah untuk digunakan. Grafik di bawa ini membandingkan NFC dengan teknologi komunikasi lainnya.
Gambar 1: Perbandingan antar teknologi komunikasi jarak pendek
Teknologi NFC memiliki tiga mode: mode emulasi kartu NFC, mode peer-to-peer, dan mode pembaca / penulis yang ditunjukkan pada grafik di bawah ini.
Gambar 2: Keluarga Protokol NFC
Pada mode emulasi kartu, NFC mensimulasikan kartu integrated circuit (IC) RFID, dengan modul keamanan, yang membuat pengguna dapat melakukan pembelian secara aman. Pada mode peer-to-peer, kamu dapat berbagi informasi seperti kartu bisnis antar perangkat NFC yang berbeda melalui koneksi NFC. Kamu juga dapat mengeset koneksi WiFi atau Bluetooh dengan cepat melalui koneksi NFC dan mentransfer file berukuran besar melalui koneksi WiFi atau Bluetooth. Pada mode pembaca / penulis, kamu dapat menggunakan perangkat ber-NFC untuk membaca tag NFC dan meluncurkan tugas-tugas pintar.
Setiap mode didiskusikan dengan detail di bawah ini.
Mode Emulasi Kartu NFC
Sebuah modul NFC biasanya terdiri dari dua bagian: sebuah kontroler NFC dan elemen aman (SE). Kontroler NFC bertanggung jawab untuk komunikasi dan SE bertanggung jawab untuk mengenkripsi dan mendeskripsi data sensitif.
Gambar 3: Komponen perangkat keras NFC
SE melakukan koneksi ke kontroler NFC melalui bus SWP (Single Wire Protocol) atau DCLB (Digital Contactless Bridge). Standar NFC mendefinisikan antar muka logika antara induk dan kontroller sehingga membuat mereka dapat berkomunikasi melalui medan RF. Sebuah aplikasi built-in atau sebuah sistem operasi kecil mengimplementasikan SE, yang mana bertanggung jawab untuk enkripsi dan dekripsi data sensitif.
Tiga solusi untuk mengimplementasika SE adalah:
- Tertanam di kartu SIM
- Tertanam di kartu SD
- Tertanam di chip NFC
Gambar 4: 3 Solusi NFC SE
Operator telekomunikasi, seperti CMCC (China Mobile Communication Corporation), Vodafone, dan AT&T biasanya lebih memilih solusi berabsis kartu SIM yang mana mereka menganjurkan pengguna mereka untuk mengganti kartu SIM lama mereka dengan kartu baru yang sudah tertanam NFC secara gratis.
Mode Peer-to-Peer NFC
Dua perangkat dengan NFC dapat berkomunikasi secara langsung dan mudah untuk berbagi file berukuran kecil seperti kartu bisnis. Dua perangkat ber-NFC juga dapat berbagi file konfigurasi berformat .xml dengan satu sama lain dan membangun koneksi Bluetooth / WiFi untuk berbagi file berukuran besar. Pada mode ini tidak diperlukan modul SE.
Mode Pembaca / Penulis NFC
Pada mode ini, induk NFC dapat membaca / menulis tag NFC. Contohnya adalah membaca informasi berguna dari poster pintar. Pengguna dapat mengakses tautan untuk melihat iklan dan mengunduh kupon diskon.
Gambar 5: Mode Pembaca / Penulis NFC
Perkenalan Pengembang Aplikasi NFC Android
Android mendukung NFC dengan dua paket: android.nfc dan android.nfc.tech. Class utama dari paket android.nfc adalah:
NfcManager: Perangkat Android apat mengatur semua adaptor NFC yang diindikasikan. Namun, karena kebanyakan perangkat Android hanya menudkung satu adaptor NFC, NfcManager biasanya dipanggil secara langsung dengan getDefaultAdapter untuk mendapatkan adaptor yang spesifik dengan ponsel.
NfcAdapter: Ini bekerja sebagai agen NFC, yang mana mirip dengan adaptor jaringan yang berada dalam komputer, di mana ponsel ponsel mengakses perangkat keras NFC untuk menginisiasi komunikasi NFC
NDEF: Standar NFC yang mendefinisikan sebuah format data umum yang disebut NFC Data Exchange Format (NDEF) yang dapat menyimpan dan mengirim berbagai macam hal mulai dari objek bertipe MIME apapun hingga dokumen RTD ultra pendek seperti URL. NdefMessage dan NdefRecord adalah dua jenis NDEF untuk format data yang didefinisikan oleh forum NFC, yang akan digunakan pada kode contoh.
Tag: Android mendefinisikannya sebagai perwakilan object pasif seperti label, kartu, dan lain-lain. Ketika perangkat mendeteksi sebuah tag, Android akan membuat objek tag, lalu menaruhnya di objek Intent, dan terakhir mengirimkannya ke Activity yang sesuai.
Paket android.nfc.tech juga berisi banyak sub-class penting lainnya. Sub-class tersebut menyediakan akses ke fitur teknologi tag yang berisi operasi baca dan tulis. Bergantung pada tipe teknologi yang digunakan, class-class ini dibagi menjadi kategori yang berbeda seperti : NfcA, NfcB, NfcF, MifareClassing, dan lainnya.
Ketika sebuah ponsel NFC-nya diaktifkan dan setelah mendeteksi sebuah TAG, sistem distribusi TAG akan secara otomatis membuat paket informasi intent NFC TAG. Jika ponselnya memiliki lebih dari satu aplikasi yang dapat mengurusi intent ini, sebuah boks pop-up akan menanyakan pengguna aktifitas TAG apa yang akan dilakukan. Sistem distribusi TAG mendefinisikan tiga tipe intent. Ini diurutkan berdasarkan urutan prioritas:
NDEF_DISCOVERED, TECH_DISCOVERED, TAG_DISCOVERED
Di sini kita menggunakan tipe intent-filter untuk mengurusi semua tipe dari TECH_DISCOVERED ke ACTION_TECH_DISCOVERED. File nfc_tech_filter.xml digunakan untuk tipe-tipe yang didefinisikan dalam file TAG. Untuk jelasnya, lihat dokumentasi Android. Gambar berikut memperlihatkan Activity dari proses yang cocok ketika ponsel mendeteksi sebuah TAG.
Gambar 6: Proses Pendeteksian Tag NFC
Studi Kasus: Mengembangkan Aplikasi Pembaca / Penulis NFC
Demo berikut ini menunjukkan fungsi pembaca / penulis untuk tag NFC. Sebelum kamu mengakses NFC pada sebuah perangkat dan secara benar mengurus intent NFC, deklarasikan hal-hal berikut ini dalam file AndroidManifest.xml:
<uses-permission android:name="android.permission.NFC" />
Minimal versi SDK yang aplikasi kamu harus duku adalah level 10, jadi deklarasikan hal tersebut dalam file AndroidManifest.xml:
<uses-sdk android:minSdkVersion="10"/> In the onCreate function,you can apply the NfcAdapter: public void onCreate(Bundle savedInstanceState) { …… adapter = NfcAdapter.getDefaultAdapter(this); …… }
Pemanggilan balik Intent berikut menampilkan fungsi pembaca. Jika sistem menyiarkan Intent yang sama dengan NfcAdapter.ACTION_TAG_DISCOVERED, makan kamu dapat membaca informasi yang ada dalam tag dan menampilkannya.
@Override protected void onNewIntent(Intent intent){ if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){ mytag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // ambil tag yang terdeteksi Parcelable[] msgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefRecord firstRecord = ((NdefMessage)msgs[0]).getRecords()[0]; byte[] payload = firstRecord.getPayload(); int payloadLength = payload.length; int langLength = payload[0]; int textLength = payloadLength - langLength - 1; byte[] text = new byte[textLength]; System.arraycopy(payload, 1+langLength, text, 0, textLength); Toast.makeText(this, this.getString(R.string.ok_detection)+new String(text), Toast.LENGTH_LONG).show(); } }
Kode berikut ini menampilkan fungsi penulisan. Sebelum kamu menentukan nilai dari mytag, kamu harus tahu apakah ada tag yang terdeteksi atau tidak, lalu menuliskan informasi ke mytag.
If (mytag==Null){ …… } else{ …… write(message.getText().toString(),mytag); …… } private void write(String text, Tag tag) throws IOException, FormatException { NdefRecord[] records = { createRecord(text) }; NdefMessage message = new NdefMessage(records); // Get an instance of Ndef for the tag. Ndef ndef = Ndef.get(tag); // Enable I/O ndef.connect(); // Write the message ndef.writeNdefMessage(message); // Close the connection ndef.close(); }
Tergantung pada informasi yang dibaca dari tag, kamu dapat melakukan lebih banyak operasi seperti meluncurkan tugas pintar, mengakses situs web, dan lainnya.
Studi Kasus: Mengembangkan Aplikasi Berbasis NFC yang Menggunakan Kartu MifareClassic
Pad ademo ini, kita menggunakan kartu Mifare untuk mengetes pembacaan data dan menggunakan tipe TAG pada kartu, MifareClassic. Kartu MifareClassic biasanya digunakan pada banyak skenario seperti kartu identitas, kartu bis, dan lainnya. Kartu MifareClassic tradisional biasanya memiliki ruang penyimpanan yang dibagi menjadi 16 zona (Sector), tiap zona memiliki empat blok (Block), dan tiap blok dapat menyimpan data sebesar 16 byte.
Blok terakhir dari tiap distrik disebut Trailer yang mana umumnya digunakan untuk menyimpan kunci blok lokal untuk membaca dan menulis data. Ini memiliki dua kunci: A dan B, dan tiap kunci panjangnya 6 byte, nilai standarnya biasanya adalah kunci penuh FF atau 0 yang didefinisikan oleh MifareClassic.KEY_DEFAULT.
Jadi ketika menulis kartu Mifare, kamu pertama perlu memiliki nilai kunci yang benar (memainkan peran protektif) dan otentikasi yang sukses harus dilakukan sebelum pengguna dapat membaca dan menulis data dalam areanya.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.reno" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.NFC" /> <uses-sdk android:minSdkVersion="14" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="org.reno.Beam" android:label="@string/app_name" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> </activity> </application> </manifest>
res/xml/nfc_tech_filter.xml :
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.MifareClassic</tech> </tech-list> </resources>
Sebuah contoh tentang bagaimana cara untuk membaca kartu MifareClassic adalah sebagai berikut:
private void processIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); for (String tech : tagFromIntent.getTechList()) { System.out.println(tech); } boolean auth = false; MifareClassic mfc = MifareClassic.get(tagFromIntent); try { String metaInfo = ""; //Mengaktifkan operasi I/O ke tag dari objek TagTechnology ini. mfc.connect(); int type = mfc.getType(); int sectorCount = mfc.getSectorCount(); String typeS = ""; switch (type) { case MifareClassic.TYPE_CLASSIC: typeS = "TYPE_CLASSIC"; break; case MifareClassic.TYPE_PLUS: typeS = "TYPE_PLUS"; break; case MifareClassic.TYPE_PRO: typeS = "TYPE_PRO"; break; case MifareClassic.TYPE_UNKNOWN: typeS = "TYPE_UNKNOWN"; break; } metaInfo += "Card type:" + typeS + "n with" + sectorCount + " Sectorsn, " + mfc.getBlockCount() + " BlocksnStorage Space: " + mfc.getSize() + "Bn"; for (int j = 0; j < sectorCount; j++) { //Mengotentikasi sebuah sektor dengan kunci A. auth = mfc.authenticateSectorWithKeyA(j, MifareClassic.KEY_DEFAULT); int bCount; int bIndex; if (auth) { metaInfo += "Sector " + j + ": Verified successfullyn"; bCount = mfc.getBlockCountInSector(j); bIndex = mfc.sectorToBlock(j); for (int i = 0; i < bCount; i++) { byte[] data = mfc.readBlock(bIndex); metaInfo += "Block " + bIndex + " : " + bytesToHexString(data) + "n"; bIndex++; } } else { metaInfo += "Sector " + j + ": Verified failuren"; } } promt.setText(metaInfo); } catch (Exception e) { e.printStackTrace(); } }
Ringkasan
Ponsel yang dilengkapi dengan NFC membuat pengguna dapat memiliki apa yang mereka perlukan hanya dengan ujung jari mereka tanpa harus mencari-cari tiket bis atau kartu parkir. Teknologi ini bahkan dapat mengkoneksikan penggunan dengan teman-temannya untuk berbagi informasi, bermain game, dan transfer data. NFC berupaya untuk merangkul baik bekerja dan bermain, sebuah faktor penting yang membuat kesukesannya dan memfasilitasi kehidupan kita kedepannya.
* Artikel ini adalah hasil sindikasi konten dengan Intel Developer Zone. Artikel asli bisa dilihat di link ini.