版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于Android的智能家居三個火槍手2013年5月
目錄TOC\o"1-3"\h\z項(xiàng)目概述項(xiàng)目背景隨著社會電子信息化的不斷發(fā)展,人們在家居中使用的電器越來越多,由此帶來的安全隱患也有了明顯的增多。在這些電器中一旦出現(xiàn)一些異常,便會給人們帶來很大的損失。為了降低電器的不合理使用帶來的異常情況,就要求在異常發(fā)生時(shí)用戶能及時(shí)得到信息,并通過實(shí)時(shí)監(jiān)控采取一定的操作排除異常。因此,遠(yuǎn)程監(jiān)控系統(tǒng)的作用是非常巨大的。90年代末,隨著多媒體技術(shù)、視頻壓縮編碼技術(shù)、網(wǎng)絡(luò)通訊技術(shù)的發(fā)展,數(shù)字視頻監(jiān)控系統(tǒng)迅速崛起,現(xiàn)今市場上由兩種數(shù)字視頻監(jiān)控系統(tǒng)類型,一種是以數(shù)字錄像設(shè)備為核心的視頻監(jiān)控系統(tǒng),另一種是以嵌入式視頻web服務(wù)器為核心的視頻監(jiān)控系統(tǒng)。以數(shù)字錄像設(shè)備為核心的視頻監(jiān)控系統(tǒng)采用PC機(jī)作為多媒體監(jiān)控主機(jī),綜合了視頻矩陣、圖像分割器、錄像機(jī)等眾多的功能,使系統(tǒng)結(jié)構(gòu)大為簡化,采用計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),數(shù)字多媒體遠(yuǎn)程網(wǎng)絡(luò)監(jiān)控不受距離限制,采用大容量磁盤陣列存盤器或光盤存儲器,可以節(jié)省大量的磁盤介質(zhì),同時(shí)有利于系統(tǒng)實(shí)現(xiàn)多媒體信息查詢。但隨著基于PC機(jī)的視頻監(jiān)控錄像系統(tǒng)的發(fā)展,在實(shí)際使用過程中,也暴露出一些不足,主要是系統(tǒng)工作的不穩(wěn)定性。以嵌入式視頻web服務(wù)器為核心的視頻監(jiān)控系統(tǒng),采用嵌入式實(shí)時(shí)多任務(wù)操作系統(tǒng)。攝像頭采集到的圖片信息經(jīng)過壓縮,通過內(nèi)部總線送到內(nèi)置的web服務(wù)器,網(wǎng)絡(luò)上的用戶可以直接用瀏覽器觀看web服務(wù)器上的由攝像頭采集的圖像。由于把圖片采集和web功能集中到一個體積很小的設(shè)備內(nèi),可以直接連入局域網(wǎng),用戶無需安裝任何硬件設(shè)備,僅用瀏覽器即可觀看。同時(shí)還具有以下優(yōu)點(diǎn):布控區(qū)域廣闊,嵌入式視頻web服務(wù)器監(jiān)控系統(tǒng)web服務(wù)器直接連入網(wǎng)絡(luò),沒有線纜長度和信號衰減的限制,同時(shí)網(wǎng)絡(luò)是沒有距離概念的,徹底拋棄了地域的概念,擴(kuò)展布控的區(qū)域。系統(tǒng)具有幾乎無限的無縫擴(kuò)展能力。所以設(shè)備都以IP地址進(jìn)行標(biāo)示,增加設(shè)備只是意味著IP地址的擴(kuò)充。性能穩(wěn)定可靠,無需專人管理。嵌入式web服務(wù)器實(shí)際上是基于嵌入式微處理器技術(shù),采用嵌入式實(shí)時(shí)多任務(wù)操作系統(tǒng),對于用戶來講,上網(wǎng)進(jìn)行登陸,便可對家中情況進(jìn)行監(jiān)控。除了WEB服務(wù)器實(shí)時(shí)控制之外,當(dāng)前智能手機(jī)的發(fā)展趨勢已經(jīng)愈加明顯。智能手機(jī)(Smartphone),是指“像個人電腦一樣,具有獨(dú)立的操作系統(tǒng),可以由用戶自行安裝軟件、游戲等第三方服務(wù)商提供的程序,通過此類程序來不斷對手機(jī)的功能進(jìn)行擴(kuò)充,并可以通過移動通訊網(wǎng)絡(luò)來實(shí)現(xiàn)無線網(wǎng)絡(luò)接入的這樣一類手機(jī)的總稱”。而當(dāng)前應(yīng)用在智能手機(jī)上的操作系統(tǒng)中Android操作系統(tǒng)占有相當(dāng)大的比例。Android(中文名:安卓)是基于Linux平臺開源手機(jī)操作系統(tǒng)名稱,該平臺由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號稱是首個為移動終端打造的真正開放和完整的移動軟件。隨著Android應(yīng)用的更見廣泛,了解并能使用Android來完成我們對智能家居的控制已經(jīng)顯得愈加重要?,F(xiàn)在監(jiān)控系統(tǒng)發(fā)展到第三代,前端一體化、視頻十字化、監(jiān)控網(wǎng)絡(luò)化、系統(tǒng)集成化成為視頻監(jiān)控系統(tǒng)公認(rèn)的發(fā)展方向,它以網(wǎng)絡(luò)為依托,以數(shù)字視頻的壓縮、傳輸、存放和播放為核心,以智能實(shí)用的圖像分析為特點(diǎn),并為報(bào)警系統(tǒng)、門禁系統(tǒng)完美的整合到一個使用平臺上,引發(fā)了視頻控制行業(yè)的一次技術(shù)革命。術(shù)語定義Android:Android是一種以Linux為基礎(chǔ)的開放源碼操作系統(tǒng),主要使用于便攜設(shè)備。HAL:硬件抽象層。JNI:JNI是JavaNativeInterface的縮寫,中文為JAVA本地調(diào)用。RFID:射頻識別即RFID(RadioFrequencyIDentification)技術(shù),又稱電子標(biāo)簽、無線射頻識別,是一種通信技術(shù),可通過無線電訊號識別特定目標(biāo)并讀寫相關(guān)數(shù)據(jù),而無需識別系統(tǒng)與特定目標(biāo)之間建立機(jī)械或光學(xué)接觸。A8:ARMCortex-A8處理器是第一款基于ARMv7架構(gòu)的應(yīng)用處理器,并且是有史以來ARM開發(fā)的性能最高、最具功率效率的處理器。M0:Cortex-M0處理器,是市場上現(xiàn)有的最小、能耗最低、最節(jié)能的ARM處理器。技術(shù)方案系統(tǒng)描述Android是一個開放源碼的操作系統(tǒng)專門為移動電話而設(shè)計(jì)的系統(tǒng)。Android手機(jī)將開辟新的應(yīng)用,使家居智能化運(yùn)用于普通家庭。Android界面顯示(Cortex_A8)來自于Cortex_m0模擬量,并可對Cortex_m0進(jìn)行控制或操作。本系統(tǒng)做為裁減項(xiàng)目,實(shí)現(xiàn)了M0采集房間信息,通過無線方式發(fā)送到A8進(jìn)行監(jiān)控、控制。A8即可作為移動終端設(shè)備(如phone、pad等),亦可作中央監(jiān)控服務(wù)器設(shè)備。本項(xiàng)目采用后者方案,即作中央監(jiān)控。若需作移動設(shè)備,只需將程序移植到移動設(shè)備上,再在中央端移植web服務(wù)器,移動設(shè)備登陸服務(wù)器即可查看房屋信息。功能描述1.檢測室內(nèi)溫度、濕度、光感、電壓情況(通過Cortex_m0采集的信息)。2.通過溫度、濕度的情況來對應(yīng)調(diào)節(jié)風(fēng)扇開關(guān)(控制Cortex_m0)。3.根據(jù)光敏傳感器情況對應(yīng)調(diào)節(jié)led燈亮滅(控制Cortex_m0)。4.根據(jù)三軸加速度情況對應(yīng)調(diào)節(jié)蜂鳴器開關(guān)(控制Cortex_m0)。5.顯示Rfid信息等功能(通過Cortex_m0采集)。項(xiàng)目功能圖圖項(xiàng)目功能圖所涉及的系統(tǒng)、工具表系統(tǒng)與工具系統(tǒng)名稱系統(tǒng)版本備注Linux內(nèi)核文件系統(tǒng)版本工具鏈arm-none-linux-gnueabi-gccAndroid程序開發(fā)Eclipse前端數(shù)據(jù)中心(A8)總體設(shè)計(jì)程序設(shè)計(jì)流程圖圖程序設(shè)計(jì)流程圖線程定義1.SmartHomeActivity,程序主Activity界面,打開程序首先運(yùn)行。2.NodeInfoActivity,從界面Activity,用來顯示詳細(xì)設(shè)備采集信息和控制按鍵。3.MainReadThread,讀數(shù)據(jù)主線程,該線程只負(fù)責(zé)對通過Zigbee獲取的數(shù)據(jù)轉(zhuǎn)發(fā)給讀進(jìn)程,不進(jìn)行數(shù)據(jù)操作。4.MainHandlerThread,處理數(shù)據(jù)線程,該線程對從讀進(jìn)程傳來的數(shù)據(jù)進(jìn)行數(shù)據(jù)校驗(yàn)并轉(zhuǎn)發(fā)。5.NodeWriteThread,控制線程,該線程負(fù)責(zé)處理由用戶對設(shè)備的操作。所用類定義1.Data,用來存儲和處理設(shè)備的采集數(shù)據(jù)。2.NodeCmd,定義操作方法,實(shí)現(xiàn)對設(shè)備的讀操作和控制操作。3.NodeInfo,定義設(shè)備的所有采集信息,控制器狀態(tài)和WatchDog。4.NodeList,使用鏈表存儲設(shè)備信息。5.MyUartService:提供與底層的接口,以讀寫串口。前端A8模塊設(shè)計(jì)A8-AndroidApplication層設(shè)計(jì)數(shù)據(jù)流分析NEWNODE,新節(jié)點(diǎn)加入1.數(shù)據(jù)處理流程圖圖 NEWNODE數(shù)據(jù)流程圖2.數(shù)據(jù)格式NEWNODE數(shù)據(jù)格式數(shù)據(jù)格式NEWNODES4FnI13.數(shù)據(jù)處理詳細(xì)描述Cortex-M0開啟,通過Zigbee發(fā)送NEWNODE數(shù)據(jù)給Cortex-A8,程序通過MainReadThread線程讀取到數(shù)據(jù),交由MainHandlerThread線程處理。MainHandlerThread對NOEWNODE進(jìn)行校驗(yàn),判斷是否合法,如果數(shù)據(jù)無誤,通過發(fā)送Handler消息交由SmartHomeActivity主界面UI線程,SmartHomeActivity判斷鏈表是否已經(jīng)存在該節(jié)點(diǎn),不存在則加入鏈表并創(chuàng)建節(jié)點(diǎn)。NODEINFO,節(jié)點(diǎn)信息更新。1.數(shù)據(jù)處理流程圖圖 NODEINFO數(shù)據(jù)流程圖2.數(shù)據(jù)格式NODEINFO數(shù)據(jù)數(shù)據(jù)格式NODEINFOS23FiI1T24H30L6V220X1Y1Z603.數(shù)據(jù)處理詳細(xì)描述Cortex-M0開啟,通過Zigbee發(fā)送NEWNODE數(shù)據(jù)給Cortex-A8,程序通過MainReadThread線程讀取到數(shù)據(jù),交由MainHandlerThread線程處理。MainHandlerThread對NODEINFO進(jìn)行校驗(yàn),判斷是否合法,如果數(shù)據(jù)無誤,通過發(fā)送Handler消息交由SmartHomeActivity主界面UI線程,SmartHomeActivity判斷鏈表是否已經(jīng)存在該節(jié)點(diǎn),存在則更新該鏈表信息,并判斷是否進(jìn)入該節(jié)點(diǎn)從界面,如果進(jìn)入發(fā)送Broadcast通知從界面更新數(shù)據(jù)。RFID,用戶登錄或退出。1.數(shù)據(jù)處理流程圖圖 RFID數(shù)據(jù)流程圖2.數(shù)據(jù)格式RFID數(shù)據(jù)格式數(shù)據(jù)格式RFIDS11FrI1R1031323.數(shù)據(jù)處理詳細(xì)描述Cortex-M0開啟,通過Zigbee發(fā)送NEWNODE數(shù)據(jù)給Cortex-A8,程序通過MainReadThread線程讀取到數(shù)據(jù),交由MainHandlerThread線程處理。MainHandlerThread對RFID進(jìn)行校驗(yàn),判斷是否合法,如果數(shù)據(jù)無誤,通過發(fā)送Handler消息交由SmartHomeActivity主界面UI線程,SmartHomeActivity發(fā)送Broadcast通知從界面,從界面判斷是否為自己設(shè)備,是則更新數(shù)據(jù)。Application層詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)類對象詳細(xì)描述1.Data類,負(fù)責(zé)對接受來數(shù)據(jù)進(jìn)行處理表Data成員屬性表屬性類型描述serialVersionUIDlong序列化時(shí)保持版本的兼容性,即在版本升級時(shí)反序列化仍保持對象的唯一性。dataString存儲從串口的數(shù)據(jù)表Data成員方法表方法參數(shù)返回值描述getDataSizeVoidString從傳來的數(shù)據(jù)獲取數(shù)據(jù)大小isValidDataVoidboolean數(shù)據(jù)有效性校驗(yàn),包括數(shù)據(jù)是為為空,完整等getDataTypeVoidint從傳來的數(shù)據(jù)獲取數(shù)據(jù)類型getDataTargetVoidString從傳來的數(shù)據(jù)獲取數(shù)據(jù)的設(shè)備號getRfidVoidString從傳來的數(shù)據(jù)獲取Rfid信息getTemperatureVoidString從傳來的數(shù)據(jù)獲取溫度getHumidityVoidString從傳來的數(shù)據(jù)獲取濕度getLightVoidString從傳來的數(shù)據(jù)獲取光感g(shù)etAdVoidString傳來的數(shù)據(jù)獲取AD值getXVoidString從傳來的數(shù)據(jù)獲取三軸加速度x值getYVoidString從傳來的數(shù)據(jù)獲取三軸加速度y值getZVoidString從傳來的數(shù)據(jù)獲取三軸加速度z值2.NodeCmd類,負(fù)責(zé)與底層進(jìn)行交互,實(shí)現(xiàn)對硬件設(shè)備讀,寫操作。表NodeCmd成員屬性表屬性類型描述DevCmdenum使用枚舉將命令聲明一組命名的常數(shù),方便函數(shù)調(diào)用。myUartServiceMyUartService串口操作所使用框架表NodeCmd成員方法表方法參數(shù)返回值描述devControlint,DevCmdString向串口發(fā)送數(shù)據(jù)readNodeVoidString從串口獲取數(shù)據(jù)3.NodeInfo類,負(fù)責(zé)存儲一個設(shè)備的信息。表NodeInfo成員屬性表屬性類型描述serialVersionUIDlong序列化時(shí)保持版本的兼容性,即在版本升級時(shí)反序列化仍保持對象的唯一性。temperatureString存儲節(jié)點(diǎn)對象的溫度值humidityString存儲節(jié)點(diǎn)對象的濕度lightString存儲節(jié)點(diǎn)對象的光感值xString存儲節(jié)點(diǎn)對象的三軸加速度x值yString存儲節(jié)點(diǎn)對象的三軸加速度y值zString存儲節(jié)點(diǎn)對象的三軸加速度z值adString存儲節(jié)點(diǎn)對象的ad值ledint存儲節(jié)點(diǎn)對象的led燈狀態(tài)(0,滅;1,亮)funint存儲節(jié)點(diǎn)對象的風(fēng)扇狀態(tài)(0,關(guān);1,開;2,加速)beepint存儲節(jié)點(diǎn)對象的報(bào)警器狀態(tài)(0,關(guān);1,開)nixietubint存儲節(jié)點(diǎn)對象的數(shù)碼管狀態(tài)(0,關(guān);1,開)rfidrfid存儲節(jié)點(diǎn)對象的rfid信息devNumint存儲節(jié)點(diǎn)對象的設(shè)備號nextNodeInfo便于生成鏈表watchDogint看門狗,監(jiān)控節(jié)點(diǎn)生命值表NodeInfo成員方法表方法參數(shù)返回值描述NodeInfovoidvoid構(gòu)造函數(shù),初始化節(jié)點(diǎn)對象NodeInfovoidint有參數(shù)構(gòu)造函數(shù),參數(shù)為節(jié)點(diǎn)設(shè)備號getNextvoidNodeInfosetNextNodeInfovoidgetTemperaturevoidString獲取該對象溫度值setTemperatureStringvoid設(shè)置該對象溫度值getHumidityvoidString獲取該對象濕度值setHumidityStringvoid設(shè)置該對象濕度值getLightvoidString獲取該對象光感值setLightStringvoid設(shè)置該對象光感值getAdvoidString獲取該對象AD值setAdStringvoid設(shè)置該對象AD值getXvoidString獲取該對象三軸加速度x值setXStringvoid設(shè)置該對象三軸加速度x值getYvoidString獲取該對象三軸加速度y值setYStringvoid設(shè)置該對象三軸加速度y值getZvoidString獲取該對象三軸加速度z值setZStringvoid設(shè)置該對象三軸加速度z值getLedvoidint獲取該對象Led狀態(tài)值setLedintvoid設(shè)置該對象Led狀態(tài)值getFunvoidint獲取該對象Fun狀態(tài)值setFunintvoid設(shè)置該對象Fun狀態(tài)值getBeepvoidint獲取該對象Beep狀態(tài)值setBeepintvoid設(shè)置該對象Beep狀態(tài)值getNixietubvoidint獲取該對象Nixietub狀態(tài)值setNixietubintvoid設(shè)置該對象Nixietub狀態(tài)值getDevNumvoidint獲取該對象DevNum值setDevNumintvoid設(shè)置該對象DevNum值getRfidvoidString獲取該對象Rfid值setRfidStringvoid設(shè)置該對象Rfid值getWatchDogvoidint獲取該對象WatchDog值setWatchDogintvoid設(shè)置該對象WatchDog值ledOnvoidvoid開燈ledOffvoidvoid關(guān)燈funOnvoidvoid開風(fēng)扇FunOn1voidvoid風(fēng)扇加速funOffvoidvoid關(guān)風(fēng)扇beepOnvoidvoid開蜂鳴器beepOffvoidvoid關(guān)蜂鳴器nixietubeOnvoidvoid開數(shù)碼管nixietubeOffvoidvoid關(guān)數(shù)碼管4.NodeList類,存儲所有連接設(shè)備的信息,便于進(jìn)行界面節(jié)點(diǎn)的更新,刪除和添加操作。表NodeList成員屬性表屬性類型描述headNodeInfo鏈表頭結(jié)點(diǎn)lenLong鏈表長度表NodeList成員方法表方法參數(shù)返回值描述getHeadNodeInfovoid獲取鏈表頭結(jié)點(diǎn)setHeadvoidNodeInfo設(shè)置鏈表頭結(jié)點(diǎn)createNodeListvoidvoid創(chuàng)建設(shè)備節(jié)點(diǎn)鏈表insertNodeNodeInfovoid插入節(jié)點(diǎn)delNodeNodeInfovoid刪除節(jié)點(diǎn)allNodevoidvoid遍歷鏈表所有節(jié)點(diǎn)findByDevNumintNodeInfo通過設(shè)備號找到節(jié)點(diǎn)nodeIsNotExistedintboolean通過設(shè)備號查找節(jié)點(diǎn)是否存在于鏈表delByDevNumintvoid通過設(shè)備號刪除節(jié)點(diǎn)allNodeSetWatchDogvoidString所有設(shè)備節(jié)點(diǎn)看門狗減一oneNodeFeedWatchDogintvoid通過設(shè)備號找到設(shè)備節(jié)點(diǎn)并喂狗findNodeDogDievoidint遍歷設(shè)備節(jié)點(diǎn),查看是否有節(jié)點(diǎn)生命結(jié)束getLenvoidint得到鏈表長度findNodeByPosintNodeInfo通過在鏈表中位置查找到設(shè)備節(jié)點(diǎn)線程類詳細(xì)描述1.MainReadThread類當(dāng)啟動MainReadThread線程,執(zhí)行run方法,run方法先通過running判斷是否執(zhí)行讀操作,如果running為true,進(jìn)行對設(shè)備讀操作,判斷MainHandlerThread處理線程是否創(chuàng)建,未創(chuàng)建則創(chuàng)建并將讀出的數(shù)據(jù)傳給MainHandlerThread,并啟動線程,循環(huán)執(zhí)行。圖MainReadThreadRUN流程圖2.MainHandlerThread類當(dāng)MainReadThread線程將讀取的數(shù)據(jù)傳到MainHandlerThread后,先對數(shù)據(jù)進(jìn)行有效性認(rèn)證,如果數(shù)據(jù)有誤,使用handler傳遞發(fā)送給SmartHomeActivity即主界面UI線程,進(jìn)行處理;如果數(shù)據(jù)無誤,判斷數(shù)據(jù)類型并使用handler傳遞,發(fā)送給SmartHomeActivity進(jìn)行處理。圖MainHandlerThreadRUN流程圖3.NodeWriteThread類只負(fù)責(zé)執(zhí)行設(shè)備控制的命令,使用線程可以使程序多次獨(dú)立線程執(zhí)行,不被影響。圖NodeWriteThreadRUN流程圖UI類詳細(xì)描述1.SmartHomeActivity類onCreatea)初始化節(jié)點(diǎn)列表nodeList。b)設(shè)置從界面標(biāo)題,setTitle。c)設(shè)置視圖,setContentView。d)獲取主界面控件的引用,findViewById。e)設(shè)置GridView和使用的適配器BaseAdapter。f)設(shè)置選項(xiàng)被單擊的監(jiān)聽器,setOnItemClickListener。g)設(shè)置線程的Handler,重寫handleMessage方法。h)打開程序讀線程。i)注冊返回廣播接收器。onDestroya) 卸載廣播接收器,unregisterReceiver。b) 關(guān)閉讀線程,。c) 關(guān)閉主界面Activity,。updataLayOuta) 設(shè)置所有節(jié)點(diǎn)的看門狗減一,allNodeSetWatchDog。b) 判斷是否有節(jié)點(diǎn)看門狗死亡,findNodeDogDie。如果存在,刪除Node節(jié)點(diǎn)鏈表,delByDevNum,并判斷是否進(jìn)入該節(jié)點(diǎn)從界面,如果進(jìn)入則發(fā)送廣播使其退出。最后,向該死亡設(shè)備發(fā)送確認(rèn)命令I(lǐng)SEXIT,如果未死亡,重新發(fā)送添加節(jié)點(diǎn)NewNode的數(shù)據(jù)。c) 更新適配器notifyDataSetChanged。(4) BackReceiver廣播接受器a) 從節(jié)點(diǎn)列表刪除從界面返回的節(jié)點(diǎn)的原對象,()b) 向節(jié)點(diǎn)列表插入從界面返回的新節(jié)點(diǎn)對象,()c) 關(guān)閉從界面Activity,finishActivity()。2.NodeInfoActivity類onCreatea) 創(chuàng)建從節(jié)點(diǎn)對象NodeInfo。b) 設(shè)置視圖,setContentView。c) 獲取從界面控件的引用,findViewById。d) 通過Intent對象,獲取從主界面?zhèn)鱽淼膎odeInfo對象并賦給從界面對象。e) 設(shè)置從界面標(biāo)題,setTitle。f) 將主界面獲取的nodeInfo對象反饋到界面,setText。g) 注冊廣播接收器h) 設(shè)置返回鍵監(jiān)聽器i) 設(shè)置風(fēng)扇監(jiān)聽器,設(shè)置Led監(jiān)聽器,設(shè)置蜂鳴器監(jiān)聽器,設(shè)置數(shù)碼管監(jiān)聽器(2) onDestroy卸載廣播接收器,unregisterReceiver。數(shù)據(jù)庫詳細(xì)描述1.RfidRecordDBHelper類繼承SQLiteOpenHelper類,重寫onCreate方法。·表新建使用SQLiteDatabase對象的execSQL方法去添加表。命令如下:createtableifnotexistsrfidTable(idINTEGERprimarykeyautoincrement,devIdvarchar,rfIdvarchar)·增加使用SQLiteDatabase對象的execSQL方法去增加數(shù)據(jù)。命令如下:insertintorfidTable(devId,rfId)values(,)
·刪除使用SQLiteDatabase對象的execSQL方法去刪除數(shù)據(jù)。命令如下:deletefromrfidTablewhererfId=
2.數(shù)據(jù)庫表設(shè)計(jì)表rfidTable數(shù)據(jù)庫表字段名類型屬性描述idINTEGERprimarykeyautoincrementID主鍵devIdVARCHARNull設(shè)備號rfIdVARCHARNullRFID號框架詳細(xì)描述·MyUartService類1.加載庫,("uart_runtime")2.重寫構(gòu)造函數(shù),調(diào)用本地__init方法,對設(shè)備進(jìn)行初始化。3.通過調(diào)用本地方法實(shí)現(xiàn)java方法A8-數(shù)據(jù)傳遞架構(gòu)模塊層次接口表數(shù)據(jù)傳遞(串口操作)應(yīng)用層UartDataUpdateNewMyUartServiceUartSendCmdUartDataUpdateNewMyUartServiceUartSendCmdframework層_uart_send_cmd_uart_data_update_init_uart_send_cmd_uart_data_update_initJNI層Uart_writeUart_initUUart_writeUart_initUart_readHal層Uart_write_halUart_read_drvUart_device_openUart_read_halUart_write_drvUart_write_halUart_read_drvUart_device_openUart_read_halUart_write_drv驅(qū)動WriteOpenWriteOpenRead圖接口層次圖圖結(jié)構(gòu)圖HAL層宏表HAL層宏定義表名稱內(nèi)容功能UART_HARDWARE_MODULE_ID"uart"定義hal的模塊idSTART0xAA數(shù)據(jù)包的開始符NEW0x01新節(jié)點(diǎn)加入發(fā)的包INFO0x02采集的信息包RFID0x04刷卡時(shí)發(fā)的包全局變量表HAL層全局變量表名稱類型功能fdint操作設(shè)備的文件描述符結(jié)構(gòu)體表HAL層結(jié)構(gòu)體表structuart_module_t成員名類型功能commonstructhw_module_t記錄本stub的基本信息和入口structuart_control_device_t成員名類型功能commonstructhw_device_t記錄本stub操作設(shè)備時(shí)需要包括的接口uart_read_hal函數(shù)指針指向?qū)嶋H讀串口的函數(shù)uart_write_hal函數(shù)指針指向?qū)嶋H寫串口的函數(shù)4、流程圖圖HAL層結(jié)構(gòu)圖JNI層宏表JNI層宏定義表名稱內(nèi)容功能UART_HARDWARE_MODULE_ID"uart"定義HAL的模塊ID全局變量表JNI層全局變量表名稱類型功能sUartDeviceuart_control_device_t*保存通過調(diào)用stub中的open接口后得到的deviceshandlesUartModuleuart_module_t*保存通過調(diào)用AndroidHAL標(biāo)準(zhǔn)函數(shù)hw_get_module,傳入U(xiǎn)ART_HARDWARE_MODULE_ID后得到的UARTstub的句柄流程圖JNI層主要實(shí)現(xiàn)了Java與c/c++之間的過渡,不涉及復(fù)雜的邏輯,只根據(jù)規(guī)則為上層函數(shù)調(diào)用相應(yīng)的下層接口,參見整體流程。Framework層表Framework層類表publicclassMyUartService方法功能裝載編譯好的JNI層的共享庫publicMyUartService構(gòu)造函數(shù),打開并初始化串口publicStringUartDataUpdate讀取當(dāng)前串口信息數(shù)據(jù)包publicintUartSendCmd向串口傳送命令數(shù)據(jù)包整體流程下續(xù):hal層圖整體流程圖關(guān)鍵代碼分析staticMyUartServicemyUartService=newMyUartService(); */ static{ ("uart_runtime"); */ publicStringUartDataUpdate(){ Strings=_uart_data_update(); returns;v }/../uart_stub/include/" staticuart_control_device_t*sUartDevice=0; staticuart_module_t*sUartModule=0; JNINativeMethod是jni層注冊的方法,F(xiàn)ramework層可以使用這些方法*_init、uart_read、uart_write是在Framework中調(diào)用的方法名稱,函數(shù)的類型及返回值如下: *()Z無參數(shù)返回值為bool型 *()Ljava/lang/String;無參數(shù)返回值為String型 *(II)I參數(shù)為2個int型返回值為int型 staticconstJNINativeMethodgMethods[]={ {"_init","()Z",(void*)uart_init}, {"_uart_data_update","()Ljava/lang/String;",(void*)uart_read}, {"_uart_send_cmd","(II)I",(void*)uart_write}, }; staticintregisterMethods(JNIEnv*env){ staticconstchar*constkClassName= "cn/com/smarthome/uart/MyUartService";*在Android系統(tǒng)初始化時(shí),就會自動加載該JNI方法調(diào)用表。*當(dāng)?shù)谝淮渭虞d此庫時(shí),調(diào)用此函數(shù)注冊本地方法*/jintJNI_OnLoad(JavaVM*vm,void*reserved){ JNIEnv*env=NULL; jintresult=-1; LOGI("zzs_JNI_OnLoad"); if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){ LOGE("ERROR:GetEnvfailed\n"); gotofail; }uart_stub\module\#defineLOG_TAG"UartStub" #include<hardware/> #include<> #include<> #include<> #include<cutils/> #include<cutils/> #include<sys/> #include"../include/"#include"" #defineN6 #defineSTART0xAAdH%d.%dL%dV%d.%dX%dY%dZ%d",rev_buf[4],rev_buf[5], rev_buf[6],rev_buf[7],((rev_buf[8]<<8)|rev_buf[9]),rev_buf[10],rev_buf[11], rev_buf[12],rev_buf[13],rev_buf[14]); 述M0有兩個SPI控制器,分別為SPI0和SPI1,與ZigBee相連的是SPI1,SPI0與RFID模塊相連。SPI接口有四個引腳,分別為SCK、SSEL、MISO和MOSI,它們的功能如下:●SCK:串行時(shí)鐘信號,用來同步數(shù)據(jù)傳輸,由主機(jī)驅(qū)動,從機(jī)接收,只有在發(fā)送數(shù)據(jù)時(shí)才會處于激活狀態(tài)?!馭SEL:作為主機(jī)時(shí),在發(fā)送數(shù)據(jù)前,使能該管腳,在發(fā)送數(shù)據(jù)結(jié)束后,釋放該管腳?!馦ISO:主機(jī)輸入,從機(jī)輸出●MOSI:主機(jī)輸出,從機(jī)輸入圖ZigBee接收中斷函數(shù)流程圖操作流程在使用SPI前,先使能SPI的時(shí)鐘單元,對于M0來說,初始狀態(tài)各個單元的時(shí)鐘模塊都是未使能的。接下來對SPI進(jìn)行基本設(shè)置,如設(shè)置數(shù)據(jù)幀長度及捕獲方式等。另外還要將M0設(shè)置為主機(jī)模式。接下來進(jìn)行數(shù)據(jù)的收發(fā)操作分析,SPI數(shù)據(jù)傳輸是雙向的,即數(shù)據(jù)發(fā)送和接受時(shí)同步的,但往往只有一個方向的數(shù)據(jù)是有效的,在操作時(shí),一般將發(fā)送和接收封裝在一個函數(shù)中。發(fā)送數(shù)據(jù)前,先要判斷TXFIFO是否滿,若不滿,則將要發(fā)送的數(shù)據(jù)寫入DR寄存器的低16位既DATA寄存器,如果此時(shí)總線上的SPI控制器不忙,則數(shù)據(jù)會被立即發(fā)送,否則,寫入DATA寄存器的數(shù)據(jù)要一直等待,直到當(dāng)前數(shù)據(jù)被發(fā)送完為止。如果發(fā)送的數(shù)據(jù)不足16位,則需要軟件進(jìn)行糾正。接收數(shù)據(jù)時(shí),先判斷RXFIFO是否不空,若不空,則可以讀取DATA寄存器里的數(shù)據(jù),這里返回的數(shù)據(jù)是最新一幀的數(shù)據(jù)。如果數(shù)據(jù)長度不足16位,則高位補(bǔ)零。SPI數(shù)據(jù)發(fā)送和接收如圖所示:圖SPI數(shù)據(jù)發(fā)送和接收流程圖RFID讀卡模塊RFID讀卡模塊通過SPI0接口與M0進(jìn)行連接,它的中斷引腳與M0的IO口相連,在主程序中,只要判斷該IO口的電平高低,即可判斷是否有卡,如果有卡,則進(jìn)行相應(yīng)的讀卡操作。RFID的命令格式為:前導(dǎo)頭+通訊長度+命令字+數(shù)據(jù)域+校檢碼其
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新疆2024年新疆兵團(tuán)中心血站招聘2人筆試歷年典型考點(diǎn)(頻考版試卷)附帶答案詳解
- 2025年數(shù)控石油深井測井儀項(xiàng)目規(guī)劃申請報(bào)告模板
- 2025年液體制劑機(jī)械項(xiàng)目申請報(bào)告模板
- 2025年兒童醫(yī)院項(xiàng)目申請報(bào)告模板
- 買賣合同協(xié)議書模板五篇
- 2024年航空材料采購合同關(guān)鍵內(nèi)容
- 實(shí)習(xí)月報(bào)范文模板【五篇】
- 公司員工離職申請書集錦7篇
- 酒店實(shí)習(xí)報(bào)告模板錦集5篇
- 2023年教師個人總結(jié)心得大全(四篇)
- CJT 313-2009 生活垃圾采樣和分析方法
- 廣安市岳池縣2022-2023學(xué)年七年級上學(xué)期期末道德與法治試題【帶答案】
- 煤矸石充填塌陷區(qū)復(fù)墾技術(shù)規(guī)程
- 黃腐植酸鈉投資項(xiàng)目可行性研究報(bào)告
- 冠脈介入進(jìn)修匯報(bào)
- 2024-2029年中國會議平板行業(yè)發(fā)展趨勢分析及投資前景預(yù)測研究報(bào)告
- 中原文化(歷史篇)智慧樹知到期末考試答案2024年
- 金蝶軟件旗艦版月底結(jié)賬作業(yè)流程操作
- (正式版)JBT 14762-2024 電動摩托車和電動輕便摩托車用閥控式鉛酸蓄電池
- 工業(yè)機(jī)器人系統(tǒng)操作員國家職業(yè)技能考核標(biāo)準(zhǔn)(2023年版)
- 大疆慧飛無人機(jī)考試題庫附有答案
評論
0/150
提交評論