Visual Csharp hiện là ngơn ngữ lập trình được sử dụng rộng rãi nhất để viết các ứng dụng chạy trên hệ điều hành windows. Visual Csharp cho phép phát triển nhanh chĩng các ứng dụng truyền thống được thiết kế theo mơ hình đặc trưng của windows. Với Csharp người thiết kế cĩ thể rất nhanh chĩng và dễ dàng tạo ra được một giao diện trực quan thân thiện với người sử dụng. Ngồi ra các cú pháp trong Csharp cũng khá giống với ngơn ngữ hướng đối tượng C++. Nên khi sử dụng qua ngơn ngữ này người lập trình sẽ cĩ cái nhìn tổng quan hơn về lập trình hướng đối tượng, một xu hướng trong nghành cơng nghệ thơng tin.
Visual Csharp cĩ khá nhiều ưu điểm khiến tơi phải lựa chọn sử dụng nĩ trong đồ án này . Các ưu điểm của nĩ cĩ thể kể đến như:
Visual Csharp là một ngơn ngữ lập trình cĩ cấu trúc tương đối đơn giản
Ngơn ngữ này là lý tưởng để phát triển các giao diện đồ họa người dùng (GUI).
Các thư viện MSDN trực tuyến cung cấp một tương tác tồn diện và hệ thống trợ giúp trực tuyến.
Dễ dàng xây dựng các phần mềm quản lý giao tiếp giữa máy tính và thiết bị ngoại vi thơng qua các chuẩn như RS232, USB 2.0 chỉ đơn giản bằng cách gọi các hàm WIN API đã cĩ sẵn trong hệ điều hành windows.
2.3.2 Xây dựng cơ sở dữ liệu
Cơ sở dữ liệu mà ta sẽ lựa chọn sử dụng ở đây là MySQL. MySQL là giải pháp nhanh nhất để sử dụng hệ thống quản lý dữ liệu quan hệ RDMS. MySQL là một phần mềm mã nguồn mở mạnh mẽ được cấp phép của tổ chức GPU,nên người dùng khơng phải trả phí.Ngồi ra nĩ khá dễ dàng trong việc cài đặt và sử dụng nên rất phù hợp với các ứng dụng khơng địi hỏi tính chuyên nghiệp caọ MySQL bao gồm một MySQL server, và một số chương trình tiện ích giúp quản lý cơ sở dữ liệu
MySQL như workbench giúp người dùng tạo cơ sở dữ liệu với giao diện sử dụng rất thân thiện.
Ta sẽ thiết kế một cơ sở dữ liệu nhỏ cĩ tên là “rfid” bao gồm hai bảng dữ liệu để
lưu trữ thơng tin cá nhân và thơng tin bệnh án ,đĩ là các bảng cĩ tên là “PersonalDetail” và “MedicalDetail”.Với bảng thơng tin cá nhân ta cần phải đề cập đến các mục :
Tên nhân viên (‘firstname’) Họ nhân viên (‘lastname’) Địa chỉ (‘ađress’)
Ngày sinh (‘dateofbirth’) Số điện thoại (‘phone’)
Cịn với bảng thơng tin bệnh án ta phải đề cập đến các mục như : Ngày đi lamg (‘presentcomplaint’)
Ngày (‘date’)
Qúa trinh lịch sử (‘fmhistory’)
Dữ liệu ảnh trong quá trình là việc (‘pictureurl’)
Bây giờ ta sẽ đi vào cụ thể ,xây dựng ra cơ sở dữ liệu chỉ ra ở trên bằng các lệnh trong màn hình quản trị DOS:
Chúng ta sẽ bắt đầu MySQL bằng cách gõ vào dịng lệnh dưới đây:
Mysql – u root –p fake_password
Để tạo ra cơ sở dữ liệu cĩ tên ‘rfid’ ta dung lệnh:
CREATE DATABASE RFID
Trước khi ta đi vào tạo một bảng dữ liệu, chúng ta phải lựa chọn cơ sở dữ liệu sử dụng bằng lệnh sau:
USE RFID;
Bảng thơng tin cá nhân và thơng tin bệnh án sẽ được tạo ra thơng qua các lệnh dưới đây :
CREATE TABLE PERSONALDETAILS ( LASTNAME VARCHAR (50) NOT NULL, FIRSTNAME VARCHAR(50) NOT NULL, DATEOFBIRTH VARCHAR(20) NOT NULL, AĐRESS VARCHAR(100) NOT NULL, PHONE VARCHAR(15) NOT NULL,
PATIENTID VARCHAR(8) NOT NULL, PRIMARY KEY(PATIENTID) );
CREATE TABLE MEDICALINFO ( PRESENTCOMPLAINT TEXT,
FMHISTORY TEXT NOT NULL, PICTUREURL VARCHAR(100), DATE VARCHAR(30) NOT NULL, ID VARCHAR(8) NOT NULL,
PRIMARY KEY(ID) );
Như vậy cơ sở dữ liệu ‘rfid’ đã sẵn sàng cho chúng ta sử dụng trong ứng dụng .
2.3.3 Giao tiếp với cơ sở dữ liệu
Ta sẽ sử dụng ngơn ngữ PHP để tương tác với cơ sở dữ liệu MySQL và để tự động sinh ra các trang web động phù hợp.Trong ứng dụng này, PHP được sử dụng với các chức năng là:
Cập nhật cơ sở dữ liệu bệnh nhân do bác sĩ gửi lên.
Sinh ra các trang web động để hiển thị thơng tin về một bệnh nhân.
Ở đây ta sẽ chỉ ra một số thao tác cơ bản với cơ sở dữ liệu trong php.Đĩ là các thao tác lấy thơng tin về từ cơ sở dữ liệu,và thao tác cập nhật mới lên cơ sở dữ liệụCĩ một điều cần chú ý ở đây là, số ID dùng để truy nhập vào cơ sở dữ liệu chính là mã số thẻ mà ta cĩ được ở các khâu trước trong giao diện C#. Sau đĩ ta cĩ thể thực hiện truyền biến chứa giá trị mã thẻ đĩ đến trang php hay trang html cần thiết bằng lệnh đơn giản sau:
UrlString=http : //local h o s t / u p d a t e p ers o n al_ p r o ce s s. ph p + ”?” + “number=” +TagNum
Khi đĩ trong trang updatepersonal_process.php ta cĩ thể lấy giá trị biến chứa giá trị mã thẻ như sau:
//Get the patient tag number from the URL
$id = $_GET['number'];
Để hiển thị ta phải thực hiện hai việc.Một là, thực thi câu lệnh sql để lấy về các thơng tin cần thiết của một bệnh nhân. Hai là, xây dựng một trang web động để hiển thị kết quả như dưới đây:
//Display patient's lastname
$sql = "SELECT lastname FROM PersonalDetails where id = '$id'"; $result = mysql_query($sql) or die("Debug: Couldn't execute query"); $row = mysql_fetch_array($result);
echo "<h2>Lastname:</h2> <h3>{$row['lastnamé]}</h3><br>";
//Display patient's firstname
$sql = "SELECT firstname FROM PersonalDetails where id = '$id'"; $result = mysql_query($sql) or die("Debug: Couldn't execute query"); $row = mysql_fetch_array($result);
echo "<h2>Firstname:</h2> <h3>{$row['firstnamé]}</h3><br>";
//Display patient's ađress
$sql = "SELECT ađress FROM PersonalDetails where id = '$id'"; $result = mysql_query($sql) or die("Debug: Couldn't execute query"); $row = mysql_fetch_array($result);
echo "<h2>Ađress:</h2> <h3>{$row['ađress']}</h3><br>";
Cịn để thực hiện thao tác cập nhật cơ sở dữ liệu ,đầu tiên ta phải lấy về giá trị các biến từ các form nhập trong trang HTML gửi lên máy chủ.Ví dụ, ở đây ta sẽ lấy giá trị các biến từ trang html nhập thơng tin cá nhân do bác sĩ nhập vào và gửi lên máy chủ như sau:
//The request function retrieves the variables posted from the previous
$firstname = $_REQUEST['firstnamé]; $lastname = $_REQUEST['lastnamé]; $ađress = $_REQUEST['ađress']; $phone = $_REQUEST['phoné];
Sau đĩ là lệnh thực hiện cập nhật vào bảng dữ liệu ‘PersonalDetail’ của cơ sở dữ liệu ‘rfid’:
$sql = "UPDATE PersonalDetails SET firstname= '$firstnamé, lastname = '$lastnamé, ađress = '$ađress',phone = '$phoné WHERE id = '$id'"; $result=mysql_query($sql);
2.3.4 Quản lý kết nối USB giữa reader và máy tính
Phần quản lý kết nối USB giữa reader và máy tính, ta sẽ tích hợp nĩ vào bên trong phần mềm quản lý của ta ở trên. Chỉ đơn giản là ta sẽ thực hiện gọi các hàm
giao tiếp với thiết bị ngoại vi , mà hãng Microsoft đã cung cấp sẵn trong các lớp thư viện WINDOWS API của hệ điều hành windows. Bây giờ ta sẽ đi tìm hiểu qua về chúng.
API bao gồm các hàm, các thơng báo, các cấu trúc dữ liệu, các kiểu dữ liệu, mà chúng ta cĩ thể sử dụng để tạo ra các ứng dụng chạy trên hệ điều hành Windows. Các phần của API mà ta hay sử dụng nhất , đĩ là các mã phục vụ cho việc gọi các hàm API từ Windows. Cái này bao gồm, phần khai báo các thủ tục, phần định nghĩa các kiểu dữ liệu của người dùng, và phần khai báo các hằng số.
Trước khi một ứng dụng cĩ thể trao đổi dữ liệu với một HID, thì nĩ phải nhận dạng được thiết bị và lấy được các thơng tin về các report của thiết bị đĩ. Đầu tiên
ứng dụng sẽ tìm ra các HID được gắn vào hệ thống là gì. Sau đĩ, nĩ kiểm tra thơng tin về mỗi HID đĩ cho đến khi nĩ tìm thấy được một trong các thuộc tính mong muốn. Với các thiết bị truyền thống, ứng dụng cĩ thể tìm kiếm các thơng tin về mã số nhà phát hành và mã số sản phẩm. Hoặc ứng dụng cĩ thể tìm ra thiết bị đĩ là thuộc kiểu HID đặc biệt nào, chẳng hạn như HID mouse hay là HID joystick. Sau khi đã tìm ra được thiết bị, ứng dụng cĩ thể trao đổi thơng tin với thiết bị đĩ bằng cách gửi hoặc nhận các report.
Dưới đây là bảng danh sách các hàm API được sử dụng để thiết lập liên lạc thơng tin và trao đổi dữ liệu với một HID.
Bảng2.2 Danh sách các hàm API dùng cho kết nối usb trong windows
Các hàm API DLL Mục đích
HidD_GetHidGuid hid.dll Lấy GUID cho lớp HID
SetupDiGetClassDevs setupapịdll Trả về thơng tin của một thiết
bị từ một tập hợp chứa tất cả các thiết bị trong một lớp đặc biệt.
SetupDiEnumDeviceInterfaces setupapịdll Trả về thơng tin một thiết bị trong tập hợp thơng tin thiết bị.
CreateFile kernel32.dll Mở một kết nối truyền thơng
tới thiết bị.
HidD_GetAttributes hid.dll Trả về mã số nhà sản xuất, mã
số sản phẩm, và số phiên bản của sản phẩm.
HidD_GetPreparsedData hid.dll
HidP_GetCaps hid.dll Trả về một cấu trúc mơ tả các
khả năng của thiết bị.
WriteFile kernel32.dll Gửi một report ở đầu ra tới
ReadFile kernel32.dll Đọc một report đầu vào từ thiết bị.
HidD_SetFeature hid.dll Gửi một Feature report tới
thiết bị.
HidD_GetFeature hid.dll Đọc một Feature report từ
thiết bị.
CloseHandle kernel32.dll
2.4 Kết Luận
Như vậy ở chương này chúng ta đã đi thiết kế một hệ thống quản lý bệnh nhân bằng cơng nghệ RFID hồn chỉnh một cách chi tiết từ việc thiết kế reader đến thiết kế phần mềm chạy trên máy tính. Ở đây tơi xin phép được lưu ý rằng, trong quá trình thiết kế chúng ta cần đặc biệt chú ý tới anten cho reader. Tuy cách chế tạo nĩ khá đơn giản, chỉ là quấn dây đơng theo một hình trịn, hay hình vuơng,...Nhưng nếu tính tốn sai dẫn đến sai số quá lớn , cĩ thể khiến cho reader khơng thể đọc được thẻ. Vì vậy khi chế tạo anten cần cĩ các máy đĩ cần thiết để biết được một cách chính nhất cĩ thể giá trị độ tự cảm của cuộn dây anten.
TÀI LIỆU THAM KHẢO
[1] Sandip Lahiri, RFID Sourcebook. Upper Sađle River, NJ: Prentice Hall PTR, 2005.
[2] Himanshu Bhatt, Bill Glover, RFID Essentials. S e b as topo l , C A: ĨReilly, 2006. [3] Patrick J.Sweeney II, RFID For Dummies. Hobok e n , N J : Wiley, 2005.
[4] V.Daniel Hunt, Albert Puglia, Mike Puglia, RFID A Guide To Radio Frequence Identification. Hobo k e n, N J : Wiley, 2007.
[5] Frank Thornton, Brad Haines, Anand M Das, Hersh Bhargava, RFID Securitỵ
Rockland, Massachusetts: Syngress Publishing, 2006.
[6] http:// w ww . rf d es ignlin e .c om/howto/202101579 , truy nhập cuối cùng ngày 10/5/2010.
[7] http:// w ww . u s b . o r g/ , truy nhập cuối cùng ngày 10/5/2010.
[8] http:// w ww .e mmic r o e l ec t r onic . c om/ L ine .as p ?IdLine=3/,truy nhập cuối cùng ngày 1/5/2010.
[9] http:// w ikipedia . o r g/ , truy nhập cuối cùng ngày 10/5/2010.
[10] http:// w ww . mic r o c hi p .c om/ , truy nhập cuối cùng ngày 10/5/2010. [11] http:// w ww . my s q l .c om/ ,truy nhập cuối cùng ngày 10/4/2010.
[12] http://php.n e t/inde x . php/,truy nhập cuối cùng ngày 12/4/2010.
BẢNG ĐỐI CHIẾU CÁC THUẬT NGỮ VIỆT- ANH
Khả năng đánh địa chỉ Ađressability Dịng điện xoay chiều Alternating Current Điều chế biên độ A mplitude M odulation
Khĩa dịch biên Amplitude Shift Key
Các tiêu chuẩn cỡ dây của Hoa Kỳ American Wire Gauge
Giao diện lập trình ứng dụng Application Programming Interface
Tán xạ ngược Backscatter
Mã vạch Bar Code
Hai pha Biphase
Thẻ chặn (được sử dụng các thẻ RFID khác)
Blocker Tag
Đốt cháy (để thao tác ghi lên chip) Burn
Phân cực trịn Circular Polarization
Khối tách xung Clock Extractor
Lớp Class
Một loại cơng nghệ để chế tạo vi
mạch tích hợp Complementary Metal Oxide
Semiconductor
Sĩng liên tục Continuous Wave
Kiểm tra độ dư vịng Cyclic Redundancy Check
Bộ mơ tả Descriptor
Bộ mơ tả thiết bị (usb) Descriptor Device Bộ mơ tả các báo cáo (usb) Descriptor Report Bộ mơ tả chuỗi (usb) Descriptor String Bộ mơ tả các giao diện (usb) Descriptor Interface Bộ mơ tả các đặc tính vật lý (usb) Descriptor physical
Lưỡng cực Dipole
Dịng điện một chiều Direct Current
Lưỡng cực đơi Dual Dipole
Cơng xuất bức xạ đẳng hướng Equivalent Isotropic Radiated Power
Hiệu suất bức xạ Effective Radiated Power Được lập trình sẵn bởi nhà sản xuất Fac tory Pr ogr amme d
Phần mềm nhỏ được cài đặt trên vi điều khiển để nĩ cĩ thể chạy ngay khi khởi động Firmware Lưỡng cực gấp Folded Dipole Điều chế tần số (hay Điều tần) Frequency Modulation Khĩa dịch tần Frequency Shift Key Tốc độ đầy đủ (usb) Full Speed
Giao diện đồ họa người dùng Graphical User Interface Tần số cao
High Frequency
Thiết bị giao tiếp với con người Human Interface Device
Thiết bị chuột được hỗ trợ bởi lớp HID Thiết bị cần điều khiển được hỗ trợ bởi lớp HID Mouse HID HID Joystick
D a n h m ụ c I t e
m Phân cực tuyến tính Linear Polarization Mạng nội bộ Local Area Network Tần số thấp Low Frequency Tốc độ thấ p (us b) Lo w Spe ed Phần mềm chịu trách nhiệm kết nối phần cứng RFID vào hệ thống Midleware Điều biên Modulator Khĩa on – off On Off K ey ing Mạng cá nhân P e rs onal Ar e a N e two r k Vịng khĩa pha pha P ha s e M odulation Khĩa dịch pha Phase Shift Key Cắm là chạy (usb) Plug And Play Phân cực Polarizat ion
Điều khiển / chỉnh lưu nguồn Power control/rectifier Bảng mạch in P r inted c i rc uit bo a r d Mã số sản phẩm Product
Mã hĩa khoảng xung Pulse Interval Encoding Nhận dạng tần số vơ tuyến Radio Frequency Identification Thiết bị đọc thẻ
Reader
Bộ nhớ chỉ đọc Read Only Memory Chỉ
Only Đọc – ghi Read -Writ e Thiết bị đọc thẻ nhanh lẹ R e ad e r Agile 91
Hệ thống quản lý dữ liệu cơ sở (trong hệ điều hành windows)
Relational Database Management System
Đoạn thơng tin Segment
Giao thức quản lý mạng đơn giản Simple Network Management
Pro toc ol Phân lớp Subclass Đa truy nhập phân chia theo thời gian Time Division Multiple Access Máy phát tín hiệu Transmitter Bộ phát đáp Transponder Tần số siêu cao Ultra High Frequency Buýt nối tiếp đa năng Universal Serial Bus Mã số thế hệ sản phẩm Version Mã số nhà sản xuất Vendor Bộ dao động được Voltage Controlled
Mạng khơng dây Wireless
Ghi một lần – đọc nhiều lần Write Once - Read Many Anten lưỡng cực gấp 2 dây 2-Wire Folded Dipole Antenna
Anten lưỡng cực gấp 3 dây 3-Wire Folded Dipole Antena
PHỤ LỤC A : MỘT SỐ MÃ NGUỒN
Trong phần phụ lục này tơi chỉ xin phép trích dẫn một số phần mã nguồn chương trình quan trọng. Trong đĩ phải kể đến là phần mã điều khiển đọc thẻ EM4100 và descriptor mơ tả thiết bị trong kết nối USB. Đĩ là hai tệp em4100.c và
usb_descriptor.h Em4100.c :
// Purpose: Reads the ID number and data number // Inputs: A pointer to a 5 byte array to fill // * The first byte will have the ID // * The last 4 bytes will have the data
// Outputs: TRUE if read successful, FALSE if read failed int1 read_em4100(int8* data)
{ int8 i;
RF_get(sizeof(RFbuffer)*8, TRUE); // Fill the buffer with data for(i=0; i<2; ++i)
{
while(!END_OF_RFBUFFER) {
if(header_search_em4100()) // Try to find 9 consecutive 1s {
if(decode_data_em4100(data)) // Try to decode the data after the header {
RFbuffer_fill(0xAA); // Prevents false detection return TRUE; // Return sucessful read }
} }
RFbuffer_invert(); // Invert the buffer because the
} // Manchester encoded data could have
// been read starting at the wrong edge RFbuffer_fill(0xAA); // Prevents false detection
return FALSE; // Return error
// Purpose: Search for the header consisting of 9 ones // Inputs: None
// Outputs: TRUE if the header was found, FALSE if it was not found int1 header_search_em4100()
{
int bitCounter = 0;
// Loops until 9 consecutive 1s are found // or the end of the receive buffer is reached while(!END_OF_RFBUFFER) { if(RFbuffer_getBit() == 1) { if(++bitCounter == 9) { return TRUE; } } else { bitCounter = 0; } } return FALSE; }
// Purpose: Decodes the ID number and data number // Inputs: A pointer to a 5 byte array to fill
// * The first byte will have the ID // * The last 4 bytes will have the data
// Outputs: TRUE if read successful, FALSE if read failed int1 decode_data_em4100(int8* data)
{ int1 bit = 0; int8 count = 1; int1 parity = 0; int1 colParity1 = 0; int1 colParity2 = 0;
int1 colParity3 = 0;