吳元君
(安徽財貿職業(yè)學院,安徽 合肥 230601)
學生上課的出勤率是學校教務部門需要考查的一項重要數(shù)據(jù),也是班級和學生評優(yōu)評獎的重要指標。在高等院校,特別是多個班級合班的大課,教師在上課前點名會耗費大量時間。而且對于班主任而言,除了到班級檢查外,無法及時獲得曠課的學生信息。為了幫助授課教師提高點名的效率,協(xié)助班主任及時了解班級出勤率,為學生考試、評優(yōu)提供依據(jù),同時將這些數(shù)據(jù)共享發(fā)布,項目組研究開發(fā)了一個基于Android和Ardunio的移動便攜點名系統(tǒng)。
系統(tǒng)采用目前主流的射頻卡RFID(工作頻率為125KMHz,如飯卡、上機卡等)技術標識學生身份,采用相應的讀卡模塊,利用Arduino Nano讀取并處理射頻卡數(shù)據(jù),并將該數(shù)據(jù)以目前廣泛普及的藍牙技術發(fā)送給移動智能設備客戶端,如采用Android操作系統(tǒng)的智能手機等,完成點名的操作,并最終利用智能設備的WIFI或3G功能將點名信息上傳至學校教務部門公網服務器,達到數(shù)據(jù)共享的目的[1]。該系統(tǒng)方案成本較低,不增加學生負擔,對教師而言,只需要配備一款基于Android操作系統(tǒng)的手機即可使用,具有一定的推廣價值。
Android名詞源于法國作家的科幻小說《未來夏娃》中的小機器人,2005年Google收購了剛成立22個月的Android公司,開始開發(fā)名為Android的開放源代碼的移動系統(tǒng),Android軟件系列包括了操作系統(tǒng)、中間件和一些關鍵應用。Android代碼開源的特性,利于開發(fā)人員明確細節(jié),開發(fā)出差異化的應用程序。Android的源代碼遵循 Apache V2軟件許可,而不是 GPL v2許可證,非常利于商業(yè)開發(fā)。目前Android基于 QEMU開發(fā)的模擬器調試手段有限,僅支持通話、SMS等,且運行效率較低[2]。但是,Android豐富的開發(fā)工具,包括模擬機、調試工具、內存運行檢測,以及為 Eclipse所寫的 ADT插件,深受廣大開發(fā)人員歡迎。
Arduino是一個基于開放原始碼的軟硬體平臺,是一款便捷靈活、方便上手的開源電子原型平臺,包含硬件(各種型號的arduino板)和軟件(arduino IDE)。Arduino構建于開放原始碼simple I/O介面版,并且具有使用類似Java,C語言的Processing/Wiring開發(fā)環(huán)境。
Arduino能通過各種各樣的傳感器來感知環(huán)境,通過控制燈光、馬達和其他的裝置來反饋、影響環(huán)境。板子上的微控制器可以通過Arduino的編程語言來編寫程序,編譯成二進制文件,燒錄進微控制器。對Arduino的編程是利用 Arduino編程語言 (基于 Wiring)和Arduino開發(fā)環(huán)境(based on Processing)來實現(xiàn)的?;贏rduino的項目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上運行的軟件,他們之間進行通信(比如 Flash,Processing,MaxMSP)來實現(xiàn)[3]。
RDM630系列非接觸式射頻ID卡專用模塊,釆用先進的射頻接收線路及嵌入式微控制器設計,結合高效譯碼算法,完成對EM4100兼容式ID卡的數(shù)據(jù)接收。具有接收靈敏度高、工作電流小、穩(wěn)定性高等特點,適用于門禁、考勤、收費、防盜、巡更等各種射頻識別應用領域。
該模塊可以讀取125K EM4100系列RFID卡,且使用方便,供電后串口連接Arduino主板即可。當有RFID卡進入讀卡范圍時,模塊會通過串口直接把卡號發(fā)送給Arduino。如果再用繼電器模塊連接Arduino的話,就可以實現(xiàn)簡單的門禁控制。
數(shù)據(jù)輸出格式如下:
(1)9600bps,N,8,1
(2)CHECKSUM:card 10byte DATA entire do XOR operation
?
卡號:62E3086CED
輸出:36H、32H、45H、33H、30H、38H、36H、43H、45H、44H
CHECKSUM:(62H)XOR (E3H)XOR (08H)XOR (6CH)XOR (EDH)=08H
核心模塊使用HC-06從模塊,引出接口包括VCC、GND、TXD、RXD,預留LED狀態(tài)輸出腳。led指示藍牙連接狀態(tài),閃爍表示沒有藍牙連接,常亮表示藍牙已連接并打開了端口。底板設置LDO,輸入電壓3.6-6V,未配對時電流約30mA,配對后約10mA。接口電平3.3V,可以直接連接各種單片機(51,AVR,PIC,ARM,MSP430等)。配對以后當全雙工串口使用,僅支持8位數(shù)據(jù)位、1位停止位、無奇偶校驗的通信格式。配對后只需要當成固定波特率的串口一樣使用即可,因此只要是以“固定波特率,8位數(shù)據(jù)位,無奇偶校驗”通信格式的串口設備都可以直接取代原來的有線串口而不需要修改程序。如數(shù)據(jù)采集、智能車、串口打印機、戶外點陣條屏控制等[4]。適合手機跟設備間通過藍牙串口通信。
Arduino Nano是Arduino USB接口的微型版本,最大的不同是沒有電源插座以及USB接口是Mini-B型插座。Arduino Nano是尺寸非常小的而且可以直接插在面包板上使用。其處理器核心是ATmega328(或ATmega168),同時具有14路數(shù)字輸入/輸出口(其中6路可作為PWM輸出),8路模擬輸入,一個16MHz晶體振蕩器,一個mini-B USB口,一個ICSP header和一個復位按鈕。
該板提供一個硬件串口(TX pin、RX Pin),可以連接其它TTL電平設備,作為數(shù)據(jù)通訊[5]。作為擴展,可以通過SoftSerial類創(chuàng)建軟串口,連接其它串口設備。實現(xiàn)后的藍牙RFID讀卡器原理圖如圖1。
圖1 藍牙RFID讀卡器原理圖
本系統(tǒng)硬件設備部分,使用開源的eclipse集成開發(fā)環(huán)境,并安裝了Arduino插件以提供支持。應用系統(tǒng)部分,使用微軟Visual Studio 2010,配合微軟SQLServer 2008 R2 Express完成數(shù)據(jù)的存儲,并提供Web服務。
該部分主要是利用面向對象的方法,將硬件設備抽象為類,如類Rfid表示RFID讀卡器,類Led表示指示燈,類Buzzer表示蜂鳴器等。這樣做可以極大提供代碼的利用率,提高程序的可讀性[6]。關鍵代碼如下:
bool Rfid::nextCard(unsigned char*card) {
hasCard=false;
//把現(xiàn)有的數(shù)據(jù)放入數(shù)組
while (Serial.available() > 0) {
//加入判斷,位置0時,數(shù)據(jù)應為2,位置13時,數(shù)據(jù)應為3
unsigned char c;
c=Serial.read();
if(currentByte==0&&c!=2) {
continue;
}
if(currentByte==13&&c!=3) {
currentByte=0;
continue;
}
newData[currentByte++]=c;
//放入14個以后,退出
if(currentByte >=14) {
//比較前后兩次讀取的是否一致,如果不一致,則表示是新卡
for(currentByte=0;currentByte<14;currentByte++){
if (preData[currentByte]!=newData[currentByte]){
preData[currentByte]=newData[currentByte];
hasCard=true;
}
}
if(hasCard==true) {
for(currentByte=0;currentByte< 14;currentByte++){
card[currentByte]=newData[currentByte];
}
}
Nano上首先實例化RFID讀卡器,不停的查詢是否有磁卡接近,當有磁卡接近,讀取卡號并將卡號發(fā)送給藍牙模塊。關鍵代碼如下:
#include “SendCardByBT3.h”
#include “Rfid.h”
#include “SoftwareSerial.h”
//因為Nano版只有一個硬串口,所以使用軟串口連接藍牙
SoftwareSerial mySerial(7,8);//使用Pin7作為軟串口的RX,使用Pin8作為軟串口的TX
//RFID模塊
Rfid*rfid;
//存儲卡號的臨時數(shù)組
unsigned char card[14];
//存儲卡號的臨時字符串對象
String s;
//蜂鳴器//Buzzer*buzzer;
void setup() {
rfid=new Rfid();//實例化 RFID 讀卡器模塊
//buzzer=new Buzzer(4);//實例化蜂鳴器,用 Pin4 進行控制
//
mySerial.begin(9600);//軟串口開始工作,準備向藍牙模塊發(fā)送卡片信息
}
void loop() {
//當讀到有卡片時,從藍牙將卡號發(fā)出
if(rfid->nextCard(card) ==true) {
s= “”;
for(int i=1;i< 11;i++){
s.concat((char)card[i]);
}
mySerial.println(s+ “ ”);//把卡號發(fā)送到藍牙模塊,并附帶換行符,以便 Java
//能順利讀取數(shù)據(jù)
//buzzer->beep();//讀取一個磁卡,蜂鳴器發(fā)出一次聲音
}
}
手機端藍牙與藍牙模塊配對后,會一直讀取藍牙模塊輸入流的數(shù)據(jù),以判斷是否有新卡信息到達[7]。當有新卡信息到達時,會自動更新對應學生的出勤狀態(tài);否則,繼續(xù)等待。如果這個操作在Activity主線程中運行的話,必然導致界面無法響應用戶操作。因此,在獲取藍牙輸入流后,需要單獨開啟一個線程運行讀卡信息的操作。當藍牙模塊關閉或Activity主線程結束時,該讀卡信息的線程會自動結束。該過程可參照流程圖見圖2,關鍵代碼如下。
圖2 流程圖
//啟用手機藍牙設備
@Override
protected void onStart(){//在Activity啟動時,判斷手機藍牙是否啟用
super.onStart();
if(!bluetoothAdapter.isEnabled()) {
//請求藍牙權限
Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,REQUEST_BLUETOOTH_ENABLED);
}
}
//連接藍牙讀卡器后需要進行讀卡操作,因此使用單獨的線程運行
private void connectDevice(final String address) {
new Thread(new Runnable(){
public void run() {
try{
//獲取要連接的藍牙設備
BluetoothDevice device=bluetoothAdapter
.getRemoteDevice(address);
/
/創(chuàng)建Socket連接
bluetoothSocket=device
.createRfcommSocketToServiceRecord(MY_UUID);
//進行連接
bluetoothSocket.connect();
Log.d(“Message”, “啟動讀卡線程“);//輸入操作日志
//開始讀卡
readCards();
}catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
//讀卡操作的線程
private void readCards() {
BufferedReader reader=null;
String nextCard=null;
String preCard=null;
try{
reader=new BufferedReader(new InputStreamReader(
bluetoothSocket.getInputStream()));
while ((nextCard=reader.readLine()) !=null) {
if(!nextCard.equals(preCard)) {
//讀到新卡信息,更新對應學生出勤狀態(tài)
}
}
}catch (Exception e) {
}finally{//…
}
}
該系統(tǒng)基于RFID技術標示學生身份,采用開源的硬件平臺Arduino作為主控設備,與采用單片機作為主控設備相比,該方案可擴展性更強,操作更為方便;同時,利用藍牙技術,在智能設備與Arduino之間建立起連接,借助智能設備的WIFI或3G功能共享數(shù)據(jù)[8]。使用智能Android設備配合射頻卡完成上課點名的操作是本系統(tǒng)的亮點,此外,系統(tǒng)還設計了完整的應用程序,方便用戶操作。系統(tǒng)結構圖如圖3所示。
圖3 系統(tǒng)結構圖
系統(tǒng)有較強的實用性,RFID藍牙讀卡器價格普遍在500元以上,而該方案的成本可以控制在200元以內,利用該系統(tǒng)不僅可以極大提高點名效率,而且教學相關人員可以及時了解和監(jiān)控學生上課情況。該系統(tǒng)支持多種Android終端設備,如手機、電腦等,RFID技術的普及、智能設備的廣泛使用也都為該系統(tǒng)在校園的普及奠定了基礎。
[1] 楊豐盛.Android應用開發(fā)揭秘[M].北京:機械工業(yè)出版社,2010.
[2] 楊明極,畢晶.基于 Android 視頻客戶端的設計[J].電視技術,2012,(3):43-47.
[3] H.Hagras,Victor Callaghan,Martin Colley,Graham Clarke,Anthony Pounds-Cornish,and Hakan Duman.Creating an ambient-telligence environment using embedded agents[J].IEEE Intelligent Systems,2004,(4):12-20.
[4] 周時偉,謝維波.基于Android的智能家居終端設計與實現(xiàn)[J].微型機與應用,2012,(14):10-13
[5] 王朝華,陳德艷,黃國宏,等.基于Android的智能家居系統(tǒng)的研究與實現(xiàn)[J].計算機技術與發(fā)展,2012,(6):225-228.
[6] 詹成國,朱偉,徐敏.基于Android的測控裝置人機界面的設計與開發(fā)[J].電力自動化設備,2012,(1):119-122
[7] 唐賽武,滿君豐,謝成劍.便于省時排隊的無線監(jiān)測系統(tǒng)的研制[J].福建電腦,2012,(11):35-37.
[8] 宮磊,周聰.基于Android的移動終端應用程序開發(fā)與研究[J].計算機與現(xiàn)代化,2008,(8):85-89