Aplikasi Sistem Pembayaran Dengan Teknologi Smart Card Near Field Communication (NFC).
Aplikasi Sistem Pembayaran Dengan Teknologi Smart Card
Near Field Communication (NFC)
Disusun Oleh:
Leonardus Eric Febryanto
0822029
Jurusan Teknik Elektro, Fakultas Teknik, Universitas Kristen Maranatha,
Jl. Prof. Drg. Suria Sumantri, MPH no. 65, Bandung, Indonesia
email :
leonardus.eric@yahoo.com
ABSTRAK
Near Field Communication (NFC), diartikan secara harfiah
Komunikasi Medan Dekat adalah seperangkat teknologi konektivitas nirkabel
berbasis teknologi Radio Frequency Identification (RFID) yang menggunakan
induksi medan magnet untuk memungkinkan komunikasi antar perangkat
elektronik dalam jarak yang dekat.
Pada Tugas Akhir ini, dirancang aplikasi pembaca dan penyimpan data
untuk sistem pembayaran. Pembacaan dan penyimpanan data dilakukan
menggunakan Reader ACR122U. Hal ini menjadi lebih mudah, karena aplikasi
yang dirancang terintegrasi dengan sistem authentikasi data dan enkripsi data
yang terhubung langsung pada sistem database server MySQL dan XAMPP.
Data dari Kartu Mifare akan sama seperti dalam database server yang dapat
ditampilkan pada computer/laptop.
Dari hasil pengujian, reader mampu membaca kartu Mifare pada jarak
0cm hingga 7,5cm. Data pada kartu Mifare pun dapat ditampilkan di form
aplikasi dan diintegrasikan dengan data yang ada di database server. Setiap data
yang berubah akan teratat dan terbentuk menjadi file .txt .
(2)
Payment System Application Smart Card Technology
Near Field Communication (NFC)
Created by :
Leonardus Eric Febryanto
0822029
Department of Electrical Engineering Maranatha Christian University
Prof. Drg. Suria Sumantri St.65, Bandung, Indonesia
email :
leonardus.eric@yahoo.com
ABSTRACT
Near Field Communication (NFC), translates literally Near Field
Communication is a set of technology-based wireless connectivity technology
Radio Frequency Identification (RFID), which uses magnetic field induction to
enable communication between electronic devices in close proximity.
In this final project, designed reader application and data storage for the
payment system. Read out and data storage is done using ACR122U Reader. It
becomes much easier, because the application is integrated with the designed
system of data authentication and data encryption system that is connected
directly to the MySQL database server and XAMPP. Data from the Mifare card
will be the same as the database server that can be displayed on a computer /
laptop.
From the test results, Mifare card reader capable of reading at a distance
of 0cm to 7.5 cm. Data on the Mifare cards can also be displayed in the
application form and integrated with existing data in the database server. Any
data that changes will noted and formed into a file. Txt.
(3)
DAFTAR ISI
ABSTRAK ... i
ABSTRACT ... ii
DAFTAR ISI ... iii
DAFTAR TABEL ... v
DAFTAR GAMBAR ... vi
BAB 1 PENDAHULUAN ... 1
1.1
Latar Belakang... 1
1.2
Rumusan Masalah ... 2
1.3
Tujuan ... 3
1.4
Batasan Masalah ... 3
1.5
Metodologi ... 3
1.6
Spesifikasi Alat Yang Digunakan ... 4
1.7
Sistematika Penulisan ... 4
BAB 2 LANDASAN TEORI ... 6
2.1
Near Field Communication ... 6
2.2
RFID (Radio Frequency Identification) ... 7
2.2.1 Cara Kerja RFID ... 7
2.2.2 Aplikasi RFID ... 7
2.2.3 Standarisasi Penggunaan Frekuensi pada RFID ... 7
2.3
Smart Card Reader ACR 122U ... 7
2.4
Mifare 1K ... 8
2.4.1 Prinsip Komunikasi Data pada Mifare 1K ... 9
2.5
Microsoft Visual Studio 2010 C# ... 10
2.6
XAMPP ... 11
BAB 3 PERANCANGAN DAN REALISASI ... 12
(4)
3.2
Perancangan Perangkat Lunak ... 14
3.2.1 Perancangan Form Login ... 14
3.2.2
Perancangan Form Supervisor ... 15
3.2.3
Perancangan Form Registrasi ... 16
3.2.4
Perancangan Form Transaksi ... 17
3.2.4
Perancangan Database ... 19
BAB 4 ANALISA DATA ... 29
4.1
Hasil Perancangan Sistem Pembayaran Menggunakan Teknologi Smart
Card NFC... 29
4.2
Hasil Percobaan Sistem Pembayaran Menggunakan Teknologi Smart
Card NFC... 30
4.3
Pengujian Jarak Pembacaan dan Penulisan Mifare 1K ... 36
4.4
Pengujian Record Data Transaksi dan Registrasi Menuju Database... 37
4.5 Pengujian Pembentukkan File .txt………..……….38
BAB 5 KESIMPULAN DAN SARAN ... 39
DAFTAR PUSTAKA ... 40
LAMPIRAN A : Kode Program
(5)
DAFTAR TABEL
(6)
DAFTAR GAMBAR
Gambar 2.1 Smart Card Reader ACR122U NFC Reader ... 8
Gambar 2.2 Desain Kartu Mifare 1K ... 9
Gambar 2.3 Antarmuka Visual Studio 2010 ... 10
Gambar 3.1 Mifare 1K Memory Map ... 12
Gambar 3.2 APDU Read Data ... 13
Gambar 3.3 APDU Write Data ... 13
Gambar 3.4 Perbedaan Pembacaan Kartu ... 14
Gambar 3.5 Flowchart Registrasi, Start-A ... 20
Gambar 3.6 Flowchart Registrasi, A-B ... 21
Gambar 3.7 Flowchart Registrasi, B-END ... 22
Gambar 3.8 Flowchart Top Up, START-A ... 23
Gambar 3.9 Flowchart Top Up, A-B ... 24
Gambar 3.10 Flowchart Top Up, B-END ... 25
Gambar 3.11 Flowchart Purchase START-A ... 26
Gambar 3.12 Flowchart Purchase A-B ... 27
Gambar 3.13 Flowchart Purchase B-END ... 28
Gambar 4.1 Form Login Aplikasi dan Reader ACR122U beserta Mifare
1K ... 29
Gambar 4.2 Form Aplikasi XAMPP ... 30
Gambar 4.4 Form Register ID dan Password ... 31
Gambar 4.5 Form Supervisor ... 31
Gambar 4.6 Deteksi Kartu ... 32
Gambar 4.7 Form Registrasi customer ... 32
Gambar 4.8 Message Box Show Form Transaction ... 33
Gambar 4.9 Form Transaksi ... 33
Gambar 4.10 Pengecekan kartu ... 34
(7)
Gambar 4.12 MessageBox Peringatan Kekurangan Saldo ... 35
Gambar 4.13 Print Bill ... 35
Gambar 4.14 File .txt yang Ditampilkan pada Komputer/Laptop ... 36
Gambar 4.15 Tabel Record Data pada localhost ... 37
Gambar 4.16 File .txt berhasil diciptakan ... 38
(8)
LAMPIRAN A
KODE PROGRAM
Form Login
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Drawing; using System.Linq; using System.Text;
using System.Windows.Forms; using MySql.Data.MySqlClient;
namespace RFIDRW
{
public partial class Login : Form {
public Login() {
InitializeComponent(); }
private void btnLogin_Click(object sender, EventArgs e) {
//MessageBox.Show(MyRoutine.DBRead());
string query = "select * from user_id where username like '"
+ txtUser.Text.Trim() + "' and password like '" + txtPassword.Text.Trim() + "';";
String str =
@"server=localhost;database=nfcpayment;userid=root;password=;"; MySqlConnection con = null;
MySqlDataReader reader = null;
try {
con = new MySqlConnection(str); con.Open();
String cmdText = query;
MySqlCommand cmd = new MySqlCommand(cmdText, con); reader = cmd.ExecuteReader();
/*The Read() method points to the next record It return false if there are no more records else returns true.*/
(9)
if (reader.Read()) {
frmMain form = new frmMain(); form.Show();
this.Hide(); }
else lblError.Text = "User ID atau Password anda salah..";
}
catch (MySqlException err) {
//Console.WriteLine("Error: " + err.ToString());
lblError.Text = "Error: " + err.ToString(); }
finally {
if (reader != null) {
reader.Close(); }
if (con != null) {
con.Close(); //close the connection
} } } }
}
Form Supervisor
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Drawing; using System.Linq; using System.Text;
using System.Windows.Forms;
namespace RFIDRW
{
public partial class frmMain : Form {
public long retCode;
int hContext, ReaderCount, Protocol, hCard; string sReaderList = string.Empty;
(10)
byte[] sReaderGroup; string errString;
ModWinsCard.SCARD_IO_REQUEST ioRequest; public int SendLen, RecvLen;
public byte[] SendBuff = new byte[262]; public byte[] RecvBuff = new byte[262];
int UidLen;
public byte[] Uid; int cardtype;
string uiStr = string.Empty;
public frmMain() {
InitializeComponent(); establish();
}
/// <summary>
/// Set the controls to its default state.
/// </summary> void InitMenu() {
cmboReader.Items.Clear(); lstLog.Items.Clear();
btnEstablishContext.Enabled = true; btnQuit.Enabled = true;
btnReaderlst.Enabled = false; btnConnect.Enabled = false; btnSetRetryTime.Enabled = false; btnDetectTag.Enabled = false; btnAuthentication.Enabled = false; btnReadBlock.Enabled = false; btnWriteBlock.Enabled = false; btnReset.Enabled = false; }
private void establish() { sReaderList = string.Empty; ReaderCount = 255;
cmboReader.Items.Clear();
byte[] retData;
string readerStr = string.Empty; string tmpStr = string.Empty;
//Establish Context Part
//Establish Context. Pls see SCardEstablishContext definition from ModWinsCard for more info.
(11)
retCode =
ModWinsCard.SCardEstablishContext(ModWinsCard.SCARD_SCOPE_USER, 0, 0,
ref hContext);
lblError.Text = retCode.ToString();
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return;
}
FuncAddToLog("Establish context success."); btnReaderlst.Enabled = true;
//Lis Reader Part
retCode = ModWinsCard.SCardListReaders(hContext, null, null, ref ReaderCount);
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return;
}
retData = new byte[ReaderCount];
//Get the list of reader present again but this time add sReaderGroup, retData as 2rd & 3rd parameter respectively.
retCode = ModWinsCard.SCardListReaders(hContext, sReaderGroup, retData, ref ReaderCount);
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return;
}
//Convert retData(Hexadecimal) value to String
readerStr =
System.Text.ASCIIEncoding.ASCII.GetString(retData);
//Add the readers from readerStr to combobox control
ModWinsCard.LoadListControl(cmboReader, readerStr);
//Select 1st item from the combobox if any
if (cmboReader.Items.Count > 0) cmboReader.SelectedIndex = 0;
//Enable Connect button
if (cmboReader.Items.Count > 0) btnConnect.Enabled = true;
(12)
//Connect Part
retCode = ModWinsCard.SCardConnect(hContext,
cmboReader.SelectedItem.ToString(), ModWinsCard.SCARD_SHARE_EXCLUSIVE, ModWinsCard.SCARD_PROTOCOL_T0 |
ModWinsCard.SCARD_PROTOCOL_T1, ref hCard, ref Protocol);
//Check if it connects successfully
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return;
} else {
FuncAddToLog("Connected to : " + cmboReader.SelectedItem.ToString());
}
SendLen = 5; RecvLen = 10;
RecvBuff = new byte[10];
//Get Firmware Version Command
SendBuff = new byte[5]; SendBuff[0] = 0xFF; SendBuff[1] = 0x00; SendBuff[2] = 0x48; SendBuff[3] = 0x00; SendBuff[4] = 0x00;
ioRequest.dwProtocol = Protocol; ioRequest.cbPciLength = 8;
//The SCardTransmit function sends a service request to the smart card and expects to receive data back from the card.
//ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/secauthn/security/scar dtransmit.htm
retCode = ModWinsCard.SCardTransmit(hCard, ref ioRequest, ref SendBuff[0], SendLen, ref ioRequest, ref RecvBuff[0], ref RecvLen);
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return;
}
//Convert RecvBuff(Hexadecimal) to String
tmpStr =
System.Text.ASCIIEncoding.ASCII.GetString(RecvBuff); FuncAddToLog("Firmware Version : " + tmpStr);
(13)
//grpFunctions.Enabled = true;
btnSetRetryTime.Enabled = true; btnReset.Enabled = true;
//SetRetryTime Part
SendLen = 11; RecvLen = 2;
SendBuff = new byte[SendLen]; RecvBuff = new byte[RecvLen];
//Set Retry time Command
SendBuff[0] = 0xFF; SendBuff[1] = 0x00; SendBuff[2] = 0x00; SendBuff[3] = 0x00; SendBuff[4] = 0x06; SendBuff[5] = 0xD4; SendBuff[6] = 0x32; SendBuff[7] = 0x05; SendBuff[8] = 0x00; SendBuff[9] = 0x00; SendBuff[10] = 0x00;
retCode = Transmit();
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return;
}
btnDetectTag.Enabled = true;
FuncAddToLog("Set Retry to One Success: " + retCode); }
private void lstEstablishContext_Click(object sender, EventArgs e)
{
/*sReaderList = string.Empty;
ReaderCount = 255;
//Establish Context. Pls see SCardEstablishContext definition from ModWinsCard for more info.
retCode =
ModWinsCard.SCardEstablishContext(ModWinsCard.SCARD_SCOPE_USER, 0, 0, ref hContext);
if (retCode != ModWinsCard.SCARD_S_SUCCESS)
{
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode));
return;
}
(14)
FuncAddToLog("Establish context success.");
btnReaderlst.Enabled = true;*/
}
/// <summary>
/// Add item to log(listbox). Use this if your message is in a string form.
/// </summary>
public void FuncAddToLog(string str) {
lstLog.Items.Add(str);
lstLog.SelectedIndex = lstLog.Items.Count - 1; }
/// <summary>
/// Add item to log(listbox). Use this if your message is in a hexadecimal form.
/// </summary>
public void FuncAddToLog(string prefixStr, byte[] buff, string postfixStr, int buffLen)
{
string tmpStr = string.Empty;
//Convert each byte from buff to its string value.
for (int i = 0; i < buffLen; i++)
tmpStr += string.Format("{0:X2}", buff[i]) + " ";
//Add item to log (listBox)
lstLog.Items.Add(prefixStr + tmpStr + postfixStr);
//Select the last item from the listbox.
lstLog.SelectedIndex = lstLog.Items.Count - 1; }
/// <summary>
/// Get Response from Direct Transmit
/// Issue Get Response to fetch the actual response of the card
/// </summary>
public bool GetResponse() {
//Issue Get Response for Tag found
SendLen = 5;
RecvLen = RecvBuff[1];
RecvBuff = new byte[RecvLen]; SendBuff = new byte[SendLen];
//Get Response Command
SendBuff[0] = 0xFF; SendBuff[1] = 0xC0; SendBuff[2] = 0x00; SendBuff[3] = 0x00;
(15)
SendBuff[4] = (byte)RecvLen;
retCode = Transmit();
if (retCode != ModWinsCard.SCARD_S_SUCCESS) return false;
return true;
}
/// <summary>
/// Transmit any command from SendBuff variable and store recieved data to RecvBuff
/// </summary>
public long Transmit() {
string tmpStr = string.Empty;
ioRequest.dwProtocol = Protocol; ioRequest.cbPciLength = 8;
RecvLen = 262;
FuncAddToLog("<<", SendBuff, "", SendLen);
//The SCardTransmit function sends a service request to the smart card and expects to receive data back from the card.
//ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/secauthn/security/scar dtransmit.htm
retCode = ModWinsCard.SCardTransmit(hCard, ref ioRequest, ref SendBuff[0], SendLen, ref ioRequest, ref RecvBuff[0], ref RecvLen);
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return retCode;
}
FuncAddToLog(">>", RecvBuff, "", RecvLen);
return retCode; }
/// <summary>
/// Reinitialize RecvBuff and Sendbuff variable
/// </summary>
public void ClearBuffers() {
RecvBuff = new byte[262]; SendBuff = new byte[262]; }
(16)
private void btnQuit_Click(object sender, EventArgs e) {
//Release Context. Pls see SCardReleaseContext definition from ModWinsCard for more info.
retCode = ModWinsCard.SCardReleaseContext(hContext); this.Close();
Application.Exit(); }
private void btnReaderlst_Click(object sender, EventArgs e) {
/*cmboReader.Items.Clear();
byte[] retData;
string readerStr = string.Empty;
//The SCardListReaders function provides the list of readers within a set of named reader groups, eliminating duplicates.
//ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/secauthn/security/scar dlistreaders.htm
//Get the number of reader found and store it to ReaderCount
retCode = ModWinsCard.SCardListReaders(hContext, null, null, ref ReaderCount);
if (retCode != ModWinsCard.SCARD_S_SUCCESS)
{
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode));
return;
}
retData = new byte[ReaderCount];
//Get the list of reader present again but this time add sReaderGroup, retData as 2rd & 3rd parameter respectively.
retCode = ModWinsCard.SCardListReaders(hContext, sReaderGroup, retData, ref ReaderCount);
if (retCode != ModWinsCard.SCARD_S_SUCCESS)
{
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode));
return;
}
//Convert retData(Hexadecimal) value to String
readerStr =
System.Text.ASCIIEncoding.ASCII.GetString(retData);
//Add the readers from readerStr to combobox control
ModWinsCard.LoadListControl(cmboReader, readerStr);
(17)
if (cmboReader.Items.Count > 0)
cmboReader.SelectedIndex = 0;
//Enable Connect button
if (cmboReader.Items.Count > 0)
btnConnect.Enabled = true;*/
}
private void btnConnect_Click(object sender, EventArgs e) {
/*string tmpStr = string.Empty;
//establishes a connection (using a specific resource manager context)
//between the calling application and a smart card contained by a specific reader.
//If no card exists in the specified reader, an error is returned.
//For more info:
//ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/secauthn/security/scar dconnect.htm if you have MSDN 2005 installed
retCode = ModWinsCard.SCardConnect(hContext,
cmboReader.SelectedItem.ToString(), ModWinsCard.SCARD_SHARE_EXCLUSIVE,
ModWinsCard.SCARD_PROTOCOL_T0 | ModWinsCard.SCARD_PROTOCOL_T1, ref hCard, ref Protocol);
//Check if it connects successfully
if (retCode != ModWinsCard.SCARD_S_SUCCESS)
{
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode));
return;
}
else
{
FuncAddToLog("Connected to : " + cmboReader.SelectedItem.ToString());
}
SendLen = 5;
RecvLen = 10;
RecvBuff = new byte[10];
//Get Firmware Version Command
SendBuff = new byte[5];
SendBuff[0] = 0xFF;
SendBuff[1] = 0x00;
SendBuff[2] = 0x48;
SendBuff[3] = 0x00;
SendBuff[4] = 0x00;
(18)
ioRequest.dwProtocol = Protocol;
ioRequest.cbPciLength = 8;
//The SCardTransmit function sends a service request to the smart card and expects to receive data back from the card.
//ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/secauthn/security/scar dtransmit.htm
retCode = ModWinsCard.SCardTransmit(hCard, ref ioRequest, ref SendBuff[0], SendLen, ref ioRequest, ref RecvBuff[0], ref RecvLen);
if (retCode != ModWinsCard.SCARD_S_SUCCESS)
{
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode));
return;
}
//Convert RecvBuff(Hexadecimal) to String
tmpStr =
System.Text.ASCIIEncoding.ASCII.GetString(RecvBuff);
FuncAddToLog("Firmware Version : " + tmpStr);
//grpFunctions.Enabled = true;
btnSetRetryTime.Enabled = true;
btnReset.Enabled = true;*/
}
private void btnSetRetryTime_Click(object sender, EventArgs e) {
/*SendLen = 11;
RecvLen = 2;
SendBuff = new byte[SendLen];
RecvBuff = new byte[RecvLen];
//Set Retry time Command
SendBuff[0] = 0xFF;
SendBuff[1] = 0x00;
SendBuff[2] = 0x00;
SendBuff[3] = 0x00;
SendBuff[4] = 0x06;
SendBuff[5] = 0xD4;
SendBuff[6] = 0x32;
SendBuff[7] = 0x05;
SendBuff[8] = 0x00;
SendBuff[9] = 0x00;
SendBuff[10] = 0x00;
retCode = Transmit();
if (retCode != ModWinsCard.SCARD_S_SUCCESS)
{
(19)
return;
}
btnDetectTag.Enabled = true;
FuncAddToLog("Set Retry to One Success: " + retCode);*/
}
private void btnDetectTag_Click(object sender, EventArgs e) {
if (!CheckCard()) {
FuncAddToLog("No valid card within detection range."); return;
}
btnAuthentication.Enabled = true; FuncAddToLog(errString);
//authenticate automatically
FrmAuthenticate formAuthenticate = new FrmAuthenticate(); DialogResult dr = formAuthenticate.ShowDialog(this);
//Check if Authentication is successful
if (dr == DialogResult.OK) {
btnReadBlock.Enabled = true; btnWriteBlock.Enabled = true; }
}
/// <summary>
/// Check if recognized card is within detection range.
/// </summary> bool CheckCard() {
if (!isMifareType()) cardtype = 255;
//Set the string to be displayed in the StatusStrip
switch (cardtype) {
case 1: errString = "Mifare UltraLight UID:" + uiStr; break;
case 2: errString = "Mifare 1K UID:" + uiStr; break; case 3: errString = "Mifare Mini UID:" + uiStr; break; case 4: errString = "Mifare 4K UID:" + uiStr; break; case 5: errString = "Mifare DESFire UID:" + uiStr;
break;
case 6: errString = "ISO14443-4 Type A UID:" + uiStr; break;
case 7: errString = "Gemplus MPCOS UID:" + uiStr; break; case 8: errString = "Topaz UID:" + uiStr; break;
(20)
case 9: errString = "FeliCa, 212 kbps UID:" + uiStr; break;
case 10: errString = "FeliCa, 424 kbps UID:" + uiStr; break;
case 11: errString = "ISO14443-4 Type B, 106 kbps UID:"
+ uiStr; break;
default: return false; }
return true; }
/// <summary>
/// Check if Mifare card type is within detection range.
/// Returns True if Mifare or False if not.
/// </summary> bool isMifareType() {
ClearBuffers(); byte[] uidValue;
//Mifare Polling Command
SendBuff[0] = 0xFF; SendBuff[1] = 0x00; SendBuff[2] = 0x00; SendBuff[3] = 0x00; SendBuff[4] = 0x04; SendBuff[5] = 0xD4; SendBuff[6] = 0x4A; SendBuff[7] = 0x01; SendBuff[8] = 0x00;
SendLen = 9; RecvLen = 2;
if (Transmit() != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog(ModWinsCard.GetScardErrMsg(retCode)); return false;
}
if (RecvBuff[0] == 0x61 && RecvBuff[1] == 0x05) return false;
//Get Response Command
SendBuff[0] = 0xFF; SendBuff[1] = 0xC0; SendBuff[2] = 0x00; SendBuff[3] = 0x00;
SendBuff[4] = RecvBuff[1];
(21)
RecvLen = RecvBuff[1];
retCode = Transmit();
if (retCode != ModWinsCard.SCARD_S_SUCCESS) {
FuncAddToLog("Mifare Type Error: " +
ModWinsCard.GetScardErrMsg(retCode));
return false; }
switch (RecvBuff[6]) {
case 0: cardtype = 1; break; // Mifare UltraLight
case 8: cardtype = 2; break; // Mifare 1K
case 9: cardtype = 3; break; // Mifare Mini
case 24: cardtype = 4; break; // Mifare 4K
case 32: cardtype = 5; break; // Mifare DESFire
case 40: cardtype = 6; break; // ISO14443-4 Type A
case 152: cardtype = 7; break; //Gemplus MPCOS
default: cardtype = 255; break; //Unknown card
}
FuncAddToLog("Detected Tag Success: " + retCode);
UidLen = RecvBuff[7];
uidValue = new byte[UidLen];
Array.Copy(RecvBuff, 8, uidValue, 0, UidLen);
Uid = uidValue;
uiStr = MyRoutine.FuncByteAsString(uidValue);
return true;
}
private void btnAuthentication_Click(object sender, EventArgs e) {
//Show Authentication Form
FrmAuthenticate formAuthenticate = new FrmAuthenticate(); DialogResult dr = formAuthenticate.ShowDialog(this);
//Check if Authentication is successful
if (dr == DialogResult.OK) {
btnReadBlock.Enabled = true; btnWriteBlock.Enabled = true; }
}
(22)
private void btnReset_Click(object sender, EventArgs e) {
//Relase Context. Pls. see the summary/description
//from the definition int the ModWinsCard class for more info.
retCode = ModWinsCard.SCardReleaseContext(hContext); InitMenu();
establish(); }
private void btnWriteBlock_Click(object sender, EventArgs e) {
//Show the form for writting value to block.
FrmWriteBlock formWrite = new FrmWriteBlock(); formWrite.ShowDialog(this);
}
private void btnReadBlock_Click(object sender, EventArgs e) {
//Show the form for reading from block
FrmReadBlock formRead = new FrmReadBlock(); formRead.ShowDialog(this);
}
private void frmMain_Load(object sender, EventArgs e) {
}
private void custBtt_Click(object sender, EventArgs e) {
DB dbForm = new DB(); dbForm.ShowDialog(this);
}
}
}
Form Registrasi
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Drawing; using System.Linq; using System.Text;
(23)
using System.Globalization; using MySql.Data.MySqlClient;
namespace RFIDRW
{
public partial class FrmWriteBlock : Form {
frmMain ownerForm; byte BlockNum; int flag;
Person _temporaryPerson;
public Person TemporaryPerson {
get { return _temporaryPerson; } }
public FrmWriteBlock() {
InitializeComponent();
this.Text = "Add New Person"; _temporaryPerson = new Person(); }
public FrmWriteBlock(Person person) {
InitializeComponent();
this.Text = "Edit Person Data"; _temporaryPerson = person;
txtNama.Text = TemporaryPerson.Name;
txtSaldo.Text = TemporaryPerson.Saldo.ToString(); txtAddress.Text = TemporaryPerson.Alamat;
}
public FrmWriteBlock(frmMain owner, int flag) {
InitializeComponent(); ownerForm = owner; this.flag = flag; }
private void FrmWriteBlock_Load(object sender, EventArgs e) {
//Initialize the ownerForm to get handle to main form so it can access the public property/method of
//main form like the SendBuff variable, FuncAddToLog methodm etc.
if (flag != 1) ownerForm = (frmMain)this.Owner;
(24)
//AddressbookDBDataContext db = new AddressbookDBDataContext();
//var query = (from p in db.Persons
// where p.PersonID == db.Persons.Max(x=>x.PersonID)
// select p).Single();
//var y = query.PersonID+1;
//db.SubmitChanges();
string query = "select Max(ID) from customer"; String str =
@"server=localhost;database=nfcpayment;userid=root;password=;"; MySqlConnection con = null;
MySqlDataReader reader = null; int inc = 0;
try {
con = new MySqlConnection(str); con.Open();
String cmdText = query;
MySqlCommand cmd = new MySqlCommand(cmdText, con); reader = cmd.ExecuteReader();
/*The Read() method points to the next record It return false if there are no more records else returns true.*/
if (reader.Read()) {
string temp = reader.GetValue(0).ToString(); inc = int.Parse(temp) + 1;
} }
catch (MySqlException err) {
//Console.WriteLine("Error: " + err.ToString());
MessageBox.Show("Error: " + err.ToString()); }
finally {
if (reader != null) {
reader.Close(); }
if (con != null) {
con.Close(); //close the connection
} }
(25)
}
private void btnCancel_Click(object sender, EventArgs e) {
ownerForm.FuncAddToLog("Write Block Cancelled...."); this.Close();
}
private void btnInput_Click(object sender, EventArgs e) {
byte[] data; string temp;
//Write NAME to block 01
//
//Check if Block Number specified is in valid format
if (!BlockNumCheck("1")) {
return; }
//Get the data (ID) to be written
temp = txtId.Text.Trim(); if (temp.Length < 16) {
//add trailing 'whitespace' if the length of string is below 16
temp = temp.PadRight(16, ' '); }
data = new byte[16];
data = ASCIIEncoding.ASCII.GetBytes(temp); if (data == null)
{
MessageBox.Show("No Valid Data, please try again"); txtNama.Focus();
return; }
//Check if it trying to write on to trailer block
if (!BlockNumTrailerWriteCheck()) {
return; }
write(data);
//Write SALDO to Block 02
//
//Check the Block Number first
(26)
{
return; }
//Get the data (saldo) to be written
temp = txtSaldo.Text.Trim(); if (temp.Length < 16)
{
//add trailing '*' if the length of string is below 16
temp = temp.PadRight(16, '*'); }
data = new byte[16];
data = ASCIIEncoding.ASCII.GetBytes(temp); if (data == null)
{
MessageBox.Show("The amount to be written are not a valid value.");
txtSaldo.Focus(); return;
}
//Check if it trying to write on to trailer block
if (!BlockNumTrailerWriteCheck()) {
return; }
write(data);
/*//Write SALDO to Block 04
//
//Check the Block Number first
if (!BlockNumCheck("4"))
{
return;
}
//Get the data (serial) to be written
temp = txtPass.Text.Trim();
if (temp.Length < 16)
{
//add trailing '#' if the length of string is below 16
temp = temp.PadRight(16, '#');
}
data = new byte[16];
data = ASCIIEncoding.ASCII.GetBytes(temp);
//Check if it trying to write on to trailer block
if (!BlockNumTrailerWriteCheck())
(27)
return;
}
write(data);*/
}
/// <summary>
/// Check if Block Number specified is in valid format
/// </summary>
/// <param name="block">block number to be checked</param> /// <returns>true for valid blocknum, false for invalid
blocknum</returns>
public bool BlockNumCheck(string block) {
//Check and then store the converted block number to BlockNum
if (!byte.TryParse(block, NumberStyles.HexNumber, null, out BlockNum))
{
MessageBox.Show("Writing error - Block Number was incorrect, contact your administrator");
return false; }
return true; }
/// <summary>
/// Check if it trying to write on to trailer block
/// </summary>
/// <param name=""></param> /// <returns></returns>
public bool BlockNumTrailerWriteCheck() {
DialogResult dr;
if (BlockNum < 0x80) {
if ((BlockNum % 4) == 3) {
dr = MessageBox.Show("This is for Trapping
Accidental write to Trailer Block, if you're not sure on how to setup Access Bit..\r\nCancel the operation, otherwise Click OK.",
"Critical Block Chosen to write", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (dr == DialogResult.Cancel)
return false; }
} else {
(28)
{
dr = MessageBox.Show("This is for Trapping Accidental.",
"Critical Block Chosen to write", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (dr == DialogResult.Cancel)
return false; }
}
return true; }
/// <summary>
/// Preapare Write command and write it!
/// </summary>
/// <param name="data">The data to be written</param> /// <returns></returns>
public void write(byte[] data) {
ownerForm.SendLen = 26; ownerForm.RecvLen = 2;
ownerForm.SendBuff = new byte[ownerForm.SendLen]; ownerForm.RecvBuff = new byte[ownerForm.RecvLen];
//Update/Write Command
ownerForm.SendBuff[0] = 0xFF; ownerForm.SendBuff[1] = 0x00; ownerForm.SendBuff[2] = 0x00; ownerForm.SendBuff[3] = 0x00; ownerForm.SendBuff[4] = 0x15; ownerForm.SendBuff[5] = 0xD4; ownerForm.SendBuff[6] = 0x40; ownerForm.SendBuff[7] = 0x01; ownerForm.SendBuff[8] = 0xA0; ownerForm.SendBuff[9] = BlockNum;
Array.Copy(data, 0, ownerForm.SendBuff, 10, 16);
//Transmit the Update or Write Command
ownerForm.retCode = ownerForm.Transmit();
if (ownerForm.retCode != ModWinsCard.SCARD_S_SUCCESS) return;
//Issue Get Response to fetch the actual response of the card
ownerForm.GetResponse();
if (ownerForm.RecvBuff[2] != 0x00) {
(29)
ownerForm.FuncAddToLog(MyRoutine.GetContactLessCardErrMsg(ownerForm.Recv Buff[2]));
} else
ownerForm.FuncAddToLog("Write to Block " + BlockNum.ToString() + " Success: " + ownerForm.retCode); }
private void btnInput2_Click(object sender, EventArgs e) {
//AddressbookDBDataContext db = new AddressbookDBDataContext();
////Write to DB
//_temporaryPerson.Name = txtNama.Text;
//_temporaryPerson.Saldo = int.Parse(txtSaldo.Text);
//_temporaryPerson.Alamat = txtAddress.Text ;
//db.Persons.InsertOnSubmit(_temporaryPerson);
//db.SubmitChanges();
string query = "INSERT INTO customer (NAMA,ALAMAT,SALDO) VALUES('"+txtNama.Text+"','"+txtAddress.Text+"',"+int.Parse(txtSaldo.Tex t)+")";
String strcon =
@"server=localhost;database=nfcpayment;userid=root;password=;"; MySqlConnection con = null;
try {
con = new MySqlConnection(strcon); con.Open();
String cmdText = query;
MySqlCommand cmd = new MySqlCommand(cmdText, con); //cmd.Prepare();
//cmd.Parameters.AddWithValue("@name", "your value here");
cmd.ExecuteNonQuery(); }
catch (MySqlException err) {
MessageBox.Show("Error: " + err.ToString()); }
finally {
if (con != null) {
con.Close(); }
} }
(30)
private void txtId_TextChanged(object sender, EventArgs e) {
}
}
}
Form Transaksi
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Drawing; using System.Linq; using System.Text;
using System.Windows.Forms; using System.IO;
using MySql.Data.MySqlClient; namespace RFIDRW
{
public partial class FrmReadBlock : Form {
frmMain ownerForm; Person _temporaryPerson; int flag;
string billing;
public Person TemporaryPerson {
get { return _temporaryPerson; } }
public FrmReadBlock() {
InitializeComponent(); }
private void btnCancel_Click(object sender, EventArgs e) {
ownerForm.FuncAddToLog("Read Block Cancelled...."); this.Close();
}
private void FrmReadBlock_Load(object sender, EventArgs e) {
(31)
//Initialize the ownerForm to get handle to main form so it can access the public property/method of
//main form like the SendBuff variable, FuncAddToLog methodm etc.
ownerForm = (frmMain)this.Owner;
MessageBox.Show("Letakkan Kartu pada Reader"); }
private void btnBaca_Click(object sender, EventArgs e) {
lblID.Text = read("1"); //Read ID from block number 01
lblSaldo2.Text = read("2").TrimEnd('*'); //Read Saldo from block number 02
string query = "select NAMA from customer where ID = " + lblID.Text.Trim() + ";";
String str =
@"server=localhost;database=nfcpayment;userid=root;password=;"; MySqlConnection con = null;
MySqlDataReader reader = null; try
{
con = new MySqlConnection(str); con.Open();
String cmdText = query;
MySqlCommand cmd = new MySqlCommand(cmdText, con); reader = cmd.ExecuteReader();
/*The Read() method points to the next record It return false if there are no more records else returns true.*/
if (reader.Read()) {
lblNama2.Text = reader.GetValue(0).ToString(); }
}
catch (MySqlException err) {
//Console.WriteLine("Error: " + err.ToString());
MessageBox.Show("Error: " + err.ToString()); }
finally {
if (reader != null) {
reader.Close(); }
if (con != null) {
con.Close(); //close the connection
} }
btnBuy.Enabled = true; btnTopup.Enabled = true;
(32)
}
private void btnBuy_Click(object sender, EventArgs e) {
flag = 0;
itemBox.Visible = true; txtAmount.ReadOnly = true; }
private void btnTopup_Click(object sender, EventArgs e) {
flag = 1;
itemBox.Visible = false; txtAmount.ReadOnly = false; }
/// <summary>
/// Write the data (Saldo) to Card
/// </summary>
/// <param name="curAmount">Current Amount/Saldo</param>
/// <returns></returns>
public void writeAmount(int curAmount) { //Prepare Data to Write
byte[] data; string temp;
FrmWriteBlock formWrite = new FrmWriteBlock(this.ownerForm, 1); //Check the Block Number first
if (!formWrite.BlockNumCheck("2")) {
return; }
//Get the data (saldo) to be written
temp = curAmount.ToString(); if (temp.Length < 16)
{
//add trailing '*' if the length of string is below 16
temp = temp.PadRight(16, '*'); }
data = new byte[16];
data = ASCIIEncoding.ASCII.GetBytes(temp); if (data == null)
{
MessageBox.Show("Calculation Error, Please try again"); return;
}
//Check if it trying to write on to trailer block
if (!formWrite.BlockNumTrailerWriteCheck()) {
return; }
(33)
formWrite.write(data); }
/// <summary>
/// Returns the Data Read from Block Number as string
/// </summary>
/// <param name="block">Block number to be read</param>
/// <returns></returns>
public string read(string block) {
byte BlockNum; byte[] dataRead;
//Check if block number supplied is valid
if (!byte.TryParse(block.Trim(),
System.Globalization.NumberStyles.HexNumber, null, out BlockNum)) {
MessageBox.Show("Block Number invalid, please Contact your administrator.");
//error: please specify hexadecimal value for Block number
return null; }
ownerForm.SendLen = 10; ownerForm.RecvLen = 2;
ownerForm.SendBuff = new byte[ownerForm.SendLen]; ownerForm.RecvBuff = new byte[ownerForm.RecvLen]; //Read Command
ownerForm.SendBuff[0] = 0xFF; ownerForm.SendBuff[1] = 0x00; ownerForm.SendBuff[2] = 0x00; ownerForm.SendBuff[3] = 0x00; ownerForm.SendBuff[4] = 0x05; ownerForm.SendBuff[5] = 0xD4; ownerForm.SendBuff[6] = 0x40; ownerForm.SendBuff[7] = 0x01; ownerForm.SendBuff[8] = 0x30; ownerForm.SendBuff[9] = BlockNum; //Transmit Read Command
ownerForm.retCode = ownerForm.Transmit();
if (ownerForm.retCode != ModWinsCard.SCARD_S_SUCCESS) return null;
//Issue Get Response
ownerForm.GetResponse();
//Check if the 3rd element of RecvBuff array is equals to 0x00
//If not, Error occurs.
if (ownerForm.RecvBuff[2] != 0x00) {
(34)
ownerForm.FuncAddToLog(MyRoutine.GetContactLessCardErrMsg(ownerForm.RecvBuff[2] ));
return null; }
else {
dataRead = new byte[16];
Array.Copy(ownerForm.RecvBuff, 3, dataRead, 0, 16); ownerForm.FuncAddToLog("Data readed at block " + BlockNum.ToString() + " ASCII mode: " +
ASCIIEncoding.ASCII.GetString(dataRead));
return ASCIIEncoding.ASCII.GetString(dataRead); }
}
private void btnExe_Click(object sender, EventArgs e) {
//Calculate Amount
int curAmount = int.Parse(lblSaldo2.Text); int buyAmount = int.Parse(txtAmount.Text); if (flag == 0)
{
if (buyAmount > curAmount) {
string str = "Saldo Anda Kurang " + Math.Abs(curAmount - buyAmount);
MessageBox.Show(str); txtAmount.Focus(); return;
}
else curAmount -= buyAmount; }
else {
curAmount += buyAmount; writeAmount(curAmount); }
writeAmount(curAmount); //Update DB
//AddressbookDBDataContext db = new AddressbookDBDataContext();
//var query = (from p in db.Persons
// where p.Name == lblNama2.Text
// select p).Single();
//query.Saldo = curAmount;
//db.SubmitChanges();
DateTime dt = DateTime.Now;
string datetimemysql = dt.ToString("yyyy-MM-dd HH:mm:ss"); string query = "INSERT INTO transactions
(35)
lblNama2.Text + "'," + int.Parse(lblSaldo2.Text) + ","+ curAmount +",'"+ datetimemysql+"');";
query += "UPDATE customer SET SALDO = "+curAmount+" WHERE ID = "+int.Parse(lblID.Text)+";";
String strcon =
@"server=localhost;database=nfcpayment;userid=root;password=;"; MySqlConnection con = null;
try {
con = new MySqlConnection(strcon); con.Open();
String cmdText = query;
MySqlCommand cmd = new MySqlCommand(cmdText, con); //cmd.Prepare();
//cmd.Parameters.AddWithValue("@name", "your value here");
cmd.ExecuteNonQuery();
billing = "Nama: " + lblNama2.Text + "\nSaldo Awal: " + lblSaldo2.Text + "\nSaldo Akhir: " + curAmount.ToString() + "\nWaktu: " + datetimemysql;
}
catch (MySqlException err) {
MessageBox.Show("Error: " + err.ToString()); }
finally {
if (con != null) {
con.Close(); }
}
lblSaldo2.Text = curAmount.ToString(); btnBill.Enabled = true;
}
private void itemBox_SelectedIndexChanged(object sender, EventArgs e) {
if (itemBox.SelectedIndex == 0) {
txtAmount.Text = "12000"; }
else {
txtAmount.Text = "1000000"; }
}
private void btnBill_Click(object sender, EventArgs e) {
string fileName = @"C:\Bill.txt"; try
(36)
{
// Check if file already exists. If yes, delete it.
//if (File.Exists(fileName))
//{
// File.Delete(fileName);
//}
// Create a new file
using (StreamWriter sw = File.CreateText(fileName)) {
sw.WriteLine("New Bill created: {0}",
DateTime.Now.ToString());
sw.WriteLine("Author: NFC"); sw.WriteLine(billing); }
// Open the stream and read it back.
//using (StreamReader sr = File.OpenText(fileName))
//{
// string s = "";
// while ((s = sr.ReadLine()) != null)
// {
// Console.WriteLine(s);
// }
//}
}
catch (Exception Ex) {
Console.WriteLine(Ex.ToString()); }
btnBill.Enabled = false; }
} }
(37)
LAMPIRAN B
STANDAR ISO/IEC 18092 dan
ISO 14443 A dan B
(38)
ISO/IEC 14443
From Wikipedia, the free encyclopedia
Jump to:
navigation
,
search
ISO/IEC 14443 Identification cards -- Contactless integrated circuit cards -- Proximity cards is
an international standard that defines
proximity cards
used for
identification
, and the transmission
protocols for communicating with it.
[1][2][3][4]Contents
1 Standard
o
1.1 Parts
o1.2 Types
2 Physical size
3 Notable implementations
4 See also
5 References
6 External links
Standard
The standard was developed by the
Working Group 8 of
Subcommittee 17 in
ISO/IEC Joint
Technical Committee 1
.
Parts
ISO/IEC 14443-1:2008 Part 1: Physical characteristics
[1]
ISO/IEC 14443-2:2010 Part 2: Radio frequency power and signal interface
[2] ISO/IEC 14443-3:2011 Part 3: Initialization and anticollision
[3](39)
Types
Cards may be Type A and Type B, both of which communicate via
radio
at 13.56
MHz
. The main
differences between these types concern modulation methods, coding schemes (Part 2) and
protocol initialization procedures (Part 3). Both Type A and Type B cards use the same
transmission protocol described in Part 4. The transmission protocol specifies data block exchange
and related mechanisms:
1.
data block chaining
2.
waiting time extension
3.
multi-activation
ISO/IEC 14443 uses following terms for components:
PCD: proximity coupling device (the
card reader
)
PICC: proximity
integrated circuit card
Physical size
Part 1 of the standard specifies that the card shall be compliant with
ISO/IEC 7810
or ISO/IEC
15457-1, or "an object of any other dimension".
[1]Notable implementations
MIFARE
cards
Calypso (electronic ticketing system)
iCLASS cards and tags by
HID Global
[citation needed] Biometric passports
EMV
payment cards (
PayPass
,
payWave
,
ExpressPay
)
German identity card
(40)
ISO/IEC 18092
1 Scope
This International Standard defines communication modes for Near Field Communication
Interface and Protocol (NFCIP-1) using inductive coupled devices operating at the centre
frequency of 13,56 MHz for interconnection of computer peripherals. It also defines both the
Active and the Passive communication modes of Near Field Communication Interface and
Protocol (NFCIP-1) to realize a communication network using Near Field Communication devices
for networked products and also for consumer equipment. This International Standard specifies,
in particular, modulation schemes, codings, transfer speeds, and frame format of the RF interface,
as well as initialisation schemes and conditions required for data collision control during
initialisation. Furthermore, this International Standard defines a transport protocol including
protocol activation and data exchange methods.
Information interchange between systems also requires, at a minimum, agreement between the
interchange parties upon the interchange codes and the data structure.
2 Conformance
A system implementing the Active and the Passive communication mode shall be in conformance
with this International Standard if it meets all the mandatory requirements specified herein.
It may also implement the NFC-SEC Option as specified in ISO/IEC 13157-1.
3 Normative references
The following referenced documents are indispensable for the application of this document. For
dated references, only the edition cited applies. For undated references, the latest edition of the
referenced document (including any amendments) applies.
(41)
ISO/IEC 13157-1:2010,
Information technology
—
Telecommunications and information
exchange between systems
—
NFC Security
—
Part 1: NFC-SEC NFCIP-1 security services and
protocol
ISO/IEC 14443-2:2010, Identification cards
—
Contactless integrated circuit cards
—
Proximity
cards
—
Part 2: Radio frequency power and signal interface
ISO/IEC 14443-3:2011, Identification cards
—
Contactless integrated circuit cards
—
Proximity
cards
—
Part 3: Initialization and anticollision
ISO/IEC 14443-4:2008, Identification cards
—
Contactless integrated circuit cards
—
Proximity
cards
—
Part 4: Transmission protocol
(42)
BAB I
PENDAHULUAN
Latar belakang, identifikasi masalah, perumusan masalah, tujuan,
pembatasan masalah, metodologi, spesifikasi alat, pembatasan masalah dan
sistematika penulisan dibahas pada bab ini.
1.1
Latar Belakang
Teknologi NFC adalah teknologi terbaru untuk
contactless smart card.
NFC memiliki protokol yang berbeda dibandingkan dengan
contactless MIFARE
dan memiliki keamanan lebih baik dibandingkan contactless MIFARE
[7].
Dalam Tugas Akhir ini akan dikembangkan sistem pembayaran dengan
teknologi NFC. Sistem akan menggunakan komputer dan NFC card reader
sebagai unit pendukung. Adapun Teknologi NFC merupakan seperangkat
teknologi konektivitas nirkabel berbasis teknologi RFID (Radio Frequeny
Identification) yang menggunakan induksi medan magnet untuk memungkinkan
komunikasi antar perangkat elektronik dalam jarak yang dekat.
[10]Teknologi NFC itu sendiri akan diimplementasikan pada suatu sistem
pembayaran (point of sales) yang saat ini sudah menjadi kebutuhan yang penting
terutama bagi bisnis retail maupun pada umumnya, yang merupakan dengan
diimplementasikannya teknologi ini mampu memudahkan user dalam bertransaksi
secara aman, cepat, dan efisien, karena teknologi ini dapat memberikan berbagai
manfaat kepada user seperti intuitif : interaksi NFC tidak membutuhkan kesulitan
hanya dari sentuhan sederhana, versatile : NFC cocok digunakan untuk industri,
NFC pula telah mengikuti standar internasional yang diterapkan oleh
ISO,ECMA,ETSI
[6](43)
Pada Tugas Akhir ini, telah direalisasi dibuat sebuah
prototype yang
merepresentasikan sistem pembayaran dengan menggunakan smart card Mifare
1K sehingga diharapkan keamanan data dan kemudahan akses transaksi menjadi
point penting dalam tujuan pelaksanaan Tugas Akhir ini.
1.2
Rumusan Masalah
Masalah
–
masalah yang akan dibahas pada Tugas Akhir ini adalah :
Bagaimana merancang aplikasi pembaca dan penulis data
menuju Mifare 1K dengan Reader ACR122U.
Bagaimana
membuat
aplikasi
sistem
pembayaran
menggunakan Mifare 1K sebagai pengganti alat pembayaran.
Bagaimana melakukan prosedur read/write sehingga data
tersimpan aman di dalam Mifare 1K.
Bagaimana melakukan peyimpanan data dalam suatu database.
1.3
Tujuan
Tujuan dari Tugas Akhir ini adalah :
Mengimplementasikan teknologi NFC dengan menggunakan
smart card contactless dan card reader NFC ACR 122U
sebagai suatu alat pembayaran.
Menciptakan kemudahan dalam transaksi khususnya dalam
sistem pembayaran yang menggunakan smart card.
1.4
Batasan Masalah
Smart Card Reader yang digunakan menggunakan ACR 122U.
Smart Card yang digunakan menggunakan jenis Mifare 1K.
Pembuatan aplikasi menggunakan bahasa C#.
Keamanan data menggunakan authentikasi data secara default.
Aplikasi diuji coba dalam 1 PC, sehingga data disimpan di
dalam Smart Card Mifare 1K dan di dalam database SQL.
(44)
1.5
Metodologi
Metodologi dalam Tugas Akhir ini adalah dengan eksperimental
sehingga hasilnya dapat diuji. Langkah-langkahnya adalah :
Mempelajari Modul ACR 122U, bahasa pemrograman C#, datasheet
smart card contactless.
Mendesain prototype aplikasi.
Merancang sistem pembayaran dengan smart card reader dengan
teknologi NFC.
Membuat kode program untuk mengaktifkan sistem pembayaran yang
diharapkan..
Menguji keberhasilan komunikasi dan keamanan data sekaligus
penyimpanan data dalam database SQL Server.
Menguji aplikasi dalam suatu jaringan peer to peer.
1.6
Spesifikasi Alat Yang Digunakan
Smart Card Reader yang digunakan adalah ACR122U NFC.
Smart Card yang digunakan memiliki teknologi Kartu Mifare 1K
dengan ISO 14443 A dan B.
Software yang digunakan adalah :
a.
Microsoft Visual Studio 2010.
b.
Microsoft SQL Server Management Studio.
c.
XAMPP dan MySQL untuk database server.
1.7
Sistematika Penulisan
Sistematika pembahasan laporan Tugas Akhir ini disusun menjadi
lima bab, yaitu sebagai berikut :
Bab I PENDAHULUAN
Bab ini membahas tentang latar belakang, identifikasi masalah,
perumusan masalah, tujuan, pembatasan masalah, metodologi,
spesifikasi alat, serta sistematika penulisan.
(45)
Bab II LANDASAN TEORI
Bab ini membahas teori-teori yang akan digunakan untuk merancang
dan merealisasikan sistem pembayaran menggunakan teknologi smart
card near field communication yang meliputi pembahasan tentang
pengetahuan dasar teknologi NFC,
smart card contactless,
RFID,
smart card reader ACR 122U, dan C#.
Bab III PERANCANGAN DAN REALISASI
Bab ini berisi implementasi
hardware dan perancangan
software.
Implementasi
hardware
terdiri dari pembuatan design sistem,
mengkomunikasikan
smart card contactless dan smart card reader,
mengaktifkan teknologi NFC . Perancangan
software
terdiri dari
perancangan program untuk reader ACR 122U dan konfigurasi
prosedur Mifare 1K.
Bab IV DATA PENGAMATAN DAN ANALISA
Bab ini menjelaskan proses pengujian perangkat, data pengamatan
dan juga analisanya.
Bab V KESIMPULAN DAN SARAN
Bab ini merupakan penutup, yang memuat kesimpulan dan saran
untuk pengembangan lebih lanjut.
(46)
BAB V
KESIMPULAN DAN SARAN
Bab ini merupakan penutup dari laporan Tugas Akhir ini. Bab ini berisikan
kesimpulan akhir dari Tugas Akhir, sekaligus beberapa saran yang dirasa perlu dan
bermanfaat untuk pengembangan lebih lanjut.
5.1 Kesimpulan
Dengan memperhatikan data pengamatan dan analisis pada bab sebelumnya,
dapat disimpulkan beberapa hal di bawah ini:
1.
Aplikasi untuk sistem pembaca dan penulis data dalam proses sistem
pembayaran berhasil direalisasikan, data pada Kartu Mifare dapat
dibaca dan disimpan, dan dapat disimpan ke Database.
2.
Mifare 1K memiliki media penyimpanan 1KByte dengan key
authentikasi di setiap sectornya, hal ini efektif untuk penggunaan 1
kartu untuk 1 customer.
3.
Untuk setiap aktivitas R/W berhasil 100 % dengan pembacaan kartu
hingga 7,5 cm.
4.
Waktu proses tapping relative cepat sehingga meningkatkan efisiensi
waktu dalam melakukan proses pembayaran.
5.2 Saran
Saran
–
saran yang dapat diberikan untuk perbaikan dan pengembangan dari
Tugas Akhir ini adalah :
1.
Aplikasi dapat dikembangkan dalam bentuk mobile.
2.
Sistem keamanan data dapat dikembangkan dengan enkripsi data DES
bahkan TripleDES.
(47)
DAFTAR PUSTAKA
[1].
Advance Card System Ltd. 2008. Application Programming Interfaces
ACR122U NFC Reader. Hongkong: Advance Card System Ltd.
[2].
Advance Card System Ltd. 2008. Technical Specification ACR122U NFC
Reader. Hongkong: Advance Card System Ltd.
[3].
Advance Card System Ltd. 2008. Visitor Management System Manual
ACR122U NFC Reader. Hongkong: Advance Card System Ltd.
[4].
Datasheet, Mifare 1K.
[5].
Darmawan Erico & Risal Lurentius. (2011).”Pemr
ograman Berorientasi
Objek”.
[6].
Dynah Nirmalasari.2009.”Analisis dan Perancangan Sistem M
-Fly pada
Perusahaan Penerbangan”.Jakarta
.
[7].
id.wikipedia.org/wiki/Near_Field_Communication.
[8].
Rfid.indonetwork.co.id/3002353
[9].
Robert.2012.”Perangkat Pembaca dan Penyimpan Data RFID Portable untuk
Sistem Absensi”.Bandung
[10].
Steward Brian, Zulfigar.2012. “Perkembangan Sistem Near Field
(1)
1 Universitas Kristen Maranatha BAB I
PENDAHULUAN
Latar belakang, identifikasi masalah, perumusan masalah, tujuan, pembatasan masalah, metodologi, spesifikasi alat, pembatasan masalah dan sistematika penulisan dibahas pada bab ini.
1.1 Latar Belakang
Teknologi NFC adalah teknologi terbaru untuk contactless smart card. NFC memiliki protokol yang berbeda dibandingkan dengan contactless MIFARE dan memiliki keamanan lebih baik dibandingkan contactless MIFARE[7].
Dalam Tugas Akhir ini akan dikembangkan sistem pembayaran dengan teknologi NFC. Sistem akan menggunakan komputer dan NFC card reader sebagai unit pendukung. Adapun Teknologi NFC merupakan seperangkat teknologi konektivitas nirkabel berbasis teknologi RFID (Radio Frequeny Identification) yang menggunakan induksi medan magnet untuk memungkinkan komunikasi antar perangkat elektronik dalam jarak yang dekat.[10]
Teknologi NFC itu sendiri akan diimplementasikan pada suatu sistem pembayaran (point of sales) yang saat ini sudah menjadi kebutuhan yang penting terutama bagi bisnis retail maupun pada umumnya, yang merupakan dengan diimplementasikannya teknologi ini mampu memudahkan user dalam bertransaksi secara aman, cepat, dan efisien, karena teknologi ini dapat memberikan berbagai manfaat kepada user seperti intuitif : interaksi NFC tidak membutuhkan kesulitan hanya dari sentuhan sederhana, versatile : NFC cocok digunakan untuk industri, NFC pula telah mengikuti standar internasional yang diterapkan oleh ISO,ECMA,ETSI [6]
(2)
2 Universitas Kristen Maranatha Pada Tugas Akhir ini, telah direalisasi dibuat sebuah prototype yang merepresentasikan sistem pembayaran dengan menggunakan smart card Mifare 1K sehingga diharapkan keamanan data dan kemudahan akses transaksi menjadi point penting dalam tujuan pelaksanaan Tugas Akhir ini.
1.2 Rumusan Masalah
Masalah – masalah yang akan dibahas pada Tugas Akhir ini adalah : Bagaimana merancang aplikasi pembaca dan penulis data
menuju Mifare 1K dengan Reader ACR122U.
Bagaimana membuat aplikasi sistem pembayaran menggunakan Mifare 1K sebagai pengganti alat pembayaran. Bagaimana melakukan prosedur read/write sehingga data
tersimpan aman di dalam Mifare 1K.
Bagaimana melakukan peyimpanan data dalam suatu database.
1.3 Tujuan
Tujuan dari Tugas Akhir ini adalah :
Mengimplementasikan teknologi NFC dengan menggunakan smart card contactless dan card reader NFC ACR 122U sebagai suatu alat pembayaran.
Menciptakan kemudahan dalam transaksi khususnya dalam sistem pembayaran yang menggunakan smart card.
1.4 Batasan Masalah
Smart Card Reader yang digunakan menggunakan ACR 122U. Smart Card yang digunakan menggunakan jenis Mifare 1K. Pembuatan aplikasi menggunakan bahasa C#.
Keamanan data menggunakan authentikasi data secara default. Aplikasi diuji coba dalam 1 PC, sehingga data disimpan di
dalam Smart Card Mifare 1K dan di dalam database SQL. Tidak dilengkapi dengan implementasi jaringan pada sistem.
(3)
3 Universitas Kristen Maranatha 1.5 Metodologi
Metodologi dalam Tugas Akhir ini adalah dengan eksperimental sehingga hasilnya dapat diuji. Langkah-langkahnya adalah :
Mempelajari Modul ACR 122U, bahasa pemrograman C#, datasheet smart card contactless.
Mendesain prototype aplikasi.
Merancang sistem pembayaran dengan smart card reader dengan teknologi NFC.
Membuat kode program untuk mengaktifkan sistem pembayaran yang diharapkan..
Menguji keberhasilan komunikasi dan keamanan data sekaligus penyimpanan data dalam database SQL Server.
Menguji aplikasi dalam suatu jaringan peer to peer.
1.6 Spesifikasi Alat Yang Digunakan
Smart Card Reader yang digunakan adalah ACR122U NFC.
Smart Card yang digunakan memiliki teknologi Kartu Mifare 1K dengan ISO 14443 A dan B.
Software yang digunakan adalah : a. Microsoft Visual Studio 2010.
b. Microsoft SQL Server Management Studio. c. XAMPP dan MySQL untuk database server. 1.7 Sistematika Penulisan
Sistematika pembahasan laporan Tugas Akhir ini disusun menjadi lima bab, yaitu sebagai berikut :
Bab I PENDAHULUAN
Bab ini membahas tentang latar belakang, identifikasi masalah, perumusan masalah, tujuan, pembatasan masalah, metodologi, spesifikasi alat, serta sistematika penulisan.
(4)
4 Universitas Kristen Maranatha Bab II LANDASAN TEORI
Bab ini membahas teori-teori yang akan digunakan untuk merancang dan merealisasikan sistem pembayaran menggunakan teknologi smart card near field communication yang meliputi pembahasan tentang pengetahuan dasar teknologi NFC, smart card contactless, RFID, smart card reader ACR 122U, dan C#.
Bab III PERANCANGAN DAN REALISASI
Bab ini berisi implementasi hardware dan perancangan software. Implementasi hardware terdiri dari pembuatan design sistem, mengkomunikasikan smart card contactless dan smart card reader, mengaktifkan teknologi NFC . Perancangan software terdiri dari perancangan program untuk reader ACR 122U dan konfigurasi prosedur Mifare 1K.
Bab IV DATA PENGAMATAN DAN ANALISA
Bab ini menjelaskan proses pengujian perangkat, data pengamatan dan juga analisanya.
Bab V KESIMPULAN DAN SARAN
Bab ini merupakan penutup, yang memuat kesimpulan dan saran untuk pengembangan lebih lanjut.
(5)
39 Universitas Kristen Maranatha
BAB V
KESIMPULAN DAN SARAN
Bab ini merupakan penutup dari laporan Tugas Akhir ini. Bab ini berisikan kesimpulan akhir dari Tugas Akhir, sekaligus beberapa saran yang dirasa perlu dan bermanfaat untuk pengembangan lebih lanjut.
5.1 Kesimpulan
Dengan memperhatikan data pengamatan dan analisis pada bab sebelumnya, dapat disimpulkan beberapa hal di bawah ini:
1. Aplikasi untuk sistem pembaca dan penulis data dalam proses sistem pembayaran berhasil direalisasikan, data pada Kartu Mifare dapat dibaca dan disimpan, dan dapat disimpan ke Database.
2. Mifare 1K memiliki media penyimpanan 1KByte dengan key authentikasi di setiap sectornya, hal ini efektif untuk penggunaan 1 kartu untuk 1 customer.
3. Untuk setiap aktivitas R/W berhasil 100 % dengan pembacaan kartu hingga 7,5 cm.
4. Waktu proses tapping relative cepat sehingga meningkatkan efisiensi waktu dalam melakukan proses pembayaran.
5.2 Saran
Saran – saran yang dapat diberikan untuk perbaikan dan pengembangan dari Tugas Akhir ini adalah :
1. Aplikasi dapat dikembangkan dalam bentuk mobile.
2. Sistem keamanan data dapat dikembangkan dengan enkripsi data DES bahkan TripleDES.
(6)
40 Universitas Kristen Maranatha DAFTAR PUSTAKA
[1]. Advance Card System Ltd. 2008. Application Programming Interfaces ACR122U NFC Reader. Hongkong: Advance Card System Ltd.
[2]. Advance Card System Ltd. 2008. Technical Specification ACR122U NFC Reader. Hongkong: Advance Card System Ltd.
[3]. Advance Card System Ltd. 2008. Visitor Management System Manual ACR122U NFC Reader. Hongkong: Advance Card System Ltd.
[4]. Datasheet, Mifare 1K.
[5]. Darmawan Erico & Risal Lurentius. (2011).”Pemrograman Berorientasi Objek”.
[6]. Dynah Nirmalasari.2009.”Analisis dan Perancangan Sistem M-Fly pada
Perusahaan Penerbangan”.Jakarta.
[7]. id.wikipedia.org/wiki/Near_Field_Communication. [8]. Rfid.indonetwork.co.id/3002353
[9]. Robert.2012.”Perangkat Pembaca dan Penyimpan Data RFID Portable untuk
Sistem Absensi”.Bandung
[10]. Steward Brian, Zulfigar.2012. “Perkembangan Sistem Near Field