基于Android智能家居詳細設(shè)計(經(jīng)典)_第1頁
基于Android智能家居詳細設(shè)計(經(jīng)典)_第2頁
基于Android智能家居詳細設(shè)計(經(jīng)典)_第3頁
基于Android智能家居詳細設(shè)計(經(jīng)典)_第4頁
基于Android智能家居詳細設(shè)計(經(jīng)典)_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

基于Android的智能家居三個火槍手2013年5月

目錄TOC\o"1-3"\h\z第1章 項目概述 11.1 項目背景 11.2 術(shù)語定義 2第2章 技術(shù)方案 32.1 系統(tǒng)描述 32.2 功能描述 32.3 項目功能圖 42.4 所涉及的系統(tǒng)、工具 4第3章 前端數(shù)據(jù)中心(A8)總體設(shè)計 53.1 程序設(shè)計流程圖 53.2 線程定義 53.3 所用類定義 6第4章 前端A8模塊設(shè)計 74.1 A8-AndroidApplication層設(shè)計 74.1.1 數(shù)據(jù)流分析 74.1.2 Application層詳細設(shè)計與實現(xiàn) 94.2 A8-數(shù)據(jù)傳遞架構(gòu)模塊 164.2.1 層次接口表 164.2.2 HAL層 174.2.3 JNI層 194.2.4 Framework層 204.2.5 整體流程 214.2.6 關(guān)鍵代碼分析 224.3 傳輸協(xié)議模塊設(shè)計 324.3.1 A8接收數(shù)據(jù)格式 324.3.2 M0接收命令數(shù)據(jù)結(jié)構(gòu) 33第5章 終端M0模塊設(shè)計 355.1 終端設(shè)備方案描述 355.2 終端設(shè)備工作流程 355.3 功能模塊描述 365.3.1 溫濕度傳感器DHT10 365.3.2 ZigBee通信部分 375.3.3 RFID讀卡模塊 405.3.4 IIC接口部分 41第6章 系統(tǒng)測試 456.1 項目演示 45項目概述項目背景隨著社會電子信息化的不斷發(fā)展,人們在家居中使用的電器越來越多,由此帶來的安全隱患也有了明顯的增多。在這些電器中一旦出現(xiàn)一些異常,便會給人們帶來很大的損失。為了降低電器的不合理使用帶來的異常情況,就要求在異常發(fā)生時用戶能及時得到信息,并通過實時監(jiā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機作為多媒體監(jiān)控主機,綜合了視頻矩陣、圖像分割器、錄像機等眾多的功能,使系統(tǒng)結(jié)構(gòu)大為簡化,采用計算機網(wǎng)絡(luò)技術(shù),數(shù)字多媒體遠程網(wǎng)絡(luò)監(jiān)控不受距離限制,采用大容量磁盤陣列存盤器或光盤存儲器,可以節(jié)省大量的磁盤介質(zhì),同時有利于系統(tǒng)實現(xiàn)多媒體信息查詢。但隨著基于PC機的視頻監(jiān)控錄像系統(tǒng)的發(fā)展,在實際使用過程中,也暴露出一些不足,主要是系統(tǒng)工作的不穩(wěn)定性。以嵌入式視頻web服務(wù)器為核心的視頻監(jiān)控系統(tǒng),采用嵌入式實時多任務(wù)操作系統(tǒng)。攝像頭采集到的圖片信息經(jīng)過壓縮,通過內(nèi)部總線送到內(nèi)置的web服務(wù)器,網(wǎng)絡(luò)上的用戶可以直接用瀏覽器觀看web服務(wù)器上的由攝像頭采集的圖像。由于把圖片采集和web功能集中到一個體積很小的設(shè)備內(nèi),可以直接連入局域網(wǎng),用戶無需安裝任何硬件設(shè)備,僅用瀏覽器即可觀看。同時還具有以下優(yōu)點:布控區(qū)域廣闊,嵌入式視頻web服務(wù)器監(jiān)控系統(tǒng)web服務(wù)器直接連入網(wǎng)絡(luò),沒有線纜長度和信號衰減的限制,同時網(wǎng)絡(luò)是沒有距離概念的,徹底拋棄了地域的概念,擴展布控的區(qū)域。系統(tǒng)具有幾乎無限的無縫擴展能力。所以設(shè)備都以IP地址進行標示,增加設(shè)備只是意味著IP地址的擴充。性能穩(wěn)定可靠,無需專人管理。嵌入式web服務(wù)器實際上是基于嵌入式微處理器技術(shù),采用嵌入式實時多任務(wù)操作系統(tǒng),對于用戶來講,上網(wǎng)進行登陸,便可對家中情況進行監(jiān)控。除了WEB服務(wù)器實時控制之外,當前智能手機的發(fā)展趨勢已經(jīng)愈加明顯。智能手機(Smartphone),是指“像個人電腦一樣,具有獨立的操作系統(tǒng),可以由用戶自行安裝軟件、游戲等第三方服務(wù)商提供的程序,通過此類程序來不斷對手機的功能進行擴充,并可以通過移動通訊網(wǎng)絡(luò)來實現(xiàn)無線網(wǎng)絡(luò)接入的這樣一類手機的總稱”。而當前應(yīng)用在智能手機上的操作系統(tǒng)中Android操作系統(tǒng)占有相當大的比例。Android(中文名:安卓)是基于Linux平臺開源手機操作系統(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)公認的發(fā)展方向,它以網(wǎng)絡(luò)為依托,以數(shù)字視頻的壓縮、傳輸、存放和播放為核心,以智能實用的圖像分析為特點,并為報警系統(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ù),又稱電子標簽、無線射頻識別,是一種通信技術(shù),可通過無線電訊號識別特定目標并讀寫相關(guān)數(shù)據(jù),而無需識別系統(tǒng)與特定目標之間建立機械或光學(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è)計的系統(tǒng)。Android手機將開辟新的應(yīng)用,使家居智能化運用于普通家庭。Android界面顯示(Cortex_A8)來自于Cortex_m0模擬量,并可對Cortex_m0進行控制或操作。本系統(tǒng)做為裁減項目,實現(xiàn)了M0采集房間信息,通過無線方式發(fā)送到A8進行監(jiān)控、控制。A8即可作為移動終端設(shè)備(如phone、pad等),亦可作中央監(jiān)控服務(wù)器設(shè)備。本項目采用后者方案,即作中央監(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采集)。項目功能圖圖2.1項目功能圖所涉及的系統(tǒng)、工具表2.1系統(tǒng)與工具系統(tǒng)名稱系統(tǒng)版本備注Linux內(nèi)核Linux3.0.8Android文件系統(tǒng)Android4.0版本工具鏈arm-none-linux-gnueabi-gccAndroid程序開發(fā)Eclipse前端數(shù)據(jù)中心(A8)總體設(shè)計程序設(shè)計流程圖圖3.1程序設(shè)計流程圖線程定義1.SmartHomeActivity,程序主Activity界面,打開程序首先運行。2.NodeInfoActivity,從界面Activity,用來顯示詳細設(shè)備采集信息和控制按鍵。3.MainReadThread,讀數(shù)據(jù)主線程,該線程只負責對通過Zigbee獲取的數(shù)據(jù)轉(zhuǎn)發(fā)給讀進程,不進行數(shù)據(jù)操作。4.MainHandlerThread,處理數(shù)據(jù)線程,該線程對從讀進程傳來的數(shù)據(jù)進行數(shù)據(jù)校驗并轉(zhuǎn)發(fā)。5.NodeWriteThread,控制線程,該線程負責處理由用戶對設(shè)備的操作。所用類定義1.Data,用來存儲和處理設(shè)備的采集數(shù)據(jù)。2.NodeCmd,定義操作方法,實現(xiàn)對設(shè)備的讀操作和控制操作。3.NodeInfo,定義設(shè)備的所有采集信息,控制器狀態(tài)和WatchDog。4.NodeList,使用鏈表存儲設(shè)備信息?!??5.MyUartService:提供與底層的接口,以讀寫串口。前端A8模塊設(shè)計A8-AndroidApplication層設(shè)計數(shù)據(jù)流分析NEWNODE,新節(jié)點加入1.數(shù)據(jù)處理流程圖圖4.1 NEWNODE數(shù)據(jù)流程圖2.數(shù)據(jù)格式NEWNODE數(shù)據(jù)格式數(shù)據(jù)格式NEWNODES4FnI13.數(shù)據(jù)處理詳細描述Cortex-M0開啟,通過Zigbee發(fā)送NEWNODE數(shù)據(jù)給Cortex-A8,程序通過MainReadThread線程讀取到數(shù)據(jù),交由MainHandlerThread線程處理。MainHandlerThread對NOEWNODE進行校驗,判斷是否合法,如果數(shù)據(jù)無誤,通過發(fā)送Handler消息交由SmartHomeActivity主界面UI線程,SmartHomeActivity判斷鏈表是否已經(jīng)存在該節(jié)點,不存在則加入鏈表并創(chuàng)建節(jié)點。…….?NODEINFO,節(jié)點信息更新。1.數(shù)據(jù)處理流程圖圖4.2 NODEINFO數(shù)據(jù)流程圖2.數(shù)據(jù)格式NODEINFO數(shù)據(jù)數(shù)據(jù)格式NODEINFOS23FiI1T24H30L6V220X1Y1Z603.數(shù)據(jù)處理詳細描述Cortex-M0開啟,通過Zigbee發(fā)送NEWNODE數(shù)據(jù)給Cortex-A8,程序通過MainReadThread線程讀取到數(shù)據(jù),交由MainHandlerThread線程處理。MainHandlerThread對NODEINFO進行校驗,判斷是否合法,如果數(shù)據(jù)無誤,通過發(fā)送Handler消息交由SmartHomeActivity主界面UI線程,SmartHomeActivity判斷鏈表是否已經(jīng)存在該節(jié)點,存在則更新該鏈表信息,并判斷是否進入該節(jié)點從界面,如果進入發(fā)送Broadcast通知從界面更新數(shù)據(jù)。RFID,用戶登錄或退出。1.數(shù)據(jù)處理流程圖圖4.3 RFID數(shù)據(jù)流程圖2.數(shù)據(jù)格式RFID數(shù)據(jù)格式數(shù)據(jù)格式RFIDS11FrI1R1031323.數(shù)據(jù)處理詳細描述Cortex-M0開啟,通過Zigbee發(fā)送NEWNODE數(shù)據(jù)給Cortex-A8,程序通過MainReadThread線程讀取到數(shù)據(jù),交由MainHandlerThread線程處理。MainHandlerThread對RFID進行校驗,判斷是否合法,如果數(shù)據(jù)無誤,通過發(fā)送Handler消息交由SmartHomeActivity主界面UI線程,SmartHomeActivity發(fā)送Broadcast通知從界面,從界面判斷是否為自己設(shè)備,是則更新數(shù)據(jù)。Application層詳細設(shè)計與實現(xiàn)類對象詳細描述1.Data類,負責對接受來數(shù)據(jù)進行處理表4.1Data成員屬性表屬性類型描述serialVersionUIDlong序列化時保持版本的兼容性,即在版本升級時反序列化仍保持對象的唯一性。dataString存儲從串口的數(shù)據(jù)表4.2Data成員方法表方法參數(shù)返回值描述getDataSizeVoidString從傳來的數(shù)據(jù)獲取數(shù)據(jù)大小isValidDataVoidboolean數(shù)據(jù)有效性校驗,包括數(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類,負責與底層進行交互,實現(xiàn)對硬件設(shè)備讀,寫操作。表4.3NodeCmd成員屬性表屬性類型描述DevCmdenum使用枚舉將命令聲明一組命名的常數(shù),方便函數(shù)調(diào)用。myUartServiceMyUartService串口操作所使用框架表4.4NodeCmd成員方法表方法參數(shù)返回值描述devControlint,DevCmdString向串口發(fā)送數(shù)據(jù)readNodeVoidString從串口獲取數(shù)據(jù)3.NodeInfo類,負責存儲一個設(shè)備的信息。表4.5NodeInfo成員屬性表屬性類型描述serialVersionUIDlong序列化時保持版本的兼容性,即在版本升級時反序列化仍保持對象的唯一性。temperatureString存儲節(jié)點對象的溫度值humidityString存儲節(jié)點對象的濕度lightString存儲節(jié)點對象的光感值xString存儲節(jié)點對象的三軸加速度x值yString存儲節(jié)點對象的三軸加速度y值zString存儲節(jié)點對象的三軸加速度z值adString存儲節(jié)點對象的ad值ledint存儲節(jié)點對象的led燈狀態(tài)(0,滅;1,亮)funint存儲節(jié)點對象的風(fēng)扇狀態(tài)(0,關(guān);1,開;2,加速)beepint存儲節(jié)點對象的報警器狀態(tài)(0,關(guān);1,開)nixietubint存儲節(jié)點對象的數(shù)碼管狀態(tài)(0,關(guān);1,開)rfidrfid存儲節(jié)點對象的rfid信息devNumint存儲節(jié)點對象的設(shè)備號nextNodeInfo便于生成鏈表watchDogint看門狗,監(jiān)控節(jié)點生命值表4.6NodeInfo成員方法表方法參數(shù)返回值描述NodeInfovoidvoid構(gòu)造函數(shù),初始化節(jié)點對象NodeInfovoidint有參數(shù)構(gòu)造函數(shù),參數(shù)為節(jié)點設(shè)備號getNextvoidNodeInfo獲取下一個節(jié)點并返回節(jié)點信息setNextNodeInfovoidgetTemperaturevoidString獲取該對象溫度值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è)備的信息,便于進行界面節(jié)點的更新,刪除和添加操作。表4.7NodeList成員屬性表屬性類型描述headNodeInfo鏈表頭結(jié)點lenLong鏈表長度表4.8NodeList成員方法表方法參數(shù)返回值描述getHeadNodeInfovoid獲取鏈表頭結(jié)點setHeadvoidNodeInfo設(shè)置鏈表頭結(jié)點createNodeListvoidvoid創(chuàng)建設(shè)備節(jié)點鏈表insertNodeNodeInfovoid插入節(jié)點delNodeNodeInfovoid刪除節(jié)點allNodevoidvoid遍歷鏈表所有節(jié)點findByDevNumintNodeInfo通過設(shè)備號找到節(jié)點nodeIsNotExistedintboolean通過設(shè)備號查找節(jié)點是否存在于鏈表delByDevNumintvoid通過設(shè)備號刪除節(jié)點allNodeSetWatchDogvoidString所有設(shè)備節(jié)點看門狗減一oneNodeFeedWatchDogintvoid通過設(shè)備號找到設(shè)備節(jié)點并喂狗findNodeDogDievoidint遍歷設(shè)備節(jié)點,查看是否有節(jié)點生命結(jié)束getLenvoidint得到鏈表長度findNodeByPosintNodeInfo通過在鏈表中位置查找到設(shè)備節(jié)點線程類詳細描述1.MainReadThread類當啟動MainReadThread線程,執(zhí)行run方法,run方法先通過running判斷是否執(zhí)行讀操作,如果running為true,進行對設(shè)備讀操作,判斷MainHandlerThread處理線程是否創(chuàng)建,未創(chuàng)建則創(chuàng)建并將讀出的數(shù)據(jù)傳給MainHandlerThread,并啟動線程,循環(huán)執(zhí)行。圖4.4MainReadThreadRUN流程圖2.MainHandlerThread類當MainReadThread線程將讀取的數(shù)據(jù)傳到MainHandlerThread后,先對數(shù)據(jù)進行有效性認證,如果數(shù)據(jù)有誤,使用handler傳遞發(fā)送給SmartHomeActivity即主界面UI線程,進行處理;如果數(shù)據(jù)無誤,判斷數(shù)據(jù)類型并使用handler傳遞,發(fā)送給SmartHomeActivity進行處理。圖4.5MainHandlerThreadRUN流程圖3.NodeWriteThread類只負責執(zhí)行設(shè)備控制的命令,使用線程可以使程序多次獨立線程執(zhí)行,不被影響。圖4.6NodeWriteThreadRUN流程圖UI類詳細描述1.SmartHomeActivity類onCreatea)初始化節(jié)點列表nodeList。b)設(shè)置從界面標題,setTitle。c)設(shè)置視圖,setContentView。d)獲取主界面控件的引用,findViewById。e)設(shè)置GridView和使用的適配器BaseAdapter。f)設(shè)置選項被單擊的監(jiān)聽器,setOnItemClickListener。g)設(shè)置線程的Handler,重寫handleMessage方法。h)打開程序讀線程。i)注冊返回廣播接收器。onDestroya) 卸載廣播接收器,unregisterReceiver。b) 關(guān)閉讀線程,mainReadThread.stop。c) 關(guān)閉主界面Activity,this.finish。a) 設(shè)置所有節(jié)點的看門狗減一,allNodeSetWatchDog。b) 判斷是否有節(jié)點看門狗死亡,findNodeDogDie。如果存在,刪除Node節(jié)點鏈表,delByDevNum,并判斷是否進入該節(jié)點從界面,如果進入則發(fā)送廣播使其退出。最后,向該死亡設(shè)備發(fā)送確認命令I(lǐng)SEXIT,如果未死亡,重新發(fā)送添加節(jié)點NewNode的數(shù)據(jù)?!??c) 更新適配器notifyDataSetChanged。>>>>>>>>>>>>>>>>>>?(4) BackReceiver廣播接受器a) 從節(jié)點列表刪除從界面返回的節(jié)點的原對象,nodeList.delByDevNum()b) 向節(jié)點列表插入從界面返回的新節(jié)點對象,nodeList.insertNode()c) 關(guān)閉從界面Activity,finishActivity()。2.NodeInfoActivity類onCreatea) 創(chuàng)建從節(jié)點對象NodeInfo。b) 設(shè)置視圖,setContentView。c) 獲取從界面控件的引用,findViewById。d) 通過Intent對象,獲取從主界面?zhèn)鱽淼膎odeInfo對象并賦給從界面對象。e) 設(shè)置從界面標題,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ù)庫詳細描述1.RfidRecordDBHelper類繼承SQLiteOpenHelper類,重寫onCreate方法?!け硇陆ㄊ褂肧QLiteDatabase對象的execSQL方法去添加表。命令如下:createtableifnotexistsrfidTable(idINTEGERprimarykeyautoincrement,devIdvarchar,rfIdvarchar)·增加使用SQLiteDatabase對象的execSQL方法去增加數(shù)據(jù)。命令如下:insertintorfidTable(devId,rfId)values(?,?)·刪除使用SQLiteDatabase對象的execSQL方法去刪除數(shù)據(jù)。命令如下:deletefromrfidTablewhererfId=?2.數(shù)據(jù)庫表設(shè)計表4.9rfidTable數(shù)據(jù)庫表字段名類型屬性描述idINTEGERprimarykeyautoincrementID主鍵devIdVARCHARNull設(shè)備號rfIdVARCHARNullRFID號框架詳細描述·MyUartService類1.加載庫,System.loadLibrary("uart_runtime")2.重寫構(gòu)造函數(shù),調(diào)用本地__init方法,對設(shè)備進行初始化。3.通過調(diào)用本地方法實現(xiàn)java方法A8-數(shù)據(jù)傳遞架構(gòu)模塊層次接口表數(shù)據(jù)傳遞(串口操作)應(yīng)用層UartDataUpdateNewUartSendCmdUartDataUpdateNewUartSendCmdframework層_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圖4.6.1接口層次圖圖4.6.2結(jié)構(gòu)圖HAL層宏表4.10HAL層宏定義表名稱內(nèi)容功能UART_HARDWARE_MODULE_ID"uart"定義hal的模塊idSTART0xAA數(shù)據(jù)包的開始符NEW0x01新節(jié)點加入發(fā)的包INFO0x02采集的信息包RFID0x04刷卡時發(fā)的包全局變量表4.11HAL層全局變量表名稱類型功能fdint操作設(shè)備的文件描述符結(jié)構(gòu)體表4.12HAL層結(jié)構(gòu)體表structuart_module_t成員名類型功能commonstructhw_module_t記錄本stub的基本信息和入口structuart_control_device_t成員名類型功能commonstructhw_device_t記錄本stub操作設(shè)備時需要包括的接口uart_read_hal函數(shù)指針指向?qū)嶋H讀串口的函數(shù)uart_write_hal函數(shù)指針指向?qū)嶋H寫串口的函數(shù)4、流程圖圖4.7HAL層結(jié)構(gòu)圖JNI層宏表4.13JNI層宏定義表名稱內(nèi)容功能UART_HARDWARE_MODULE_ID"uart"定義HAL的模塊ID全局變量表4.14JNI層全局變量表名稱類型功能sUartDeviceuart_control_device_t*保存通過調(diào)用stub中的open接口后得到的deviceshandlesUartModuleuart_module_t*保存通過調(diào)用AndroidHAL標準函數(shù)hw_get_module,傳入UART_HARDWARE_MODULE_ID后得到的UARTstub的句柄流程圖JNI層主要實現(xiàn)了Java與c/c++之間的過渡,不涉及復(fù)雜的邏輯,只根據(jù)規(guī)則為上層函數(shù)調(diào)用相應(yīng)的下層接口,參見整體流程。Framework層表4.15Framework層類表publicclassMyUartService方法功能System.loadLibrary裝載編譯好的JNI層的共享庫publicMyUartService構(gòu)造函數(shù),打開并初始化串口publicStringUartDataUpdate讀取當前串口信息數(shù)據(jù)包publicintUartSendCmd向串口傳送命令數(shù)據(jù)包整體流程下續(xù):hal層圖4.8整體流程圖關(guān)鍵代碼分析NodeCmd.javastaticMyUartServicemyUartService=newMyUartService();//新建對象,初始化Strings=myUartService.UartDataUpdate();//更新采集數(shù)據(jù)myUartService.UartSendCmd(1,LED_ON);//點亮1號設(shè)備的燈MyUartService.javapackage.smarthome.uart;importandroid.util.Log;publicclassMyUartService{ /* *loadnativeservice. */ static{ System.loadLibrary("uart_runtime");//裝載庫 } publicMyUartService(){ _init();//注冊本地方法,打開串口并初始化 } /* *uartnativemethods. */ publicStringUartDataUpdate(){ Strings=_uart_data_update(); returns;v }//更新采集的數(shù)據(jù) publicintUartSendCmd(intn,intc){ _uart_send_cmd(n,c); return0; }//發(fā)送命令控制M0板 privatestaticnativeboolean_init();/聲明jni庫可以提供的方法 privatestaticnativeString_uart_data_update(); privatestaticnativeint_uart_send_cmd(intn,intc); uart_stub\include\uart.hstructuart_module_t{ structhw_module_tcommon; };//HAL規(guī)定不能直接使用hw_module_t結(jié)構(gòu),因此需要做這么一個繼承。 structuart_control_device_t{ //自定義的一個針對Uart控制的結(jié)構(gòu),包含hw_device_t和支持的API操作 structhw_device_tcommon; /*attributes*/ /*supportingcontrolAPIsgohere*/ int(*uart_read_hal)(structuart_control_device_t*dev,char*buf,intcount); int(*uart_write_hal)(structuart_control_device_t*dev,constchar*cmd);}; #defineUART_HARDWARE_MODULE_ID"uart"http://定義一個MODULE_ID,HAL層可以根據(jù)這個ID找到我們這個HALstub cn_com_smarthome_uart_MyUartService.cpp#defineLOG_TAG"MyUartService" #include"utils/Log.h" #include<stdlib.h> #include<string.h> #include<unistd.h> #include<assert.h> #include<jni.h> #include"../../uart_stub/include/uart.h" 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";//注意:必須和Framework層的service類名相 jclassclazz; /*lookuptheclass*/ clazz=env->FindClass(kClassName);//查找被注冊的類 if(clazz==NULL){ LOGE("Can'tfindclass%s\n",kClassName); return-1; } /*registerallthemethods*/ if(env->RegisterNatives(clazz,gMethods, sizeof(gMethods)/sizeof(gMethods[0]))!=JNI_OK) { LOGE("Failedregisteringmethodsfor%s\n",kClassName); return-1; }//向類中注冊本SO中Native的接口,接口定義在gMethods數(shù)組中 /*fillouttherestoftheIDcache*/ return0; } /****ThisiscalledbytheVMwhenthesharedlibraryisfirstloaded.*在Android系統(tǒng)初始化時,就會自動加載該JNI方法調(diào)用表。*當?shù)谝淮渭虞d此庫時,調(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; }//獲取當前的VM的環(huán)境,保存在env變量中 assert(env!=NULL); if(registerMethods(env)!=0){ LOGE("ERROR:PlatformLibrarynativeregistrationfailed\n"); gotofail; }//自己寫的函數(shù),向當前JAVA環(huán)境中注冊接口 /*success--returnvalidversionnumber*/ result=JNI_VERSION_1_4;fail: returnresult;}/*JNI_OnLoad()函數(shù)完成:(1)把虛擬機環(huán)境信息保存到本地庫的一個結(jié)構(gòu)體“JNIEnv”的實例中;(2)建立一個應(yīng)用層中的UART控制服務(wù)與本地庫的JNI函數(shù)表;(3)返回虛擬機本地庫使用的JNI版本。*/ 5.uart_stub\module\uart.c#defineLOG_TAG"UartStub" #include<hardware/hardware.h> #include<fcntl.h> #include<termios.h> #include<errno.h> #include<cutils/log.h> #include<cutils/atomic.h> #include<sys/ioctl.h> #include"../include/uart.h"#include"crc16.h" #defineN6 #defineSTART0xAA//用于傳輸協(xié)議的宏#defineNEW0x01#defineINFO0x02 #defineRFID0x04 intfd; typedefstruct{ charhead; chardev_no; chartype_data; charlength; chartemp[2]; charhum[2]; charbright[2]; charadc[2]; characc[3]; charrfid[N]; shortcrc16; }dev_data;//傳輸協(xié)議的格式 //CRC16的校驗函數(shù),查表法,表在crc16.h內(nèi) staticunsignedshortget_crc16(constchar*crc_head,intcrc_lenth) { unsignedcharucCRCHi=0x0; unsignedcharucCRCLo=0x0; intiIndex; while(crc_lenth--){ iIndex=ucCRCLo^*(crc_head++); ucCRCLo=(unsignedchar)(ucCRCHi^aucCRCHi[iIndex]); ucCRCHi=aucCRCLo[iIndex]; } return(unsignedshort)(ucCRCHi<<8|ucCRCLo); } staticintuart_device_close(structhw_device_t*device) { structuart_control_device_t*ctx=(structuart_control_device_t*)device; if(ctx){ free(ctx); } close(fd); return0; } staticintuart_read_drv(structuart_control_device_t*dev,char*buf,intcount) { dev_datainfo_buf; charrev_buf[40]={0};//用于存放整個消息包 chardata_buf[40]={0};//用于存放消息包內(nèi)的數(shù)據(jù)段 charch; ssize_tcur_size=0; ssize_tr_size=0; chardata_lenth=0;//數(shù)據(jù)段的長度 chardata_type;//數(shù)據(jù)類型 char*data_head;//數(shù)據(jù)段頭 intdev_no; //設(shè)備號 char*crc_head;//用于CRC校驗的頭 intcrc_lenth; //用于crc校驗的長度,從消息包頭到數(shù)據(jù)段尾 unsignedshortcrc16;//校驗值 inttimeout=10;//超時處理,長時間讀不到消息,當timeout減到0時,返回到上層 while(1) { timeout--;//由于采用輪詢讀的方法,如果沒消息則會一直循環(huán),設(shè)置一個超時值,當超出后還沒數(shù)據(jù)的話,就退出此次讀消息 if(!timeout){ LOGI("Nostartinfo_buf"); retu

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論