Warning

HW-VY Series Reader sudah discontinued. Pengganti reader ini bisa cek versi RC4 Series, salah satunya EL-UHF-RC4-2.

HW-VY06K merupakan UHF RFID Reader dengan kemampuan membaca hingga 6 - 8 meter yang dilengkapi dengan berbagai protokol komunikasi dan tools untuk develop dari berbagai bahasa pemrograman, os maupun interace.

Persiapan

Sebelum masuk ke Demo App, siapkan dulu beberapa hal berikut :

  • HW-VY06K
  • Python 3
  • Ctypes
  • RS-232 to USB Serial converter
  • File HW-VY Series SDK dan Sample Code

Python versi 3 dapat langsung didownload di https://www.python.org/downloads/

Untuk File HW-VY Series dapat download di : https://www.electron.id/product/hw-vy06k.html

Instalasi library Python bisa dilakukan dengan cli

pip install ctypes

HW-VY06K dapat dibeli di : https://www.tokopedia.com/electron/hw-vy06k-uhf-rfid-integrated-reader-writer-middle-range-6dbi-epc-gen-2

RS-232 to USB Serial Converter dapat dibeli di : https://www.tokopedia.com/electron/usb-to-rs232-ch340-serial-port-db9-cable-com-port-adapter-ch-340-kabel

1. Penjelasan CFCom API

CF Com API merupakan dll file yang berisi fungsi - fungsi dalam bahasa, untuk isi dari fungsi - fungsi yang akan digunakan sudah terdapat pada folder sdk dan sample code dalam bentuk word.

CFComApi

pada tutorial kali ini akan dicontohkan 3 fungsi yaitu :

  1. CFCom_OpenDevice pada fungsi ini memiliki parameter dalam bahasa C sebagai berikut.
BOOL CFCOM_OpenDevice(char*pcCom, int iBaudRate)

Berfungsi untuk membuka jalur komunkasi dengan reader melalui usb port serial, jika menggunakan konverter RS232 to USB serial dari Electron dapat dilihat dalam device manager seperti berikut.

CFComApi COM Port

Maka parameter pertama bisa langsung diisi dengan string “COM4”.encode() sehingga string dari python dapat dipahami oleh C, lalu isi oarameter ke 2 isi langsung dengan angka 115200(default dari HW-VY jika belum diganti).

Setelah itu adalah perintah inventory, dimana biasa dilakukan pembacaan epc pada setiap tag yang terdeteksi.

BOOL CFCom_InventoryG2(unsigned char bDevAdr, unsigned char *pBuffer, unsigned short * Totallen, unsigned short *CardNum)
  • bDevAdr : address reader yang terhubung, bisa diisi 0xff jika tidak mengetahui address dari reader.
  • *pBuffer : Variabel int array ctypes, untuk mendapatkan nilai epc dari tag yang terbaca.
  • *Totallen : Variabel int ctypes, untuk mendapatkan nilai panjang epc dari tag yang terbaca.
  • *CardNum : Variabel int ctypes, untuk mendapatkan jumlah tag yang terbaca ketika menerima perintah read inventory.
BOOL CFCom_ReadCardG2 (unsigned char bDevAdr, unsigned char * Password ,unsigned char Mem, unsigned char WordPtr, unsigned char ReadEPClen, unsigned char * Data)
  • bDevAdr : address reader yang terhubung, bisa diisi 0xff jika tidak mengetahui address dari reader.
  • *Password : Variabel array ctypes, berisi 4 bytes untuk mengakses memory UHF tag.
  • mem : Menentukan memory yang ingin dibaca 0: Reserved memory 1: EPC 2:TID 3:User.
  • WordPtr : Variabel ctypes, menentukan index yang ingin dibaca mulai dari nilai word ke berapa.
  • ReadEPClen : Variabel ctypes, untuk mnentukan panjang isi memory yang ingin dibaca.
  • *Data : array ctypes, untuk mendapatkan nilai memory yang terbaca.

2. Implementasi kode CFCom API

Pada kode yang dijadikan sebagai contoh akan dijadikan menjadi 3 bagian, bagian pertama adalah untuk melakukan load library CFComApi.dll

import ctypes
import time
import platform
 
if platform.system() == 'Windows':
    Objdll = ctypes.windll.LoadLibrary('D:\\APIDLL\\CFComApi.dll')
#elif platform.system() == 'Linux':
#   libc = ctypes.windll.LoadLibrary('libCFComApi.a')
print(Objdll)

pada bagian diatas ctypes yang akan membantu mengakses fungsi dalam library dll dan juga fasilitas untuk membuat deklarasi variabel yang bisa dibaca dalam bentuk C dan platform untuk mengatur fungsi yang digunakan pada saat melakukan include library, karena windows dan linux memiliki fungsi yang berbeda.

Setelah itu kita buka komunikasi dengan code seperti berikut.

if Objdll.CFCom_OpenDevice("COM4".encode(), 115200) == 1:
    print("OpenSuccess")
else:
    print("OpenError")
 
Objdll.CFCom_ClearTagBuf()    # Membersihkan buffer dahulu

Setelah itu kita masuk kebagian proses pengiriman perintah ke reader untuk inventory seperti berikut.

    arrBuffer = create_string_buffer(900)
    iTagLength = c_long(0)
    iTagNumber = c_char_p()
    cardNum = c_int(0)
    test = Objdll.CFCom_StopRead(bDevAdr)
 
    Objdll.CFCom_InventoryG2(bDevAdr, byref(arrBuffer),byref(iTagLength),byref(cardNum))
    if iTagLength.value > 0 :
        print("In One Scan")
        iLength = int(0)
        for iIndex in range(0,  cardNum.value):
            print(arrBuffer[0:iTagLength.value])

Pada bagian ini terlihat proses deklarasi variabel ctypes dan pengisian parameter pada fungsi inventory, untuk array gunakan byref untuk mendapatkan kembali nilai dari hasil pembacaan.

Untuk perintah membaca inventory dapat gunakan contoh kode sebagai berikut.

    array = c_int * 4
    arrayData = c_ubyte * 6
    password = array(0,0,0,0)
    arrBuffer = arrayData()
    mem = c_ubyte(1)
    wordPtr = c_ubyte(2)
    epcLength = c_ubyte(6)
 
    Objdll.CFCom_ReadCardG2 (bDevAdr, password,mem, wordPtr, epcLength, byref(arrBuffer))
    data = []
    for x in range(epcLength.value):
        data.append(hex(arrBuffer[x]))
    print(data)

untuk kode penuh nya :

    #!/usr/bin/python
# -*- coding: UTF-8 -*-
import ctypes
import time
import platform
 
if platform.system() == 'Windows':
    Objdll = ctypes.windll.LoadLibrary('D:\\APIDLL\\CFComApi.dll')
#elif platform.system() == 'Linux':
#   libc = ctypes.windll.LoadLibrary('libCFComApi.a')
print(Objdll)
 
if Objdll.CFCom_OpenDevice("COM7".encode(), 115200) == 1:   # open device
    print("OpenSuccess")
else:
    print("OpenError")
 
Objdll.CFCom_ClearTagBuf()    # start to get data
 
from ctypes import *
bDevAdr = 0xff
 
while True:
    # arrBuffer = create_string_buffer(900)
    # iTagLength = c_long(0)
    # iTagNumber = c_char_p()
    # cardNum = c_int(0)
    # test = Objdll.CFCom_StopRead(bDevAdr)
 
    # Objdll.CFCom_InventoryG2(bDevAdr, byref(arrBuffer),byref(iTagLength),byref(cardNum))
    # if iTagLength.value > 0 :
    #     print("In One Scan")
    #     iLength = int(0)
    #     for iIndex in range(0,  cardNum.value):
    #         print(arrBuffer[0:iTagLength.value])
 
    array = c_int * 4
    arrayData = c_ubyte * 6
    password = array(0,0,0,0)
    arrBuffer = arrayData()
    mem = c_ubyte(1)
    wordPtr = c_ubyte(2)
    epcLength = c_ubyte(6)
 
    Objdll.CFCom_ReadCardG2 (bDevAdr, password,mem, wordPtr, epcLength, byref(arrBuffer))
    data = []
    for x in range(epcLength.value):
        data.append(hex(arrBuffer[x]))
    print(data)
 
    time.sleep(1)

Video Tutorial

Untuk tutorial dalam bentuk video dapat kunjungi