Cara Membuat Aplikasi Android Dengan NFC


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.

Perbandingan NFCGambar 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.

Mode NFC

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.

Komponen NFCGambar 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.

Aplikasi Android Dengan NFC

Tiga solusi untuk mengimplementasika SE adalah:

  • Tertanam di kartu SIM
  • Tertanam di kartu SD
  • Tertanam di chip NFC

Solusi NFC SEGambar 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.

Mode Baca Tulis NFCGambar 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.

Proses NFC TagGambar 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.