![基于Android智能家居詳細設計(經(jīng)典)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/55c49be9-ef54-467d-a574-37d218eecf9e/55c49be9-ef54-467d-a574-37d218eecf9e1.gif)
![基于Android智能家居詳細設計(經(jīng)典)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/55c49be9-ef54-467d-a574-37d218eecf9e/55c49be9-ef54-467d-a574-37d218eecf9e2.gif)
![基于Android智能家居詳細設計(經(jīng)典)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/55c49be9-ef54-467d-a574-37d218eecf9e/55c49be9-ef54-467d-a574-37d218eecf9e3.gif)
![基于Android智能家居詳細設計(經(jīng)典)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/55c49be9-ef54-467d-a574-37d218eecf9e/55c49be9-ef54-467d-a574-37d218eecf9e4.gif)
![基于Android智能家居詳細設計(經(jīng)典)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/55c49be9-ef54-467d-a574-37d218eecf9e/55c49be9-ef54-467d-a574-37d218eecf9e5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、基于 Android 的智能家居三個火槍手2013 年 5 月目目 錄錄第 1 章項目概述.11.1項目背景.11.2術語定義.2第 2 章技術方案.32.1系統(tǒng)描述.32.2功能描述.32.3項目功能圖.42.4所涉及的系統(tǒng)、工具.4第 3 章前端數(shù)據(jù)中心(A8)總體設計.53.1程序設計流程圖.53.2線程定義.53.3所用類定義.6第 4 章前端 A8 模塊設計.74.1A8-ANDROID APPLICATION層設計.74.1.1數(shù)據(jù)流分析.74.1.2Application 層詳細設計與實現(xiàn).94.2A8-數(shù)據(jù)傳遞架構模塊.164.2.1層次接口表.164.2.2HAL 層.174
2、.2.3JNI 層.194.2.4Framework 層.204.2.5整體流程.214.2.6關鍵代碼分析.224.3傳輸協(xié)議模塊設計.324.3.1A8 接收數(shù)據(jù)格式.324.3.2M0 接收命令數(shù)據(jù)結構 .33第 5 章終端 M0 模塊設計.355.1終端設備方案描述.355.2終端設備工作流程.355.3功能模塊描述.365.3.1溫濕度傳感器 DHT10.365.3.2ZigBee 通信部分.375.3.3RFID 讀卡模塊.405.3.4IIC 接口部分.41第 6 章系統(tǒng)測試.456.1項目演示.45第第 1 章章 項目概述項目概述1.1 項目背景項目背景隨著社會電子信息化的不斷
3、發(fā)展,人們在家居中使用的電器越來越多,由此帶來的安全隱患也有了明顯的增多。在這些電器中一旦出現(xiàn)一些異常,便會給人們帶來很大的損失。為了降低電器的不合理使用帶來的異常情況,就要求在異常發(fā)生時用戶能及時得到信息,并通過實時監(jiān)控采取一定的操作排除異常。因此,遠程監(jiān)控系統(tǒng)的作用是非常巨大的。90 年代末,隨著多媒體技術、視頻壓縮編碼技術、網(wǎng)絡通訊技術的發(fā)展,數(shù)字視頻監(jiān)控系統(tǒng)迅速崛起,現(xiàn)今市場上由兩種數(shù)字視頻監(jiān)控系統(tǒng)類型,一種是以數(shù)字錄像設備為核心的視頻監(jiān)控系統(tǒng),另一種是以嵌入式視頻 web 服務器為核心的視頻監(jiān)控系統(tǒng)。以數(shù)字錄像設備為核心的視頻監(jiān)控系統(tǒng)采用 PC 機作為多媒體監(jiān)控主機,綜合了視頻矩陣、
4、圖像分割器、錄像機等眾多的功能,使系統(tǒng)結構大為簡化,采用計算機網(wǎng)絡技術,數(shù)字多媒體遠程網(wǎng)絡監(jiān)控不受距離限制,采用大容量磁盤陣列存盤器或光盤存儲器,可以節(jié)省大量的磁盤介質(zhì),同時有利于系統(tǒng)實現(xiàn)多媒體信息查詢。但隨著基于 PC 機的視頻監(jiān)控錄像系統(tǒng)的發(fā)展,在實際使用過程中,也暴露出一些不足,主要是系統(tǒng)工作的不穩(wěn)定性。以嵌入式視頻 web 服務器為核心的視頻監(jiān)控系統(tǒng),采用嵌入式實時多任務操作系統(tǒng)。攝像頭采集到的圖片信息經(jīng)過壓縮,通過內(nèi)部總線送到內(nèi)置的 web服務器,網(wǎng)絡上的用戶可以直接用瀏覽器觀看 web 服務器上的由攝像頭采集的圖像。由于把圖片采集和 web 功能集中到一個體積很小的設備內(nèi),可以直接
5、連入局域網(wǎng),用戶無需安裝任何硬件設備,僅用瀏覽器即可觀看。同時還具有以下優(yōu)點:布控區(qū)域廣闊,嵌入式視頻 web 服務器監(jiān)控系統(tǒng) web 服務器直接連入網(wǎng)絡,沒有線纜長度和信號衰減的限制,同時網(wǎng)絡是沒有距離概念的,徹底拋棄了地域的概念,擴展布控的區(qū)域。系統(tǒng)具有幾乎無限的無縫擴展能力。所以設備都以 IP 地址進行標示,增加設備只是意味著 IP 地址的擴充。性能穩(wěn)定可靠,無需專人管理。嵌入式 web 服務器實際上是基于嵌入式微處理器技術,采用嵌入式實時多任務操作系統(tǒng),對于用戶來講,上網(wǎng)進行登陸,便可對家中情況進行監(jiān)控。除了 WEB 服務器實時控制之外,當前智能手機的發(fā)展趨勢已經(jīng)愈加明顯。智能手機(S
6、martphone),是指“像個人電腦一樣,具有獨立的操作系統(tǒng),可以由用戶自行安裝軟件、游戲等第三方服務商提供的程序,通過此類程序來不斷對手機的功能進行擴充,并可以通過移動通訊網(wǎng)絡來實現(xiàn)無線網(wǎng)絡接入的這樣一類手機的總稱” 。而當前應用在智能手機上的操作系統(tǒng)中 Android 操作系統(tǒng)占有相當大的比例。Android( 中文名:安卓) 是基于 Linux 平臺開源手機操作系統(tǒng)名稱,該平臺由操作系統(tǒng)、中間件、用戶界面和應用軟件組成,號稱是首個為移動終端打造的真正開放和完整的移動軟件。隨著 Android 應用的更見廣泛,了解并能使用 Android 來完成我們對智能家居的控制已經(jīng)顯得愈加重要。現(xiàn)在
7、監(jiān)控系統(tǒng)發(fā)展到第三代,前端一體化、視頻十字化、監(jiān)控網(wǎng)絡化、系統(tǒng)集成化成為視頻監(jiān)控系統(tǒng)公認的發(fā)展方向,它以網(wǎng)絡為依托,以數(shù)字視頻的壓縮、傳輸、存放和播放為核心,以智能實用的圖像分析為特點,并為報警系統(tǒng)、門禁系統(tǒng)完美的整合到一個使用平臺上,引發(fā)了視頻控制行業(yè)的一次技術革命。1.2 術語定義術語定義Android: Android 是一種以 Linux 為基礎的開放源碼操作系統(tǒng),主要使用于便攜設備。HAL:硬件抽象層。JNI:JNI 是 Java Native Interface 的縮寫,中文為 JAVA 本地調(diào)用。RFID:射頻識別即 RFID(Radio Frequency IDentifica
8、tion)技術,又稱電子標簽、無線射頻識別,是一種通信技術,可通過無線電訊號識別特定目標并讀寫相關數(shù)據(jù),而無需識別系統(tǒng)與特定目標之間建立機械或光學接觸。A8: ARM Cortex-A8 處理器是第一款基于 ARMv7 架構的應用處理器,并且是有史以來 ARM 開發(fā)的性能最高、最具功率效率的處理器。M0:Cortex-M0 處理器,是市場上現(xiàn)有的最小、能耗最低、最節(jié)能的ARM 處理器。第第 2 章章 技術方案技術方案2.1 系統(tǒng)描述系統(tǒng)描述Android 是一個開放源碼的操作系統(tǒng)專門為移動電話而設計的系統(tǒng)。Android 手機將開辟新的應用,使家居智能化運用于普通家庭。Android 界面顯示
9、(Cortex_A8)來自于 Cortex_m0 模擬量,并可對Cortex_m0 進行控制或操作。本系統(tǒng)做為裁減項目,實現(xiàn)了 M0 采集房間信息,通過無線方式發(fā)送到 A8進行監(jiān)控、控制。A8 即可作為移動終端設備(如 phone、pad 等),亦可作中央監(jiān)控服務器設備。本項目采用后者方案,即作中央監(jiān)控。若需作移動設備,只需將程序移植到移動設備上,再在中央端移植 web 服務器,移動設備登陸服務器即可查看房屋信息。2.2 功能描述功能描述1.檢測室內(nèi)溫度、濕度、光感、電壓情況(通過 Cortex_m0 采集的信息) 。2.通過溫度、濕度的情況來對應調(diào)節(jié)風扇開關(控制 Cortex_m0) 。3
10、.根據(jù)光敏傳感器情況對應調(diào)節(jié) led 燈亮滅(控制 Cortex_m0) 。4.根據(jù)三軸加速度情況對應調(diào)節(jié)蜂鳴器開關(控制 Cortex_m0) 。5.顯示 Rfid 信息等功能(通過 Cortex_m0 采集) 。2.3 項目功能圖項目功能圖圖圖 2.12.1 項目功能圖項目功能圖2.4 所涉及的系統(tǒng)所涉及的系統(tǒng)、工具、工具表表 2.12.1 系統(tǒng)與工具系統(tǒng)與工具系統(tǒng)名稱系統(tǒng)名稱系統(tǒng)版本系統(tǒng)版本備注備注Linux 內(nèi)核Linux3.0.8Android 文件系統(tǒng)Android4.0 版本工具鏈arm-none-linux-gnueabi-gccAndroid 程序開發(fā)Eclipse第第 3
11、章章 前端數(shù)據(jù)中心(前端數(shù)據(jù)中心(A8)總體設計)總體設計3.1 程序設計流程圖程序設計流程圖SmartHomeActivityMainReadThreadNodeWriteThread是否觸發(fā)按鍵是否在從界面YMainHandlerThread循環(huán)HandlerdevControlUartDataUpdateMyUartServiceUartSendCmdNodeInfoActivityApplication Layer_uart_data_update_uart_send_cmdJNI LayerFrameWork Layer圖圖 3.13.1 程序設計流程圖程序設計流程圖3.2 線程定義
12、線程定義1. SmartHomeActivity,程序主 Activity 界面,打開程序首先運行。2. NodeInfoActivity,從界面 Activity,用來顯示詳細設備采集信息和控制按鍵。3. MainReadThread,讀數(shù)據(jù)主線程,該線程只負責對通過 Zigbee 獲取的數(shù)據(jù)轉發(fā)給讀進程,不進行數(shù)據(jù)操作。 4. MainHandlerThread,處理數(shù)據(jù)線程,該線程對從讀進程傳來的數(shù)據(jù)進行數(shù)據(jù)校驗并轉發(fā)。 5. NodeWriteThread,控制線程,該線程負責處理由用戶對設備的操作。3.3所用類定義所用類定義1. Data,用來存儲和處理設備的采集數(shù)據(jù)。2. Node
13、Cmd,定義操作方法,實現(xiàn)對設備的讀操作和控制操作。3. NodeInfo,定義設備的所有采集信息,控制器狀態(tài)和 WatchDog。4. NodeList,使用鏈表存儲設備信息。?5. MyUartService:提供與底層的接口,以讀寫串口。第第 4 章章 前端前端 A8 模塊設計模塊設計4.1 A8-Android Application 層設計層設計4.1.1數(shù)據(jù)流分析數(shù)據(jù)流分析4.1.1.1 NEWNODE,新節(jié)點加入,新節(jié)點加入1. .數(shù)據(jù)處理流程圖ZigbeeZigbeeMainReadThreadMainHandlerThreadSmartHomeActivityaddNewNo
14、de()updataLayOutAdd()addItem()NewNodeCortex-A8Cortex-M0nodeList.insertNode()n圖圖 4.14.1NEWNODENEWNODE 數(shù)據(jù)流程圖數(shù)據(jù)流程圖2.數(shù)據(jù)格式NEWNODE 數(shù)據(jù)格式數(shù)據(jù)數(shù)據(jù)格式格式NEWNODES4FnI13.數(shù)據(jù)處理詳細描述Cortex-M0 開啟,通過 Zigbee 發(fā)送 NEWNODE 數(shù)據(jù)給 Cortex-A8,程序通過 MainReadThread 線程讀取到數(shù)據(jù),交由 MainHandlerThread 線程處理。MainHandlerThread 對 NOEWNODE 進行校驗,判斷是否
15、合法,如果數(shù)據(jù)無誤,通過發(fā)送 Handler 消息交由 SmartHomeActivity 主界面 UI 線程,SmartHomeActivity 判斷鏈表是否已經(jīng)存在該節(jié)點,不存在則加入鏈表并創(chuàng)建節(jié)點。.?4.1.1.2 NODEINFO,節(jié)點信息更新。,節(jié)點信息更新。1.數(shù)據(jù)處理流程圖ZigbeeZigbeeMainReadThreadMainHandlerThreadSmartHomeActivitygetNodeInfo()updataLayOut()sendBroadcast()NodeInfoCortex-A8Cortex-M0nodeList.findByDevNum()i圖圖
16、4.24.2NODEINFONODEINFO 數(shù)據(jù)流程圖數(shù)據(jù)流程圖2.數(shù)據(jù)格式NODEINFO 數(shù)據(jù)數(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 線程,Sm
17、artHomeActivity 判斷鏈表是否已經(jīng)存在該節(jié)點,存在則更新該鏈表信息,并判斷是否進入該節(jié)點從界面,如果進入發(fā)送 Broadcast 通知從界面更新數(shù)據(jù)。4.1.1.3 RFID,用戶登錄或退出。,用戶登錄或退出。 1.數(shù)據(jù)處理流程圖ZigbeeZigbeeMainReadThreadMainHandlerThreadSmartHomeActivityRfid()sendBroadcast()NodeInfoCortex-A8Cortex-M0r圖圖 4.34.3RFIDRFID 數(shù)據(jù)流程圖數(shù)據(jù)流程圖2.數(shù)據(jù)格式RFID 數(shù)據(jù)格式數(shù)據(jù)數(shù)據(jù)格式格式RFIDS11FrI1R1031323
18、.數(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ù)據(jù)。4.1.2Application 層詳細設計與實現(xiàn)層詳細設計與實現(xiàn)4.1.2.1 類
19、對象詳細描述類對象詳細描述1 .Data 類,負責對接受來數(shù)據(jù)進行處理表表 4.14.1 DataData 成員屬性表成員屬性表屬性屬性類型類型描述描述serialVersionUIDlong序列化時保持版本的兼容性,即在版本升級時反序列化仍保持對象的唯一性。dataString存儲從串口的數(shù)據(jù)表表 4.24.2 DataData 成員方法表成員方法表方法方法參數(shù)參數(shù)返回值返回值描述描述getDataSizeVoidString從傳來的數(shù)據(jù)獲取數(shù)據(jù)大小isValidDataVoidboolean數(shù)據(jù)有效性校驗,包括數(shù)據(jù)是為為空,完整等getDataTypeVoidint從傳來的數(shù)據(jù)獲取數(shù)據(jù)類型
20、getDataTargetVoidString從傳來的數(shù)據(jù)獲取數(shù)據(jù)的設備號getRfidVoidString從傳來的數(shù)據(jù)獲取 Rfid 信息getTemperatureVoidString從傳來的數(shù)據(jù)獲取溫度getHumidityVoidString從傳來的數(shù)據(jù)獲取濕度getLightVoidString從傳來的數(shù)據(jù)獲取光感getAdVoidString傳來的數(shù)據(jù)獲取 AD 值getXVoidString從傳來的數(shù)據(jù)獲取三軸加速度 x 值getYVoidString從傳來的數(shù)據(jù)獲取三軸加速度 y 值getZVoidString從傳來的數(shù)據(jù)獲取三軸加速度 z 值2 .NodeCmd 類,負責與底
21、層進行交互,實現(xiàn)對硬件設備讀,寫操作。表表 4.34.3 NodeCmdNodeCmd 成員屬性表成員屬性表屬性屬性類型類型描述描述DevCmdenum使用枚舉將命令聲明一組命名的常數(shù),方便函數(shù)調(diào)用。myUartServiceMyUartService串口操作所使用框架表表 4.44.4 NodeCmdNodeCmd 成員方法表成員方法表方法方法參數(shù)參數(shù)返回值返回值描述描述devControlint, DevCmdString向串口發(fā)送數(shù)據(jù)readNodeVoidString從串口獲取數(shù)據(jù)3 .NodeInfo 類,負責存儲一個設備的信息。表表 4.54.5 NodeInfoNodeInfo
22、成員屬性表成員屬性表屬性屬性類型類型描述描述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é)點對象的風扇狀態(tài)(0,關;1,開;2,加速)bee
23、pint存儲節(jié)點對象的報警器狀態(tài)(0,關;1,開)nixietubint存儲節(jié)點對象的數(shù)碼管狀態(tài)(0,關;1,開)rfidrfid存儲節(jié)點對象的 rfid 信息devNumint存儲節(jié)點對象的設備號nextNodeInfo便于生成鏈表watchDogint看門狗,監(jiān)控節(jié)點生命值表表 4.64.6 NodeInfoNodeInfo 成員方法表成員方法表方法方法參數(shù)參數(shù)返回值返回值描述描述NodeInfovoidvoid構造函數(shù),初始化節(jié)點對象NodeInfovoidint有參數(shù)構造函數(shù),參數(shù)為節(jié)點設備號getNextvoidNodeInfo獲取下一個節(jié)點并返回節(jié)點信息setNextNodeInf
24、ovoidgetTemperaturevoidString獲取該對象溫度值setTemperatureStringvoid設置該對象溫度值getHumidityvoidString獲取該對象濕度值setHumidityStringvoid設置該對象濕度值getLightvoidString獲取該對象光感值setLightStringvoid設置該對象光感值getAdvoidString獲取該對象 AD 值setAdStringvoid設置該對象 AD 值getXvoidString獲取該對象三軸加速度 x 值setXStringvoid設置該對象三軸加速度 x 值getYvoidString獲
25、取該對象三軸加速度 y 值setYStringvoid設置該對象三軸加速度 y 值getZvoidString獲取該對象三軸加速度 z 值setZStringvoid設置該對象三軸加速度 z 值getLedvoidint獲取該對象 Led 狀態(tài)值setLedintvoid設置該對象 Led 狀態(tài)值getFunvoidint獲取該對象 Fun 狀態(tài)值setFunintvoid設置該對象 Fun 狀態(tài)值getBeepvoidint獲取該對象 Beep 狀態(tài)值setBeepintvoid設置該對象 Beep 狀態(tài)值getNixietubvoidint獲取該對象 Nixietub 狀態(tài)值setNixi
26、etubintvoid設置該對象 Nixietub 狀態(tài)值getDevNumvoidint獲取該對象 DevNum 值setDevNumintvoid設置該對象 DevNum 值getRfidvoidString獲取該對象 Rfid 值setRfidStringvoid設置該對象 Rfid 值getWatchDogvoidint獲取該對象 WatchDog 值setWatchDogintvoid設置該對象 WatchDog 值ledOnvoidvoid開燈ledOffvoidvoid關燈funOnvoidvoid開風扇FunOn1voidvoid風扇加速funOffvoidvoid關風扇bee
27、pOnvoidvoid開蜂鳴器beepOffvoidvoid關蜂鳴器nixietubeOnvoidvoid開數(shù)碼管nixietubeOffvoidvoid關數(shù)碼管4 .NodeList 類,存儲所有連接設備的信息,便于進行界面節(jié)點的更新,刪除和添加操作。表表 4.74.7 NodeListNodeList 成員屬性表成員屬性表屬性屬性類型類型描述描述headNodeInfo鏈表頭結點lenLong鏈表長度表表 4.84.8 NodeListNodeList 成員方法表成員方法表方法方法參數(shù)參數(shù)返回值返回值描述描述getHeadNodeInfovoid獲取鏈表頭結點setHeadvoidNode
28、Info設置鏈表頭結點createNodeListvoidvoid創(chuàng)建設備節(jié)點鏈表insertNodeNodeInfovoid插入節(jié)點delNodeNodeInfovoid刪除節(jié)點allNodevoidvoid遍歷鏈表所有節(jié)點findByDevNumintNodeInfo通過設備號找到節(jié)點nodeIsNotExistedintboolean通過設備號查找節(jié)點是否存在于鏈表delByDevNumintvoid通過設備號刪除節(jié)點allNodeSetWatchDogvoidString所有設備節(jié)點看門狗減一oneNodeFeedWatchDogintvoid通過設備號找到設備節(jié)點并喂狗findNod
29、eDogDievoidint遍歷設備節(jié)點,查看是否有節(jié)點生命結束getLenvoidint得到鏈表長度findNodeByPosintNodeInfo通過在鏈表中位置查找到設備節(jié)點4.1.2.2 線程類詳細描述線程類詳細描述1 . MainReadThread 類當啟動 MainReadThread 線程,執(zhí)行 run 方法,run 方法先通過 running 判斷是否執(zhí)行讀操作,如果 running 為 true,進行對設備讀操作,判斷MainHandlerThread 處理線程是否創(chuàng)建,未創(chuàng)建則創(chuàng)建并將讀出的數(shù)據(jù)傳給MainHandlerThread,并啟動線程,循環(huán)執(zhí)行。runningF
30、alsemhtIsExistTureFalsenew MainHandlerThreadb be eg gi in nTrues sl le ee ep pr re ea ad dN No od de e圖圖 4.44.4 MainReadThreadMainReadThread RUNRUN 流程圖流程圖2 . MainHandlerThread 類當 MainReadThread 線程將讀取的數(shù)據(jù)傳到 MainHandlerThread 后,先對數(shù)據(jù)進行有效性認證,如果數(shù)據(jù)有誤,使用 handler 傳遞發(fā)送給SmartHomeActivity 即主界面 UI 線程,進行處理;如果數(shù)據(jù)無誤
31、,判斷數(shù)據(jù)類型并使用 handler 傳遞,發(fā)送給 SmartHomeActivity 進行處理。isValidDataTuregetDataTypeNsendMessage(0,obj)sendMessage(3)IsendMessage(1,obj)RObj = datasendMessage(2,obj)False圖圖 4.54.5 MainHandlerThreadMainHandlerThread RUNRUN 流程圖流程圖3 . NodeWriteThread 類只負責執(zhí)行設備控制的命令,使用線程可以使程序多次獨立線程執(zhí)行,不被影響。devControlRun圖圖 4.64.6 N
32、odeWriteThreadNodeWriteThread RUNRUN 流程圖流程圖4.1.2.3 UI 類詳細描述類詳細描述1 . SmartHomeActivity 類(1) onCreatea) 初始化節(jié)點列表 nodeList。b) 設置從界面標題,setTitle。c) 設置視圖,setContentView。d) 獲取主界面控件的引用,findViewById。e) 設置 GridView 和使用的適配器 BaseAdapter。f) 設置選項被單擊的監(jiān)聽器,setOnItemClickListener。g) 設置線程的 Handler,重寫 handleMessage 方法。h
33、) 打開程序讀線程。i) 注冊返回廣播接收器。(2) onDestroya) 卸載廣播接收器,unregisterReceiver。b) 關閉讀線程,mainReadThread.stop。c)關閉主界面 Activity,this.finish。a) 設置所有節(jié)點的看門狗減一,allNodeSetWatchDog。b) 判斷是否有節(jié)點看門狗死亡,findNodeDogDie。如果存在,刪除 Node節(jié)點鏈表,delByDevNum,并判斷是否進入該節(jié)點從界面,如果進入則發(fā)送廣播使其退出。最后,向該死亡設備發(fā)送確認命令 ISEXIT,如果未死亡,重新發(fā)送添加節(jié)點 NewNode 的數(shù)據(jù)。.?c
34、) 更新適配器 notifyDataSetChanged。?(4)BackReceiver 廣播接受器a) 從節(jié)點列表刪除從界面返回的節(jié)點的原對象,nodeList.delByDevNum()b) 向節(jié)點列表插入從界面返回的新節(jié)點對象,nodeList.insertNode()c) 關閉從界面 Activity ,finishActivity()。2 . NodeInfoActivity 類(1) onCreatea) 創(chuàng)建從節(jié)點對象 NodeInfo。b) 設置視圖,setContentView。c) 獲取從界面控件的引用,findViewById。d) 通過 Intent 對象,獲取從主界
35、面?zhèn)鱽淼?nodeInfo 對象并賦給從界面對象。e) 設置從界面標題,setTitle。f)將主界面獲取的 nodeInfo 對象反饋到界面,setText。g) 注冊廣播接收器h) 設置返回鍵監(jiān)聽器i)設置風扇監(jiān)聽器,設置 Led 監(jiān)聽器,設置蜂鳴器監(jiān)聽器,設置數(shù)碼管監(jiān)聽器(2) onDestroy卸載廣播接收器,unregisterReceiver。4.1.2.4 數(shù)據(jù)庫詳細描述數(shù)據(jù)庫詳細描述1 . RfidRecordDBHelper 類繼承 SQLiteOpenHelper 類,重寫 onCreate 方法。表新建使用 SQLiteDatabase 對象的 execSQL 方法去添加
36、表。命令如下:create table if not exists rfidTable (id INTEGER primary key autoincrement, devId varchar, rfId varchar)增加使用 SQLiteDatabase 對象的 execSQL 方法去增加數(shù)據(jù)。命令如下:insert into rfidTable(devId, rfId) values (?,?)刪除使用 SQLiteDatabase 對象的 execSQL 方法去刪除數(shù)據(jù)。命令如下:delete from rfidTable where rfId = ?2 . 數(shù)據(jù)庫表設計表表 4.9
37、4.9 rfidTablerfidTable 數(shù)據(jù)庫表數(shù)據(jù)庫表字段名字段名類型類型屬性屬性描述描述idINTEGERprimary key autoincrementID 主鍵devIdVARCHARNull設備號rfIdVARCHARNullRFID 號4.1.2.5 框架詳細描述框架詳細描述 MyUartService 類1 .加載庫,System.loadLibrary(uart_runtime)2 .重寫構造函數(shù),調(diào)用本地 _init 方法,對設備進行初始化。3. 通過調(diào)用本地方法實現(xiàn) java 方法4.2A8-數(shù)據(jù)傳遞架構模塊數(shù)據(jù)傳遞架構模塊4.2.1 層次接口表層次接口表 數(shù)據(jù)傳遞
38、數(shù)據(jù)傳遞(串口操作串口操作)應用層應用層framework 層層JNI 層層Hal 層層驅動驅動圖圖 4.6.14.6.1 接口層次圖接口層次圖New Uart_readOpenUart_device_openUart_init_initUartDataUpdate_uart_data_updateUart_read_drv_uart_send_cmdReadUartSendCmdUart_writeUart_write_drvWriteUart_read_halUart_write_hal圖圖 4.6.24.6.2 結構圖結構圖4.2.2 HAL 層層1、 宏表表 4.104.10 HALH
39、AL 層宏定義表層宏定義表名稱名稱內(nèi)容內(nèi)容功能功能UART_HARDWARE_MODULE_IDuart定義 hal 的模塊 idSTART0 xAA數(shù)據(jù)包的開始符NEW0 x01新節(jié)點加入發(fā)的包INFO0 x02采集的信息包RFID0 x04刷卡時發(fā)的包2、 全局變量表表 4.114.11 HALHAL 層全局變量表層全局變量表名稱名稱類型類型功能功能fdint操作設備的文件描述符3、 結構體表表 4.124.12 HALHAL 層結構體表層結構體表struct uart_module_t成員名成員名類型類型功能功能commonstruct hw_module_t記錄本 stub 的基本信息
40、和入口struct uart_control_device_t成員名成員名類型類型功能功能commonstruct hw_device_t記錄本 stub 操作設備時需要包括的接口uart_read_hal函數(shù)指針指向實際讀串口的函數(shù)uart_write_hal函數(shù)指針指向實際寫串口的函數(shù)4、流程圖是否有數(shù)據(jù)NY是否為開始位開始接收YN是否結束NCRC檢驗是否正確YNYRead()填充讀bufUart_read_drv()上層讀串口上層寫串口將數(shù)據(jù)打包,加入CRC校驗寫成功N讀Uart_write_drv()Write()圖圖 4.74.7 HALHAL 層結構圖層結構圖4.2.3 JNI 層
41、層1、 宏表表 4.134.13 JNIJNI 層宏定義表層宏定義表名稱名稱內(nèi)容內(nèi)容功能功能UART_HARDWARE_MODULE_IDuart定義 HAL 的模塊 ID2、 全局變量表表 4.144.14 JNIJNI 層全局變量表層全局變量表名稱名稱類型類型功能功能sUartDeviceuart_control_device_t *保存通過調(diào)用 stub 中的 open 接口后得到的 devices handlesUartModuleuart_module_t*保存通過調(diào)用 Android HAL 標準函數(shù) hw_get_module,傳入UART_HARDWARE_MODULE_ID
42、后得到的 UART stub 的句柄3、 流程圖JNI 層主要實現(xiàn)了 Java 與 c/c+之間的過渡,不涉及復雜的邏輯,只根據(jù)規(guī)則為上層函數(shù)調(diào)用相應的下層接口,參見整體流程。4.2.4 Framework 層層表表 4.154.15 FrameworkFramework 層類表層類表public class MyUartService方法方法功能功能System.loadLibrary裝載編譯好的 JNI 層的共享庫public MyUartService構造函數(shù),打開并初始化串口public String UartDataUpdate讀取當前串口信息數(shù)據(jù)包public int UartSe
43、ndCmd向串口傳送命令數(shù)據(jù)包4.2.5 整體流程整體流程MyUartService static System.load(/system/lib/libuart_runtime.so);/加載jni的動態(tài)庫 JNI_OnLoad()/Framework層加載jni庫時調(diào)用 registerMethods()/注冊自己的JNINativeMethod_init, ()Z, (void*)uart_init _uart_data_update, ()Ljava/lang/String;, (void*)uart_read _uart_send_cmd, (II)I, (void*)uart_wr
44、ite Env-RegisterNatives() /注冊上述方法,至此裝載JNI庫工作完成MyUartService() _init() /構造串口服務時調(diào)用初始化函數(shù)UartDataUpdate()/公有方法,讀取串口數(shù)據(jù)UartSendCmd()/公有方法,向串口發(fā)送命令根據(jù)Method找到對應的JNI層接口Uart_init()Uart_read()Hw_get_module()/ / 根據(jù)LED_HARDWARE_MODULE_ID找到hw_module_tUart_control_open()module-methods-open(module, LED_HARDWARE_MODU
45、LE_ID, (struct hw_device_t*)device);/這個過程非常重要,jni通過LED_HARDWARE_MODULE_ID找到對應的stubsUartDevice-uart_read_hal(sUartDevice, s_buf, sizeof(s_buf);/調(diào)用hal層注冊的讀方法Uart_write()sUartDevice-uart_write_hal(sUartDevice, command);/調(diào)用hal層注冊的寫方法下續(xù):hal 層const struct uart_module_t HAL_MODULE_INFO_SYM = common: Id:UAR
46、T_HARDWARE_MODULE_ID, /模塊ID,上層的Service通過這個ID應用當前Stub methods:&led_module_methods, /入口函數(shù)管理結構體 /向系統(tǒng)注冊了一個ID為UART_HARDWARE_MODULE_ID的stubstatic struct hw_module_methods_t uart_module_methods = Open: uart_device_open; 定一個hw_module_methods_t結構體,關聯(lián)入口函數(shù)Uart_device_open()初始化上層傳入的device變量,并關聯(lián)操作接口Dev.uart_read
47、_hal = uart_read_drv;Dev.uart_write_hal = uart_write_drv;*device = &dev-common; JNI層調(diào)hal層的openOpen()真正調(diào)用驅動接口,打開串口初始化串口,如波特率等打開成功JNI層調(diào)hal層的Uart_read_halread()真正調(diào)用驅動接口,讀串口Uart_read_drv()JNI層調(diào)hal層的Uart_read_halwrite()真正調(diào)用驅動接口,寫串口Uart_write_drv()圖圖 4.84.8 整體流程圖整體流程圖4.2.6 關鍵代碼分析關鍵代碼分析1 NodeCmd.javastatic
48、 MyUartService myUartService = new MyUartService(); /新建對象,初始化 String s = myUartService.UartDataUpdate(); /更新采集數(shù)據(jù) myUartService.UartSendCmd(1, LED_ON); /點亮1號設備的燈 2 MyUartService.javapackage .smarthome.uart; import android.util.Log; public class MyUartService /* * load native service. */ static System
49、.loadLibrary(uart_runtime); /裝載庫 public MyUartService() _init(); /注冊本地方法,打開串口并初始化 /* * uart native methods. */ public String UartDataUpdate() String s = _uart_data_update(); return s;v /更新采集的數(shù)據(jù) public int UartSendCmd(int n, int c) _uart_send_cmd(n, c); return 0; /發(fā)送命令控制M0板 private static native bool
50、ean _init(); /聲明jni庫可以提供的方法 private static native String _uart_data_update(); private static native int _uart_send_cmd(int n, int c); 3 uart_stubincludeuart.hstruct uart_module_t struct hw_module_t common; ;/HAL 規(guī)定不能直接使用hw_module_t結構,因此需要做這么一個繼承。 struct uart_control_device_t /自定義的一個針對Uart控制的結構,包含hw_
51、device_t和支持的API操作 struct hw_device_t common; /* attributes */ /* supporting control APIs go here */ int (*uart_read_hal)(struct uart_control_device_t *dev, char *buf, int count); int (*uart_write_hal)(struct uart_control_device_t *dev, const char *cmd); ; #define UART_HARDWARE_MODULE_ID uart /定義一個MO
52、DULE_ID,HAL層可以根據(jù)這個ID找到我們這個HAL stub 4 cn_com_smarthome_uart_MyUartService.cpp#define LOG_TAG MyUartService #include utils/Log.h #include #include #include #include #include #include ././uart_stub/include/uart.h static uart_control_device_t *sUartDevice = 0; static uart_module_t* sUartModule=0; JNINat
53、iveMethod是 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型 static const JNINativeMethod gMethods = _init, ()Z, (void*)uart_init, _uart_data_update, ()Ljava/lang/String;, (vo
54、id*)uart_read , _uart_send_cmd, (II)I, (void*)uart_write , ; static int registerMethods(JNIEnv* env) static const char* const kClassName = cn/com/smarthome/uart/MyUartService; /注意:必須和Framework層的service類名相 jclass clazz; /* look up the class */ clazz = env-FindClass(kClassName); /查找被注冊的類 if (clazz = N
55、ULL) LOGE(Cant find class %sn, kClassName); return -1; /* register all the methods */ if (env-RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods0) != JNI_OK) LOGE(Failed registering methods for %sn, kClassName); return -1; /向類中注冊本SO中Native的接口,接口定義在gMethods數(shù)組中 /* fill out the rest of
56、 the ID cache */ return 0; /* * * * This is called by the VM when the shared library is first loaded. * 在Android系統(tǒng)初始化時,就會自動加載該JNI方法調(diào)用表。 * 當?shù)谝淮渭虞d此庫時,調(diào)用此函數(shù)注冊本地方法 */jint JNI_OnLoad(JavaVM* vm, void* reserved) JNIEnv* env = NULL;jint result = -1;LOGI(zzs_JNI_OnLoad);if (vm-GetEnv(void*) &env, JNI_VERSIO
57、N_1_4) != JNI_OK) LOGE(ERROR: GetEnv failedn);goto fail; /獲取當前的VM的環(huán)境,保存在env變量中assert(env != NULL);if (registerMethods(env) != 0) LOGE(ERROR: PlatformLibrary native registration failedn);goto fail; /自己寫的函數(shù),向當前JAVA環(huán)境中注冊接口/* success - return valid version number */result = JNI_VERSION_1_4;fail:return r
58、esult; /* JNI_OnLoad()函數(shù)完成:(1) 把虛擬機環(huán)境信息保存到本地庫的一個結構體“JNIEnv”的實例中;(2) 建立一個應用層中的UART控制服務與本地庫的JNI函數(shù)表;(3) 返回虛擬機本地庫使用的JNI版本。*/ 5. uart_stubmoduleuart.c#define LOG_TAG UartStub #include #include #include #include #include #include #include #include ./include/uart.h #include crc16.h #define N 6 #define STAR
59、T 0 xAA /用于傳輸協(xié)議的宏 #define NEW 0 x01 #define INFO 0 x02 #define RFID 0 x04 int fd; typedef struct char head; char dev_no; char type_data; char length; char temp2; char hum2; char bright2; char adc2; char acc3; char rfidN; short crc16; dev_data; /傳輸協(xié)議的格式 /CRC16的校驗函數(shù),查表法,表在crc16.h內(nèi) static unsigned shor
60、t get_crc16(const char * crc_head, int crc_lenth ) unsigned char ucCRCHi = 0 x0; unsigned char ucCRCLo = 0 x0; int iIndex; while ( crc_lenth- ) iIndex = ucCRCLo *( crc_head+ ); ucCRCLo = ( unsigned char )( ucCRCHi aucCRCHiiIndex ); ucCRCHi = aucCRCLoiIndex; return ( unsigned short )( ucCRCHi 8 | ucC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 洛陽理工學院《食品質(zhì)量與安全專業(yè)綜合實驗》2023-2024學年第二學期期末試卷
- 上海音樂學院《軟件工程綜合課程設計》2023-2024學年第二學期期末試卷
- 江西農(nóng)業(yè)工程職業(yè)學院《中國古代文學史三宋元文學》2023-2024學年第二學期期末試卷
- 暨南大學《醫(yī)藥廣告學》2023-2024學年第二學期期末試卷
- 福建技術師范學院《土木工程概預算課程設計》2023-2024學年第二學期期末試卷
- 長春汽車工業(yè)高等專科學?!峨x散結構》2023-2024學年第二學期期末試卷
- 東華大學《生物材料檢驗》2023-2024學年第二學期期末試卷
- 晉中職業(yè)技術學院《幼兒語言教育》2023-2024學年第二學期期末試卷
- 武漢設計工程學院《機械基礎實驗課》2023-2024學年第二學期期末試卷
- 濟南工程職業(yè)技術學院《分析化學C(醫(yī)學)》2023-2024學年第二學期期末試卷
- 護士團隊的協(xié)作和領導力培養(yǎng)培訓課件
- QFD模板含計算公式計分標準說明模板
- 慢阻肺試題練習
- 人工智能在生物醫(yī)學倫理與法律中的基因編輯與生命倫理問題研究
- 饅頭制作過程
- 國有資產(chǎn)管理辦法-國有資產(chǎn)管理辦法條例
- 公務車輛定點維修車輛保養(yǎng)(附彩圖) 投標方案
- 00015-英語二自學教程-unit3
- 第二章共混改性基本原理
- 乳腺專業(yè)知識課件
- 碳納米管及其應用課件
評論
0/150
提交評論