基于藍牙技術的考勤系統-藍牙通信設計_第1頁
基于藍牙技術的考勤系統-藍牙通信設計_第2頁
基于藍牙技術的考勤系統-藍牙通信設計_第3頁
基于藍牙技術的考勤系統-藍牙通信設計_第4頁
基于藍牙技術的考勤系統-藍牙通信設計_第5頁
已閱讀5頁,還剩63頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于藍牙技術的考勤系統-藍牙通信設計摘要作為當代大學生,上課的時候都避免不了老師的考勤,現在的考勤還是主要以老師點名為主。往往點完名后就已經占了課堂的小一部分時間,不僅僅低效,而且考勤很多同學可以幫別人頂替,所以漏洞很大。而在企業中,考勤主要是以指紋和掃描臉部為主,這樣的考勤成本高,也浪費一定的社會資源,不利于推廣。基于信息化的藍牙考勤系統就應運而生,適應時代的發展。當一推出這藍牙考勤方式時,就十分受高校的歡迎,畢竟能使上課時間多了很多也高效很多。遏制住學生代簽到幫同學的行為,也不會因為考勤系統等煩雜事務影響教學管理。本設計是基于藍牙技術的考勤系統創建一個能檢測藍牙并且完成簽到的APP,藍牙可以再一定的距離之內來檢測學生或者員工有沒有到指定的地方上課或者工作。該考勤系統只用到手機端的藍牙,十分方便。原理是使用藍牙的客戶端BluetoothSocket和服務端BluetoothServerSocket兩個功能,創建一個使用bluetoothadapter為主的藍牙列表,這個APP系統能自動搜索藍牙設備,這個APP還能登陸檢查簽到,并對事先做好的藍牙設備地址數據庫進行對比從而完成學生的考勤登記。所以基于藍牙技術的考勤系統設計的意義很重大不僅能夠減少考勤成本,還能是教學管理更為高效。關鍵詞:藍牙;bluetoothadapter;BluetoothSocket;BluetoothServerSocketAttendanceSystemBasedonBluetoothTechnology-BluetoothCommunicationDesignAbstractAsacontemporarycollegestudent,theattendanceofteacherscannotbeavoidedinclass,andtheattendanceisstillmainlybasedontheteacher'srollcall.Oftenaftertherollcallhastakenupasmallpartoftheclass,isnotonlyinefficient,butalsoattendancemanystudentscanhelpotherstoreplace,sobigflaws.Inenterprises,attendanceismainlybasedonfingerprintandfacescanning,whichcostsalotandwastessomesocialresources,whichisnotconducivetopromotion.Thebluetoothattendancesystembasedoninformationarisesatthehistoricmoment,thedevelopmentofTheTimes,andismoreandmorepopular.Becausetheschoolcanbringamoreefficientwaytodealwithattendance,teachingmanagementcanbecarriedoutsmoothly,sothatstudentswillnothaveloopholestodrill,alsowillnotaffecttheteachingmanagementbecauseoftheattendancesystemandothercomplicatedthings.ThebluetoothattendancesystembasedoninformationarisesatthehistoricmomentandADAPTStothedevelopmentofTheTimes.Whentheintroductionofthisbluetoothattendancemethod,itisverypopularwithcolleges,afterall,canmaketheclasstimealotmoreefficient.ThisdesignisbasedonthebluetoothtechnologyattendancesystemtocreateanAPPthatcandetectthebluetoothandcompletethecheck-in.Thebluetoothcandetectwhetherstudentsoremployeesareattendingclassesorworkinginthedesignatedplacewithinacertaindistance.TheattendancesystemonlyUSESbluetoothonthemobileterminal,whichisveryconvenient.TheprincipleistousebluetoothclientBluetoothSocketandserviceBluetoothServerSockettwofunctions,tocreateabluetoothadapterbasedbluetoothlist,theAPPsystemcanautomaticallysearchforbluetoothdevices,theAPPcanalsologincheckin,andthepre-madebluetoothdeviceaddressdatabaseforcomparisontocompletethestudentattendanceregistration.Therefore,thedesignofattendancesystembasedonbluetoothtechnologyisofgreatsignificance,whichcannotonlyreducetheattendancecost,butalsomaketheteachingmanagementmoreefficient.Curbthebehaviorofstudentstosigntohelpclassmates,alsowillnotaffecttheteachingmanagementbecauseoftheattendancesystemandothercomplicatedthings.Keywords:bluetooth;bluetoothadapter;bluetoothSocket;bluetoothServerSocket目錄一、引言 11.1本設計的目的、意義及應達到的技術要求 11.2本設計在國內外的發展概況及存在的問題 21.3本設計應解決的主要問題 2二、基于藍牙的考勤系統設計的整體設計方案 22.1基于藍牙設計的考勤系統組成 22.2系統需求分析 32.2.1藍牙通信模塊設計的功能需求分析 32.2.2藍牙通信模塊設計的非公能需求分析 42.3系統的設計對象選擇及介紹 42.4系統設計語言的選擇以及介紹 5三、編程環境的搭建 83.1AndroidStudio的環境搭建 83.2MyEclipse的環境搭建 11四、藍牙技術在Android開發中的應用 114.1藍牙的介紹 114.2藍牙技術協議的協議棧和協議棧體系結構 124.2.1藍牙的底層協議 134.2.2藍牙的中間層協議 134.2.3藍牙的應用層協議 144.3Android系統中的Android.Bluetooth包 14藍牙通信模塊設計的具體實現 165.1設計思路 175.2建立藍牙的連接 175.3讀取數據,發送消息和文件 185.4監聽藍牙設備 21總結和工作展望 226.1總結 226.2工作展望 23參考文獻 24致謝 25附錄 26一、引言在如今的大學考勤系統中,很多都是以紙張為載體的考勤,而且浪費老師講課的時間,最主要很多學生可以蒙混過關,想不去上課就不去上課,造成當代大學生很多人沒有很好完成大學學業。而企業的考勤系統,是用了指紋和掃描臉部為主,在這些考勤中,效率是提高了很多,也很難出現考勤的錯誤,唯一的缺點就是成本高而且還有復雜的操作,在資源有限的社會,不利于推廣。在科技不斷發展的如今,這一類考勤慢慢會被社會所拋棄,所以這時候基于藍牙設計的考勤系統應運而生?;谒{牙設計的考勤系統,就是通過APP連接到手機的藍牙,登錄自己的信息實現課堂上或者上班的考勤,簡單方便。這個APP它具有注冊信息,登錄信息,檢查簽到,和請假的功能,APP通過HTTP協議與服務器通信,通過數據庫管理我們的簽到數據,老師端從而處理我們的簽到信息,進行簽到。這個APP還有老師端和學生端這兩個功能,適時的切換信息和收集學生的請假信息,從而很快的去處理這些簽到信息。1.1、本設計的目的、意義及應達到的技術要求本設計的目的是設計出一款APP軟件對高校上課的學生或者企業上班考勤的員工進行智能手機藍牙的精確識別,并且做出考勤的簽到、統計、請假反饋給老師或者上司。這樣的話我們就可以很方便的將考勤交給這個APP來實現,而不是浪費在老師點名上,節約老師在考勤方面的時間。應達到的技術是要求研究一種APP管理系統識別學生的藍牙,分為學生端和老師端。利用Android系統提供給我們的藍牙客戶端bluetoothSocket和藍牙服務端bluetoothServerSocket。通過查閱資料可以根據藍牙有其地址的唯一性,首先提前將學生的信息放進數據庫了,一旦我們掃描到了學生的藍牙就可以進行作信息的整合比較。我們的老師就可以通過這款APP判斷學生的上課考勤的情況,從而實現本次設計功能。mysql是服務端的數據庫主要用來處理登錄、注冊、收發通知,而sqlite為本地數據庫,主要用來存儲藍牙通訊的簽到以及請假,收集這些數據進行整理反饋?;谝陨险n題需要研究的內容有以下方面:學生和教師的登錄注冊;藍牙端的通信設置和藍牙連接設置;學生端使用藍牙簽到和藍牙請假;教師端查看考勤和查看請假;學生端調起QQ聯系老師;教師端發布通知和學生端接收通知;關于系統和退出系統;分析考勤數據Mysql服務端的數據庫和sqlite本地的數據庫;程序的編寫與調試;1.2、本設計在國內外的發展概況及存在的問題現在的高校學生逃課率非常嚴重,經過調查有20%的逃課率,有90%的學生在大學逃過課,而且不止一次,所以形勢非常嚴峻,這讓每個學校都十分苦惱,一直找不到好的辦法來解決學生上課簽到,落后的簽到方式不僅耗費學生寶貴的上課時間而且容易造成管理失誤。而且藍牙考勤甚至沒有多少大學去展開使用,大多數的高校還是停留在點名。一旦藍牙考勤慢慢引進高校,對于高校上課考勤將會有很大的幫助。目前基于藍牙設計存在的主要問題是藍牙的穩定性和連接藍牙時能否容納一個班上的同學的藍牙信息傳輸。進行1對1進行信息傳輸的時候,老師的服務端可以很好處理,但是在進行多個也就是N對1的情況下進行信息傳輸,需要一個排隊的過程,還會出現某些同學的信息缺失,這也會浪費學生的上課時間和影響老師正常授課。1.3、本設計應解決的主要問題從系統的整體設計出發,急需解決的是藍牙端的通信和藍牙端的連接,能夠保證大家的藍牙都能被APP識別并且連接的上,學生客戶端上要可以注冊和登錄并且填寫我們的基本信息,并且還能使用藍牙進行快速可靠的簽到和發送請假信息,我們設計的時候學生端還多了一項可以利用調起QQ聯系老師。而教師端可以準確無誤的查看我們的考勤狀況和請假信息,并且可以發布通知通知學生,學生也能收到信息。在Android界面上還有關于系統和退出系統的功能。利用mysql服務端的數據庫主要用來處理登錄、注冊、收發通知,而sqlite作為本地數據庫,主要用來存儲藍牙通訊的簽到以及請假數據,使用Java編程語言在Android平臺上實現對學生信息、課程信息和考勤信息的管理。這些都是我們需要解決的主要問題。二、基于藍牙的考勤系統設計的整體設計方案2.1、基于藍牙設計的考勤系統組成基于藍牙的考勤系統是使用現在十分常見的Android系統平臺,因為其操作方便快捷、界面友好、最主要的一點是其兼容性很好。使用里面的開發工具包,再加上手機自帶的藍牙模塊。創建的APP分為學生端,學生端具有簽到,注冊,登錄信息還有請假的功能,其中最關鍵的信息是每個學生對自己手機的藍牙地址,這是這個APP進行考勤的關鍵依據。教師端也有注冊,登錄,檢查簽到,對已經進行簽到的同學,記為“到課”,對沒有到課堂上課的同學記為“曠課”,對請假的同學記為“請假”。在本系統中,考勤系統一共分為到課,遲到,請假,和曠課四種。若學生曠課太多就會以信息的方式進行提醒。基于這些的實現都是建立一個服務端數據庫Mysql來處理這些大多數的信息。圖2.1基于藍牙設計的考勤系統的原理圖2.2、系統需求分析本文設計的目的是基于藍牙系統的考勤系統中的藍牙通信模塊,其中的學生業務設計模塊、教室業務設計模塊、后臺業務設計模塊、和用戶設計界面使用模塊這四個模塊不會在本文講解。要想了解這個藍牙通信,就需要我們知道怎么去建立兩個藍牙之間的連接與通信。2.2.1藍牙通信模塊設計的功能需求分析·打開手機端的藍牙·搜索可用的藍牙設備(教師端和學生端都可以互相搜索)·創建藍牙連接socket,包括短連接和與長連接?!だ脭祿煊涗浰{牙的數據·利用藍牙一鍵簽到2.2.2藍牙通信模塊設計的非公能需求分析由于技術十分有限,對于mysql服務端的數據庫和sqlite本地的數據庫的理解有限,對于大量的數據進行分析時往往會出現錯誤,無法完成整個班級的考勤簽到,即是藍牙之間的連接無法做到教師端一個對N個學生的連接通信。界面的設計也不需要太復雜,做到簡單明了,有藍牙簽到的指引提示。2.3、系統的設計對象選擇及介紹基于藍牙設計的簽到系統是使用Android操作系統,手機的操作系統有許多種,之所以選擇Android的操作系統,是因為它在很多方面都能夠很好兼容匹配,沒有排斥性。通過分析近幾年手機的銷量,發現Android系統的手機在全球的銷量是最高的,占據著一半以上的市場份額,就可以知道Android系統是很受大眾的歡迎的。由下圖可以知道Android操作系統在手機方面應用是最廣泛和最流行的。圖2.2Android手機操作系統全球市場份額現在很多人都是用安卓系統的手機,Android系統對于我們每個人都不陌生,用了之后也發覺是很好用,他的形象也是根深蒂固在人們的腦海里。安卓系統是基于Linux內核的開放源代碼的操作系統,是谷歌在2007年發布的一種操作系統。因為那時候數碼相機很受歡迎,所以初衷就是探索一個怎樣的操作系統能夠很好地開發和創建一個相對先進的數碼相機。然而,后來發現市場對數碼相機操作系統的需求不夠大,他們發現只有手機市場在快速增長,所以安卓轉向了智能手機操作系統。該年的11月份,谷歌和其他84個創造者、開發者和電信運營商共同建立了開放手持設備聯盟,共同開發和改進安卓系統。隨后,谷歌以阿帕奇免費開放許可的形式發布了安卓源代碼,允許許多制造商引入基于安卓的智慧。Android系統后來更逐漸使用在其他的開發上。應用程序Android是以Java為編程語言,這樣能夠使接口功能化,而且他的中間層主要使用Java語言實現。在優勢方面,Android操作系統有其獨特的地方。1、開放性一個系統的開放性就等于擁有了很多操作的可能性,當開放性很好時就會擁有很多的消費者。之所以Android系統這么受歡迎,就是因為其具備開放性。因為開放性,任何的移動終端和廠商都可以進行開發其想要的功能和使用。還可以利用其開放性進行優化系統,提高用戶的體驗。2、開放的源代碼讓用戶可以利用其免費的核心代碼,免費的話用的人就會多。還向開發者提供SDK,這樣的話很多程序員就可以很簡單的編寫各種應用的軟件。場強的網絡功能Android使用的WebView組件和內層建造的瀏覽器是以WebKit為核心,所以里面的很多APP可以實現內嵌各種高端的網頁功能。表現個性Android系統使用Widget來實現界面的個性化,很多廠家都可以完善當前的界面,并且還可以修改,設計屬于我們自己喜歡的產品風格。多任務系統Android系統可以同時打開我們我們想要打開的應用,而且能做到不卡頓很舒暢,我們可以看著視頻的同時在微信或者QQ發送消息,主要是因為Android系統具有很強的代碼功能使其有消息處理機制。6、Google應用由于谷歌公司在近幾年的不斷發展,讓現在互聯網都與其緊密的聯系,也讓我們的生活和網絡相互連接。谷歌還推出了很多的功能化服務,而作為其中的一份子,Android可以和這些服務進行調用還有結合,使得功能更加強大。2.4、系統設計語言的選擇以及介紹Android應用程序有大部分是采用我們熟知的Java語言開發的,在做這個考勤系統時,本人一開始選用的是c和c++來實現藍牙的通信,通過看協議時序圖,但是后來查找關于c語言設計的Android資料少之又少,所以就放棄這個想法,因為實在是難以進行本次手機系統。因為我專業學習的是C語言,在做這個考勤系統之前要不斷查找Java的資料,自學了Java語言,花費了很多時間,也讓完成這個考勤系統的難度增加了不少。在傳統的Java語言開發里,Java文件的源代碼是一步步轉化成可執行的二進制機器碼的。由下圖分析可得先是將源代碼轉化成.class文件,JVM可理解的Java字節,再通過JVM轉化為二進制機器碼。圖2.3Java語言執行的過程Java是一種面向對象的、易理解易用的、動態的語言,它是跨平臺、分布式的、闡釋的、多線程的,具有較高的安全性及移植性,非常強大,并且結構是中立的,性能極佳。而C語言則是面向過程的語言。Java也對c及c++語言進行了學習,發現在風格方面,它與后二者非常相似,且它的誕生正是因為開發者對C語言的不甚滿意。從本質上來看,java是一種半編譯半解釋的語言。它先把編譯寫好的源代碼編,使其成為二進制字節碼,接著再借助各平臺上所裝設的虛擬機來完成對字節碼的解釋執行,這使得僅需1次編譯就可以到處執行的跨平臺特性得以達成。作為通用的程序設計語言,Java的功能較為全面,可在要求高、可信的應用程序的開發中起到關鍵的作用。同c語言無異,Java語言也具有易學性。在對其語法有所了解后,就能夠發現它和C、C++語言十分相似,基本上所有的程序工作者都對C語言有所掌握,而且基于此進行編程,所以于他們而言,Java語言的學習及運用難度都不大。在Java語言當中,沒有多繼承等c++語言里運用頻率極低、理解難度大的特點。指針是C語言的學習當中最難理解的部分,而它在Java語言中是不需要的。另外,Java語言對內存中的自動的廢料收集進行了提供,故而程序工作者無需考慮內存的負荷管理問題。以下就其特點展開詳述:1.Java語言是強制面向對象的語言Java對繼承、接口、類等語句加以供應,此即為Android對其這般運用的根本緣由。為使編程更易于完成,java對各個類彼此間的單繼承、各接口彼此間的多繼承、類和接口之間的達成機制都是支持的。它對動態綁定予以支持,但是C++語言的動態綁定則僅用于虛函數中。可見,Java語言是純的且面向對象的。Java語言是強壯的因為設有異常處理、強類型機構以及自動收集垃圾等,所以有效地確保了Java語言開發的程序強壯性。放棄指針可謂是Java最聰明的一個決斷。而安全檢查機制則是使其強壯性得到提升的關鍵所在。安全可靠性能好的語言Java語言編程復雜度低,外部一般難以干擾到它,而且它還有著極強的表達力、執行力。為將外部代碼的影響消除掉,它還對一個安全機制進行了設立。譬如分配字節、類的種類等均可被其保護。此外,它的安全特性也比較豐富,備受使用者的青睞。Java語言是分布式的一個大的系統通常為劃分為多個子系統來完成,因分布式是Java語言的突出特點,故而能夠借助計算機網絡向諸多臺主機上分布諸多的后端工作,讓這些主機去完成具體的工作,以使效率大為提升。同時,還能夠對HTTP與FTP等的TCP/IP協議進行較佳的處理,以遠程調用為基礎的、以消息方式為基礎的系統間通信、網絡通信技術在分布式應用中較為常用。除此以外,此類應用的開發還有一個關鍵的方式,即Java的RMl機制。Java語言是跨平臺可移植的因為體系結構具有中立性,所以Java語言也就具有了可移植性。此外,該語言還對各種基本數據類型的長度設定了要求,而且有著較高的嚴格度。Java系統的可移植性極強,以Java語言達成Java編譯器,幾乎可以順利工作于所有的硬件或軟件平臺上,從而避免了諸多煩惱。Java語言是原生支持多線程的線程是Java語言里一種比較的特殊對象,其管理是由Jvm來完成的,且其創建必須由該語言里的Thread類或者其子(孫)類來進行。Jvm是基于lwp(輕量級進程)來使得與操作系統的內核線程1:1的映射關系得以達成的,從而使Java內部的多線程得以變為現實,同時對詳細的語法進行了供應,進而將具體的編碼完成。簡單而言,Java的多線程即可對內核線程加以調取運用從而進行執行的,故而其對于多線程的支持可謂是與生俱來的。在Java里,線程的設立可由兩個途徑達成:一是對型構為Thread(Runnable)的構造子加以運用,對1個實現了Runnable接口的對象進行包裝,使其成為1個線程;二是將子類從Thread類派生出來且對run方法進行重寫,線程就是基于該子類而設立的。Java語言是動態的在編譯過程中,有需要我們分配空間的動態環境和靜態環境,Java語言能夠很好地適應一些無時無刻不在變化的動態環境。主要是操作類,動態地被載入到運行環境。并且SE能夠很好地進行升級。在Java語言的健壯和可靠的優良特性下,就可以大大降低運營的維護成本。也可以縮短開發時間。三、編程環境搭建3.1、AndroidStudio的環境搭建AndroidStudio是Android應用設計軟件常用的一種環境軟件,用來編寫Java代碼。搭建這個軟件的方法如下:首先打開網上下載好的AndroidStudio的安裝包點擊進行安裝,一步步操作下去選擇自己安裝的程序路徑,我把它放在D盤安裝Androidstudio程序完畢后,對其進行配置,配置是非常重要的,一旦配置錯誤了,就會出現很多軟件上的錯誤,按照如下圖勾選圖3.1然后選擇自己喜歡的界面主題這里最重要的還是指定SDK的路徑,路徑錯誤,到時候編譯也會出錯,如果電腦下載好了SDK,即需指定其路徑。點擊finish就進入了Androidstudio的歡迎界面圖3.2Androidstudio歡迎界面Androidstudio已經安裝成功,就可以搭建自己的項目了圖3.3項目中的工程目錄結構圖3.4Androidstudio的工作窗口3.2、MyEclipse的環境搭建MyEclipse,是在eclipse基礎上加上自己的插件開發而成的功能強大的企業級集成開發環境,主要用于Java、JavaEE以及移動應用的開發。MyEclipse的功能非常強大,支持也十分廣泛,尤其是對各種開源產品的支持相當不錯。以下是其搭建方法:1.首先在官網下載好MyEclipse10安裝包2.點擊MyEclipse10圖標進行安裝3.然后選好工作路徑,這里注意最好不好出現中文路徑(代碼放在的地方不能出現中文路徑,否則編譯的時候會出現錯誤)4.安裝完畢就可以新建項目了圖3.5MyEclipse的工作窗口藍牙技術在Android開發中的應用4.1藍牙的介紹藍牙(Bluetooth)是一種能夠使短距離(一般為10米之內)的兩個設備之間在無線的情況下,完成他們之間的通信,這個通信是十分高效和安全的,所以在設備之間的通信時,很多人都會選擇藍牙進行。所以,藍牙技術是短距離安全無線通信技術。特別是在WiFi還沒有那么普遍的時候,上網由于網速和流量的限制,下載東西十分不方便,所以我們的一些視頻、文檔、圖片還有音樂都是通過藍牙進行資源共享。當我們距離比較遠的時候,如果上其他外設的幫助,或者增加功率是可以讓兩個設備之間的通信距離變長。因為它不需要申請無線電波許可證,所以在使用藍牙技術進行通信時,不用擔心會受一些外界頻率的干擾。通過查閱資料,可以知道要區分每個藍牙設備,就要操作藍牙的地址,因為每個藍牙模塊的地址都是獨特唯一的,不一樣的設備,藍牙的地址是不同的。這樣就很好的建立精確的通信。在Android平臺中,他包含了藍牙的框架,這樣可以使一些其他的設備以無線傳輸的方式與藍牙設備進行很穩定的數據交換。所以這也是我們考慮用Android平臺去完成這次的藍牙考勤系統。而不是選擇做個硬件去實現。4.2、藍牙技術協議的協議棧和協議棧體系結構我們都知道每個通信工具都有自己的一套協議,藍牙也不例外。藍牙技術擁有自己的一套協議,是串口通信并且符合spp協議。我們首先要了解他的藍牙協議棧,有四個層次,分別為:物理層、邏輯層、L2CAPLayer和應用層。物理層,負責提供數據傳輸的物理通道。邏輯層,是在物理層的基礎上,提供兩個以上的設備進行邏輯傳輸。L2CAP層,負責邏輯層中的邏輯鏈路。基于該協議,不同的Applicaon可共享同一個邏輯鏈路,就好像類似于TCP/IP中的端口的概念。APP層,是在用于L2CAP提供的channel,在理解了藍牙協議中的應用層后就可以實現各種各樣的功能。當我們使用不同的平臺和不同的設備的時候,Profile是藍牙協議的一種特別的存在,能夠實現在不同平臺下的不同設備中的互相連接與通信。所以這個層里定義了各種Application規范,這些應用層規范稱作藍牙profile。圖4.1藍牙的協議棧藍牙的協議棧的體系結構,根據各層協議在整個藍牙協議中所處的位置,藍牙協議又可以分為應用層協議、中間層協議和底層協議。4.2.1、藍牙的底層協議它是實現藍牙協議信息當中的多種數據流進行的傳輸鏈路,并且是該體系結構的根基,主要涵蓋了以下幾方面。(1)射頻協議作為藍牙協議棧里面最底層的協議,其主要是接收部分頻段,安排通道等,用以對物理底層無線傳輸進行規范,使空中的數據收發得以達成。具有較佳的保密性、抗干擾性。這亦為藍牙傳輸的一個突出特點。基帶協議藍牙協議層里射頻層之上即為基帶層,藍牙最關鍵的物理層就是這兩層組成的?;鶐幽軌蚩刂奇溌罚┤鏏CL鏈路等藍牙里的很多鏈路都受其管理。除此以外,它還可以接入藍牙設備、對數據包進行處理、對藍牙數據進行傳送等。(3)鏈路管理協議鏈路管理協議是一種數據結構式的鏈路層協議,主要執行一些設置藍牙、認證藍牙、配置藍牙,說白就是規定設備與設備之間怎樣建立連接和怎樣去通信,其鏈路的安全在這層協議里也很好地體現,還可以發現一些遠程藍牙并通過鏈路管理協議進行通信。4.2.2、藍牙的中間層協議藍牙的中間層協議又可以分為主機控制器接口協議、邏輯鏈路控制與適配協議、串口仿真協議、TCP(電話通信協議)和SDP(服務發現協議)。這些協議之間的合作,可以很好地控制著藍牙數據幀的重新組裝和分解、服務質量、組提取等。主機控制器接口協議在主機控制層有著很多傳輸層時,它可以透明化,只需要它完成藍牙數據間傳輸的任務,而且不需要清楚數據的格式。串口仿真協議運用于射頻通信,它可以基于ETS10710串口仿真協議于L2CAP上對RS-232九針串口電線電纜接口進行仿真,藍牙設備可以在無線傳輸期間借助PFCOMM來支持高層協議譬如PPP、TCP/IP、WAP等。邏輯鏈路控制與適配協議能夠對服務質量及協議進行控制,還能夠對數據進行拆開解析等,能夠為中間層其他協議的實現創造其所需的基礎性條件,它是藍牙協議棧最為關鍵的根基。電話通信協議它是一個面向bit以IIU-T控制規范為基礎的協議,能夠對藍牙設備間語音及數據的呼叫控制指令進行提供。相較于WLAN而言,藍牙技術支持語音,這正是二者的不同所在。服務發現協議網絡都有其特定的協議,服務發現協議提供一種方式發現這個協議的存在并解釋其特征。4.2.3、藍牙的應用層協議藍牙的應用層協議有一些指定模型組成,在廠家生產藍牙設備時候,都要遵循這種指定的模型,一旦遵循這種指定的模型,就可以簡單的交換對象,從而有很好的平臺獨立性。有著無線應用協議(WAP)和音頻協議(Audio)。圖4.2藍牙協議棧的體系結構4.3、Android系統中的Android.Bluetooth包要想完成藍牙設備的通信和設備與設備之間的連接,我們就一定要會編寫藍牙模塊和藍牙設備之間數據通信的代碼。完成設備雙方之間的通信需要執行以下流程:開啟學生手機端和教師手機端藍牙設備并且設置為可搜索模式、進而搜索并進行匹配藍牙、設備與設備之間的連接通信、最后一步就是實現設備之間的數據間的傳輸。實現這些我們就需要了解Android.Bluetooth包里的基本類:BluetoothAdapter類:這個類是Android提供的一個很重要的類,它可以通過調用創建的對象的靜態方法getDefaultAdapter()。用法為:圖4.3BluetoothAdapter類的用法藍牙的開關狀態可以簡化為如下圖:圖4.4藍牙開關狀態上面的BluetoothAdapter只是獲取藍牙適配器的對象,Android還提供了該類的API函數,可以有更多的藍牙控制權,如:enable()該方法用于打開我們的手機藍牙。StartDiscovery()方法是用來發現周圍打開的藍牙設備的任務,相當于藍牙設備的一個眼睛。若發現有藍牙設備的存在,就會返回一個布爾值,我們就可以從這個設備中獲取相關的信息和建立通信。isEnable()方法顧名思義就是檢查藍牙設備可以用或者不可以用,依靠其返回值來確定這個藍牙設備是不是可以用。isDiscovery()方法和isEnable差不多,也是用其返回值來確定是否正在搜索周圍可用的藍牙設備。getName()方法就是獲取藍牙設備的名稱。cancelDiscovery()就是取消藍牙設備的發現,當調用該方法就是停止對周圍藍牙進行搜索。disable()就是關閉我們的藍牙設備,藍牙一旦關閉就會停止一切工作。BluetoothSocket類是表示socket藍牙套的接口,是本地設備與其他設備的藍牙模塊進行通信的連接點。在服務端與客戶端進行數據傳輸都要用到這個類。因為這個藍牙簽到,有服務端的學生端和客戶端的教師端,所以這個類十分重要,使用如下圖:圖4.5獲取對象也有以下API:close()關閉連接getOutputStream()獲取輸出流。getInputStream()獲取輸入流。connect()嘗試連接。getRemoteDevice()獲取遠程設備,當BluetoothSocket處于連接中,會有特定的返回值來檢測其有沒有獲取。BluetoothServerSocket類指代的是一個服務來監聽對方的連接請求,連接成功后這個類就會返回一個BluetoothSocket。這個類也有以下API:accept()監聽連接。accept(inttimeout)監聽超時連接,這里一般會設定一個監聽連接的時間。close()關閉端口,釋放資源。BluetoothDevice類是指代一個藍牙的設備,可以查詢比如名稱、物理地址、類和連接狀態等相關信息。該類獲取途徑如下圖:圖4.6對象獲取途徑有以下API:getName()和上面一樣。getBluetoothClass()獲取藍牙類,需要BLUETOOTH權限。getAddress()address中文是地址。顧名思義就是獲取地址。BluetoothClass類是用來描述一個藍牙設備的通用特性和功能,還可以提供音頻或者電話服務。如果想要獲取遠端設備的屬性,可以使用getBluetoothClass()方法。有以下API:BluetoothClass.Device是常量的定義。BluetoothClass.Service服務類的常量的定義。getDeviceClass()獲取設備內部類。getMajorDeviceClass()獲取設備主類。BooleanhasService(intservice)是否支持服務類。藍牙通信模塊設計的具體實現本文研究的是藍牙通信模塊的內容。5.1、設計思路(1)整個模塊的設計思路1.利用Androidstudio建立APP端,同時在利用其中提供的藍牙工具包對藍牙進行調用還有藍牙連接,使用組件來進行頁面設計,實現界面布局及跳轉。2.利用servlet輕量級框架還有MySQL數據庫來進行服務端設計。3.利用Http請求和響應,完成數據的傳輸和交互。4.藍牙是使用經典藍牙的連接方式來建立藍牙連接通道。(2)藍牙模塊設計思路1.理解本模塊功能需求。2.了解藍牙設備的通信協議和Android藍牙的內部結構。3.選好開發語言選擇Java。4.學習Android藍牙內部的類,合理使用。5.編寫藍牙通信和藍牙連接的代碼。6.實現本模塊的功能。5.2、建立藍牙的連接以代碼的形式:5.3、讀取數據,發送消息和文件5.4、監聽藍牙設備總結和工作展望6.1、總結在本次的基于藍牙設計的考勤系統中,主要是對藍牙通信這個模塊進行了介紹和說明,在這個整體的設計中,藍牙模塊是開頭一棒,只有做好藍牙的通信連接,還有學生端的藍牙設備和教師端的藍牙設備進行配對,才能讓這個考勤開展起來。本文研究的考勤系統也就具有以下的特點:、能夠快速的進行藍牙設備的掃描,學生端設備和老師端的設備也可以進行連接,并且進行簽到,請假等等功能,老師與學生還可以互相發消息。在這個時代里,手機是我們必不可少的通信工具,這樣的話就很好的節約了上課的時間,保證上課的效率。、由于我們弄了MySQL的數據庫,可以做一些信息的整理和利用。、操作界面簡潔明了,操作更加一目了然6.2、工作展望本文設計的是基于藍牙系統的考勤簽到系統中的藍牙通信模塊的開發和設計。經過不斷地查找Android藍牙通信模塊的資料,能夠實現學生端和教師端的藍牙連接,并且成功完成簽到。但是由于我們小組對數據庫理解能力有限,在數據的容量方面沒有做的足夠好,僅限老師端的藍牙連接幾個學生端的藍牙,也沒有辦法進行云存儲技術,也沒有測試手機的兼容性,出現了一些不可避免的兼容性錯誤。為了更完善的利用這個簽到系統,展望可以從以下幾個方面著手:本次設計的APP僅支持Android系統,對于IOS系統是不兼容的,所以僅限于安卓系統的手機可以進行簽到。不能進行一對N的連接,就是不能進行一個班級上的藍牙考勤簽到。功能也是比較簡單單一,一個成熟的系統是需要多功能化的。由于小組成員開發的能力十分有限,界面也是比較簡單,信息的提示也是不夠直觀。不能很好的保證用戶體驗效果。參考文獻錢志鴻,楊帆,周求湛編著.

2006藍牙技術原理、開發與應用[M].

北京航空航天大學出版社

2006

[2]李成思,劉欣寧.基于手機的高校課堂考勤系統的探索與實踐[J].河南科技.

2017(13)

[3]張晶.基于Android平臺下的高校學生考勤系統設計與實現[J].

科技展望.

2016(17)

[4]姚南野,王林平,鄭世玨,陶立秋.基于藍牙通信的高校課堂手機考勤管理系統[J].

計算機與數字工程.

2014(10)

[5]邰偉鵬,徐宏.高校選課制下藍牙考勤管理系統的研究與實現[J].

安徽工業大學學報(社會科學版).

2012(04)

[7]謝曉.基于藍牙無線局域網的文件傳輸系統的研究與設計[D].

北京郵電大學

2007張瑞,于瀟榕.基于Android智能終端移動考勤系統的設計與實現[J].信息技術2015(4)謝振東,羅志來.藍牙4.0應用研究[J].中國新產品新技術2015(17)[10]弓寧.計算機軟件開發中JAVA編程語言的應用[J].計算機產品與流通.2020(01)[11]楊旭.JAVA編程語言在計算機軟件開發中的應用[J].電子技術與軟件工程.2018(07)致謝值此論文完成之際,大學四年尾站的鐘聲響起,這也意味著我在北京理工大學珠海學院的求學生涯進入尾聲,這讓我感慨萬千。在這四年的大學時光里,看似漫長但時間過得很快,就仿佛剛踏入校門,實則是半只腳踏出門外。在大學這四年里,我認識了很多的朋友、同學、老師,在我遇到困難的時候都是他們陪伴在我身邊,和我一起排憂解難,一起快樂玩耍。努力奮斗的時候有他們互幫互助,使我更能體會到團隊的重要性,由衷地感謝能在北京理工大學珠海學院里認識到他們。當然,為期一學期的畢業設計使我記憶深刻,我首先要感謝易國榮老師嚴謹治學的態度,他不厭其煩的為我們排憂解難,在我遇到困難時悉心的指導我,還幫我們講解論文的格式、邏輯和規范化。從他身上,我學習到的不僅僅是論文的撰寫和項目的設計,還學會了怎么去更好的做一件事,這讓我受益匪淺。同時也非常感謝我們組的小組成員,沒有他們,我是完成不了這個基于藍牙設計的簽到系統,我也從中跟他們學習到Android和Java語言的應用,是他們帶領我入門科研的深海,學習科技中的奧秘。還要感謝在這次畢設中幫助我解決困難的每個人,在我遇到藍牙通信和藍牙連接方面一頭暮水時,是他們為我講解藍牙通信的原理,和客戶端服務端的區分。在這次畢設中,我學到當我們在做一個項目時,一定要學會提出問題還有解決問題,在設計中要時常進行交流,才能使得我們這個APP能夠更加完善,功能更加可靠,而且大量的資料也使得我們的視野更加廣闊。感謝父母這么多年對我的支持和鼓勵以及包容,同時為我能順利完成畢業設計給了巨大的支持。在未來的日子里將繼續學習和工作,不斷提升自己,做更好的自己!附錄附錄1程序源代碼1.藍牙連接packagecom.app.bs.kqqd.bluetooth.api;importjava.io.IOException;importjava.util.concurrent.TimeoutException;publicinterfaceConnector{voidstartServer();voidstopServer();booleanisServerOK();voidconnect()throwsTimeoutException,IOException;booleanisConnected();voidsend(byte[]b)throwsIOException;intrecv(byte[]b)throwsIOException;intrecv(byte[]b,intoffset,intcount)throwsIOException;voiddisconnect();} 調用藍牙進行匹配連接packagecom.app.bs.kqqd.bluetooth.api;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothServerSocket;importandroid.bluetooth.BluetoothSocket;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.Set;importjava.util.UUID;publicclassBluetoothConnectorimplementsConnector{publicfinalstaticStringMOS_UUID="6c12a327-0e0b-4344-8137-c41e2a79a50d";privateStringdeviceAddress;BluetoothServerSocketserverSocket;privatebooleanstopServerFlag;privateBluetoothSocketlocalSocket;privateBluetoothSocketremoteSocket;privateBluetoothSocketconnectedSocket;privateInputStreaminputStream;privateOutputStreamoutputStream;publicBluetoothConnector(){}publicBluetoothConnectorremoteDeviceAddress(StringdeviceAddress){this.deviceAddress=deviceAddress;returnthis;}publicvoidstartServer(){newThread(newRunnable(){@Overridepublicvoidrun(){BluetoothAdapterbluetoothAdapter=BluetoothAdapter.getDefaultAdapter();if(null==bluetoothAdapter){return;}try{serverSocket=bluetoothAdapter.listenUsingRfcommWithServiceRecord("MOS_SERVICE",UUID.fromString(MOS_UUID));}catch(IOExceptione){serverSocket=null;return;}stopServerFlag=false;while(!stopServerFlag){try{remoteSocket=serverSocket.accept();connectedSocket=remoteSocket;inputStream=connectedSocket.getInputStream();outputStream=connectedSocket.getOutputStream();}catch(IOExceptione){}}stopServer();}},"BluetoothServer").start();}publicvoidstopServer(){disconnect();stopServerFlag=true;if(null!=serverSocket){try{serverSocket.close();}catch(IOExceptione){e.printStackTrace();}serverSocket=null;}}@OverridepublicbooleanisServerOK(){if(null==serverSocket){returnfalse;}returntrue;}@Overridepublicvoidconnect()throwsIOException{BluetoothAdapterbluetoothAdapter=BluetoothAdapter.getDefaultAdapter();Set<BluetoothDevice>bondedDevices=bluetoothAdapter.getBondedDevices();booleandeviceFound=false;for(BluetoothDevicedevice:bondedDevices){if(device.getAddress().equals(deviceAddress)){deviceFound=true;localSocket=device.createRfcommSocketToServiceRecord(UUID.fromString(MOS_UUID));localSocket.connect();connectedSocket=localSocket;if(null!=connectedSocket){inputStream=connectedSocket.getInputStream();outputStream=connectedSocket.getOutputStream();}break;}}if(!deviceFound){thrownewIOException("bluetoothdevicenotfound");}}@OverridepublicbooleanisConnected(){if(null==connectedSocket){returnfalse;}returnconnectedSocket.isConnected();}@Overridepublicvoidsend(byte[]b)throwsIOException{if(null!=outputStream){outputStream.write(b);}}@Overridepublicintrecv(byte[]b)throwsIOException{returnrecv(b,0,b.length);}@Overridepublicintrecv(byte[]b,intoffset,intcount)throwsIOException{if(null!=inputStream){returninputStream.read(b,offset,count);}return0;}@Overridepublicvoiddisconnect(){if(null!=connectedSocket){try{inputStream=null;outputStream=null;connectedSocket.close();connectedSocket=null;}catch(IOExceptione){e.printStackTrace();}}}}3.//請求藍牙連接packagecom.app.bs.kqqd.bluetooth.api.request;importorg.json.JSONException;importorg.json.JSONObject;publicclassRequestMessageextendscom.app.bs.kqqd.bluetooth.api.Request{publicRequestMessage(){super(REQ_MSG);}publicRequestMessage(intcmd,Stringmsg){super(REQ_MSG);this.cmdId=cmd;this.msg=msg;}@OverridepublicRequestMessagenewInstance(){returnnewRequestMessage();}@OverridepublicJSONObjecttoJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.put(CMD,cmdId);jsonObject.put(MSG,msg);returnjsonObject;}@OverridepublicvoidfromJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.getInt(CMD);jsonObject.getString(MSG);}}4.未知的信息請求packagecom.app.bs.kqqd.bluetooth.api.request;importcom.app.bs.kqqd.bluetooth.api.Request;publicclassUnknownReqextendsRequest{publicUnknownReq(){super(Request.REQ_UNKNOWN);}@OverridepublicUnknownReqnewInstance(){returnnewUnknownReq();}}對請求進行相應處理packagecom.app.bs.kqqd.bluetooth.api;importorg.json.JSONException;importorg.json.JSONObject;publicclassResponse{publicstaticfinalintSUCCESS_CODE=0;publicstaticfinalStringCMD="cmd";publicstaticfinalStringCODE="code";publicstaticfinalStringMSG="msg";publicintcmdId;publicintcode;publicStringmsg="";publicResponse(intcmdId){this.cmdId=cmdId;}publicintgetCmdId(){returncmdId;}publicbooleanisOK(){returncode==SUCCESS_CODE;}publicJSONObjecttoJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.put(CMD,cmdId);jsonObject.put(CODE,code);jsonObject.put(MSG,msg);returnjsonObject;}publicvoidfromJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.getInt(CMD);jsonObject.getInt(CODE);jsonObject.getString(MSG);}publicResponsenewInstance(){returnnewResponse(cmdId);}}APP注冊請求和響應packagecom.app.bs.kqqd.bluetooth.api;importcom.app.bs.kqqd.bluetooth.api.request.RequestMessage;importcom.app.bs.kqqd.bluetooth.api.request.ResponseMessage;importcom.app.bs.kqqd.bluetooth.api.request.UnknownReq;importjava.util.HashMap;importjava.util.Map;publicclassCmdFactory{privatestaticCmdFactoryinstance;privateMap<Integer,Request>requestMap=newHashMap<>();privateMap<Integer,Response>responseMap=newHashMap<>();privateCmdFactory(){register(newRequestMessage());register(newResponseMessage());}publicstaticCmdFactorygetInstance(){if(null==instance){synchronized(CmdFactory.class){if(null==instance){instance=newCmdFactory();}}}returninstance;}publicvoidregister(Requestreq){requestMap.put(req.getCmdId(),req);}publicvoidregister(Responsersp){responseMap.put(rsp.getCmdId(),rsp);}publicRequestcreateRequest(intcmd){Requestrequest=requestMap.get(cmd);if(null!=request){returnrequest.newInstance();}returnnewUnknownReq();}publicResponsecreateResponse(intcmd){Responseresponse=responseMap.get(cmd);if(null!=response){returnresponse.newInstance();}returnnewResponse(Request.REQ_UNKNOWN);}}7.//適配器packagecom.app.bs.kqqd.adapter;importandroid.content.Context;importandroid.view.ViewGroup;importcom.app.bs.kqqd.model.GanHuo;importcom.jude.easyrecyclerview.adapter.BaseViewHolder;importcom.jude.easyrecyclerview.adapter.RecyclerArrayAdapter;/****/publicclassGanHuoAdapterextendsRecyclerArrayAdapter<GanHuo.Result>{publicGanHuoAdapter(Contextcontext){super(context);}@OverridepublicBaseViewHolderOnCreateViewHolder(ViewGroupparent,intviewType){returnnewGanHuoViewHolder(parent);}}//packagecom.app.bs.kqqd.adapter;importandroid.graphics.drawable.Drawable;importandroid.view.ViewGroup;importandroid.widget.TextView;importcom.app.bs.kqqd.R;importcom.app.bs.kqqd.model.GanHuo;importcom.app.bs.kqqd.util.TimeUtil;importcom.jude.easyrecyclerview.adapter.BaseViewHolder;/****/publicclassGanHuoViewHolderextendsBaseViewHolder<GanHuo.Result>{privateTextViewtitle;privateTextViewtype;privateTextViewwho;privateTextViewtime;publicGanHuoViewHolder(ViewGroupparent){super(parent,R.layout.ganhuo_item);title=$(R.id.title);type=$(R.id.type);who=$(R.id.who);time=$(R.id.time);}@OverridepublicvoidsetData(GanHuo.Resultdata){super.setData(data);//標題title.setText(data.getDesc());//干貨類型type.setText(data.getType());//根據干貨類型動態替換干貨圖標if(data.getType().equals("Android")){setDrawableLeft(R.drawable.ic_android_black_24dp);}elseif(data.getType().equals("iOS")){setDrawableLeft(R.drawable.ic_whatshot_black_24dp);}else{setDrawableLeft(R.drawable.ic_play_circle_filled_black_24dp);}//干貨貢獻者who.setText(data.getWho());//干貨提交時間time.setText(TimeUtil.getFormatTime(data.getPublishedAt()));}publicvoidsetDrawableLeft(intimageId){Drawabledrawable=getContext().getResources().getDrawable(imageId);drawable.setBounds(0,0,drawable.getMi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論