Android智能家居詳細(xì)設(shè)計(jì)_第1頁
Android智能家居詳細(xì)設(shè)計(jì)_第2頁
Android智能家居詳細(xì)設(shè)計(jì)_第3頁
Android智能家居詳細(xì)設(shè)計(jì)_第4頁
Android智能家居詳細(xì)設(shè)計(jì)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

基于Android的智能家居三個(gè)火槍手2023年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è)計(jì)53.1程序設(shè)計(jì)流程圖53.2線程定義53.3所用類定義6第4章前端A8模塊設(shè)計(jì)74.1A8-AndroidApplication層設(shè)計(jì)7數(shù)據(jù)流分析7Application層詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)94.2A8-數(shù)據(jù)傳遞架構(gòu)模塊16層次接口表16HAL層17JNI層19Framework層20整體流程21關(guān)鍵代碼分析224.3傳輸協(xié)議模塊設(shè)計(jì)32A8接收數(shù)據(jù)格式32M0接收命令數(shù)據(jù)結(jié)構(gòu)33第5章終端M0模塊設(shè)計(jì)355.1終端設(shè)備方案描述355.2終端設(shè)備工作流程355.3功能模塊描述36溫濕度傳感器DHT1036ZigBee通信局部37RFID讀卡模塊40IIC接口局部41第6章系統(tǒng)測(cè)試456.1工程演示45工程概述工程背景隨著社會(huì)電子信息化的不斷開展,人們?cè)诩揖又惺褂玫碾娖髟絹碓蕉?,由此帶來的平安隱患也有了明顯的增多。在這些電器中一旦出現(xiàn)一些異常,便會(huì)給人們帶來很大的損失。為了降低電器的不合理使用帶來的異常情況,就要求在異常發(fā)生時(shí)用戶能及時(shí)得到信息,并通過實(shí)時(shí)監(jiān)控采取一定的操作排除異常。因此,遠(yuǎn)程監(jiān)控系統(tǒng)的作用是非常巨大的。90年代末,隨著多媒體技術(shù)、視頻壓縮編碼技術(shù)、網(wǎng)絡(luò)通訊技術(shù)的開展,數(shù)字視頻監(jiān)控系統(tǒng)迅速崛起,現(xiàn)今市場(chǎng)上由兩種數(shù)字視頻監(jiān)控系統(tǒng)類型,一種是以數(shù)字錄像設(shè)備為核心的視頻監(jiān)控系統(tǒng),另一種是以嵌入式視頻web效勞器為核心的視頻監(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)控不受距離限制,采用大容量磁盤陣列存盤器或光盤存儲(chǔ)器,可以節(jié)省大量的磁盤介質(zhì),同時(shí)有利于系統(tǒng)實(shí)現(xiàn)多媒體信息查詢。但隨著基于PC機(jī)的視頻監(jiān)控錄像系統(tǒng)的開展,在實(shí)際使用過程中,也暴露出一些缺乏,主要是系統(tǒng)工作的不穩(wěn)定性。以嵌入式視頻web效勞器為核心的視頻監(jiān)控系統(tǒng),采用嵌入式實(shí)時(shí)多任務(wù)操作系統(tǒng)。攝像頭采集到的圖片信息經(jīng)過壓縮,通過內(nèi)部總線送到內(nèi)置的web效勞器,網(wǎng)絡(luò)上的用戶可以直接用瀏覽器觀看web效勞器上的由攝像頭采集的圖像。由于把圖片采集和web功能集中到一個(gè)體積很小的設(shè)備內(nèi),可以直接連入局域網(wǎng),用戶無需安裝任何硬件設(shè)備,僅用瀏覽器即可觀看。同時(shí)還具有以下優(yōu)點(diǎn):布控區(qū)域廣闊,嵌入式視頻web效勞器監(jiān)控系統(tǒng)web效勞器直接連入網(wǎng)絡(luò),沒有線纜長度和信號(hào)衰減的限制,同時(shí)網(wǎng)絡(luò)是沒有距離概念的,徹底拋棄了地域的概念,擴(kuò)展布控的區(qū)域。系統(tǒng)具有幾乎無限的無縫擴(kuò)展能力。所以設(shè)備都以IP地址進(jìn)行標(biāo)示,增加設(shè)備只是意味著IP地址的擴(kuò)充。性能穩(wěn)定可靠,無需專人管理。嵌入式web效勞器實(shí)際上是基于嵌入式微處理器技術(shù),采用嵌入式實(shí)時(shí)多任務(wù)操作系統(tǒng),對(duì)于用戶來講,上網(wǎng)進(jìn)行登陸,便可對(duì)家中情況進(jìn)行監(jiān)控。除了WEB效勞器實(shí)時(shí)控制之外,當(dāng)前智能的開展趨勢(shì)已經(jīng)愈加明顯。智能〔Smartphone),是指“像個(gè)人電腦一樣,具有獨(dú)立的操作系統(tǒng),可以由用戶自行安裝軟件、游戲等第三方效勞商提供的程序,通過此類程序來不斷對(duì)的功能進(jìn)行擴(kuò)充,并可以通過移動(dòng)通訊網(wǎng)絡(luò)來實(shí)現(xiàn)無線網(wǎng)絡(luò)接入的這樣一類的總稱〞。而當(dāng)前應(yīng)用在智能上的操作系統(tǒng)中Android操作系統(tǒng)占有相當(dāng)大的比例。Android(中文名:安卓)是基于Linux平臺(tái)開源操作系統(tǒng)名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件。隨著Android應(yīng)用的更見廣泛,了解并能使用Android來完成我們對(duì)智能家居的控制已經(jīng)顯得愈加重要?,F(xiàn)在監(jiān)控系統(tǒng)開展到第三代,前端一體化、視頻十字化、監(jiān)控網(wǎng)絡(luò)化、系統(tǒng)集成化成為視頻監(jiān)控系統(tǒng)公認(rèn)的開展方向,它以網(wǎng)絡(luò)為依托,以數(shù)字視頻的壓縮、傳輸、存放和播放為核心,以智能實(shí)用的圖像分析為特點(diǎn),并為報(bào)警系統(tǒng)、門禁系統(tǒng)完美的整合到一個(gè)使用平臺(tái)上,引發(fā)了視頻控制行業(yè)的一次技術(shù)革命。術(shù)語定義Android:Android是一種以Linux為根底的開放源碼操作系統(tǒng),主要使用于便攜設(shè)備。HAL:硬件抽象層。JNI:JNI是JavaNativeInterface的縮寫,中文為JAVA本地調(diào)用。RFID:射頻識(shí)別即RFID〔RadioFrequencyIDentification〕技術(shù),又稱電子標(biāo)簽、無線射頻識(shí)別,是一種通信技術(shù),可通過無線電訊號(hào)識(shí)別特定目標(biāo)并讀寫相關(guān)數(shù)據(jù),而無需識(shí)別系統(tǒng)與特定目標(biāo)之間建立機(jī)械或光學(xué)接觸。A8:ARMCortex-A8處理器是第一款基于ARMv7架構(gòu)的應(yīng)用處理器,并且是有史以來ARM開發(fā)的性能最高、最具功率效率的處理器。M0:Cortex-M0處理器,是市場(chǎng)上現(xiàn)有的最小、能耗最低、最節(jié)能的ARM處理器。技術(shù)方案系統(tǒng)描述Android是一個(gè)開放源碼的操作系統(tǒng)專門為移動(dòng)而設(shè)計(jì)的系統(tǒng)。Android將開辟新的應(yīng)用,使家居智能化運(yùn)用于普通家庭。Android界面顯示(Cortex_A8)來自于Cortex_m0模擬量,并可對(duì)Cortex_m0進(jìn)行控制或操作。本系統(tǒng)做為裁減工程,實(shí)現(xiàn)了M0采集房間信息,通過無線方式發(fā)送到A8進(jìn)行監(jiān)控、控制。A8即可作為移動(dòng)終端設(shè)備(如phone、pad等),亦可作中央監(jiān)控效勞器設(shè)備。本工程采用后者方案,即作中央監(jiān)控。假設(shè)需作移動(dòng)設(shè)備,只需將程序移植到移動(dòng)設(shè)備上,再在中央端移植web效勞器,移動(dòng)設(shè)備登陸效勞器即可查看房屋信息。功能描述1.檢測(cè)室內(nèi)溫度、濕度、光感、電壓情況〔通過Cortex_m0采集的信息〕。2.通過溫度、濕度的情況來對(duì)應(yīng)調(diào)節(jié)風(fēng)扇開關(guān)〔控制Cortex_m0〕。3.根據(jù)光敏傳感器情況對(duì)應(yīng)調(diào)節(jié)led燈亮滅〔控制Cortex_m0〕。4.根據(jù)三軸加速度情況對(duì)應(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)核LAndroid文件系統(tǒng)Android4.0版本工具鏈arm-none-linux-gnueabi-gccAndroid程序開發(fā)Eclipse前端數(shù)據(jù)中心〔A8〕總體設(shè)計(jì)程序設(shè)計(jì)流程圖圖3.1程序設(shè)計(jì)流程圖線程定義1.SmartHomeActivity,程序主Activity界面,翻開程序首先運(yùn)行。2.NodeInfoActivity,從界面Activity,用來顯示詳細(xì)設(shè)備采集信息和控制按鍵。3.MainReadThread,讀數(shù)據(jù)主線程,該線程只負(fù)責(zé)對(duì)通過Zigbee獲取的數(shù)據(jù)轉(zhuǎn)發(fā)給讀進(jìn)程,不進(jìn)行數(shù)據(jù)操作。4.MainHandlerThread,處理數(shù)據(jù)線程,該線程對(duì)從讀進(jìn)程傳來的數(shù)據(jù)進(jìn)行數(shù)據(jù)校驗(yàn)并轉(zhuǎn)發(fā)。5.NodeWriteThread,控制線程,該線程負(fù)責(zé)處理由用戶對(duì)設(shè)備的操作。所用類定義1.Data,用來存儲(chǔ)和處理設(shè)備的采集數(shù)據(jù)。2.NodeCmd,定義操作方法,實(shí)現(xiàn)對(duì)設(shè)備的讀操作和控制操作。3.NodeInfo,定義設(shè)備的所有采集信息,控制器狀態(tài)和WatchDog。4.NodeList,使用鏈表存儲(chǔ)設(shè)備信息。5.MyUartService:提供與底層的接口,以讀寫串口。前端A8模塊設(shè)計(jì)A8-AndroidApplication層設(shè)計(jì)數(shù)據(jù)流分析NEWNODE,新節(jié)點(diǎn)參加1.數(shù)據(jù)處理流程圖圖4.1 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對(duì)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ù)處理流程圖圖4.2 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對(duì)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ù)處理流程圖圖4.3RFID數(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對(duì)RFID進(jìn)行校驗(yàn),判斷是否合法,如果數(shù)據(jù)無誤,通過發(fā)送Handler消息交由SmartHomeActivity主界面UI線程,SmartHomeActivity發(fā)送Broadcast通知從界面,從界面判斷是否為自己設(shè)備,是那么更新數(shù)據(jù)。Application層詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)類對(duì)象詳細(xì)描述1.Data類,負(fù)責(zé)對(duì)接受來數(shù)據(jù)進(jìn)行處理表4.1Data成員屬性表屬性類型描述serialVersionUIDlong序列化時(shí)保持版本的兼容性,即在版本升級(jí)時(shí)反序列化仍保持對(duì)象的唯一性。dataString存儲(chǔ)從串口的數(shù)據(jù)表4.2Data成員方法表方法參數(shù)返回值描述getDataSizeVoidString從傳來的數(shù)據(jù)獲取數(shù)據(jù)大小isValidDataVoidboolean數(shù)據(jù)有效性校驗(yàn),包括數(shù)據(jù)是為為空,完整等getDataTypeVoidint從傳來的數(shù)據(jù)獲取數(shù)據(jù)類型getDataTargetVoidString從傳來的數(shù)據(jù)獲取數(shù)據(jù)的設(shè)備號(hào)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)對(duì)硬件設(shè)備讀,寫操作。表4.3NodeCmd成員屬性表屬性類型描述DevCmdenum使用枚舉將命令聲明一組命名的常數(shù),方便函數(shù)調(diào)用。myUartServiceMyUartService串口操作所使用框架表4.4NodeCmd成員方法表方法參數(shù)返回值描述devControlint,DevCmdString向串口發(fā)送數(shù)據(jù)readNodeVoidString從串口獲取數(shù)據(jù)3.NodeInfo類,負(fù)責(zé)存儲(chǔ)一個(gè)設(shè)備的信息。表4.5NodeInfo成員屬性表屬性類型描述serialVersionUIDlong序列化時(shí)保持版本的兼容性,即在版本升級(jí)時(shí)反序列化仍保持對(duì)象的唯一性。temperatureString存儲(chǔ)節(jié)點(diǎn)對(duì)象的溫度值humidityString存儲(chǔ)節(jié)點(diǎn)對(duì)象的濕度lightString存儲(chǔ)節(jié)點(diǎn)對(duì)象的光感值xString存儲(chǔ)節(jié)點(diǎn)對(duì)象的三軸加速度x值yString存儲(chǔ)節(jié)點(diǎn)對(duì)象的三軸加速度y值z(mì)String存儲(chǔ)節(jié)點(diǎn)對(duì)象的三軸加速度z值adString存儲(chǔ)節(jié)點(diǎn)對(duì)象的ad值ledint存儲(chǔ)節(jié)點(diǎn)對(duì)象的led燈狀態(tài)〔0,滅;1,亮〕funint存儲(chǔ)節(jié)點(diǎn)對(duì)象的風(fēng)扇狀態(tài)〔0,關(guān);1,開;2,加速〕beepint存儲(chǔ)節(jié)點(diǎn)對(duì)象的報(bào)警器狀態(tài)〔0,關(guān);1,開〕nixietubint存儲(chǔ)節(jié)點(diǎn)對(duì)象的數(shù)碼管狀態(tài)〔0,關(guān);1,開〕rfidrfid存儲(chǔ)節(jié)點(diǎn)對(duì)象的rfid信息devNumint存儲(chǔ)節(jié)點(diǎn)對(duì)象的設(shè)備號(hào)nextNodeInfo便于生成鏈表watchDogint看門狗,監(jiān)控節(jié)點(diǎn)生命值表4.6NodeInfo成員方法表方法參數(shù)返回值描述NodeInfovoidvoid構(gòu)造函數(shù),初始化節(jié)點(diǎn)對(duì)象NodeInfovoidint有參數(shù)構(gòu)造函數(shù),參數(shù)為節(jié)點(diǎn)設(shè)備號(hào)getNextvoidNodeInfosetNextNodeInfovoidgetTemperaturevoidString獲取該對(duì)象溫度值setTemperatureStringvoid設(shè)置該對(duì)象溫度值getHumidityvoidString獲取該對(duì)象濕度值setHumidityStringvoid設(shè)置該對(duì)象濕度值getLightvoidString獲取該對(duì)象光感值setLightStringvoid設(shè)置該對(duì)象光感值getAdvoidString獲取該對(duì)象AD值setAdStringvoid設(shè)置該對(duì)象AD值getXvoidString獲取該對(duì)象三軸加速度x值setXStringvoid設(shè)置該對(duì)象三軸加速度x值getYvoidString獲取該對(duì)象三軸加速度y值setYStringvoid設(shè)置該對(duì)象三軸加速度y值getZvoidString獲取該對(duì)象三軸加速度z值setZStringvoid設(shè)置該對(duì)象三軸加速度z值getLedvoidint獲取該對(duì)象Led狀態(tài)值setLedintvoid設(shè)置該對(duì)象Led狀態(tài)值getFunvoidint獲取該對(duì)象Fun狀態(tài)值setFunintvoid設(shè)置該對(duì)象Fun狀態(tài)值getBeepvoidint獲取該對(duì)象Beep狀態(tài)值setBeepintvoid設(shè)置該對(duì)象Beep狀態(tài)值getNixietubvoidint獲取該對(duì)象Nixietub狀態(tài)值setNixietubintvoid設(shè)置該對(duì)象Nixietub狀態(tài)值getDevNumvoidint獲取該對(duì)象DevNum值setDevNumintvoid設(shè)置該對(duì)象DevNum值getRfidvoidString獲取該對(duì)象Rfid值setRfidStringvoid設(shè)置該對(duì)象Rfid值getWatchDogvoidint獲取該對(duì)象WatchDog值setWatchDogintvoid設(shè)置該對(duì)象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類,存儲(chǔ)所有連接設(shè)備的信息,便于進(jìn)行界面節(jié)點(diǎn)的更新,刪除和添加操作。表4.7NodeList成員屬性表屬性類型描述headNodeInfo鏈表頭結(jié)點(diǎn)lenLong鏈表長度表4.8NodeList成員方法表方法參數(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è)備號(hào)找到節(jié)點(diǎn)nodeIsNotExistedintboolean通過設(shè)備號(hào)查找節(jié)點(diǎn)是否存在于鏈表delByDevNumintvoid通過設(shè)備號(hào)刪除節(jié)點(diǎn)allNodeSetWatchDogvoidString所有設(shè)備節(jié)點(diǎn)看門狗減一oneNodeFeedWatchDogintvoid通過設(shè)備號(hào)找到設(shè)備節(jié)點(diǎn)并喂狗findNodeDogDievoidint遍歷設(shè)備節(jié)點(diǎn),查看是否有節(jié)點(diǎn)生命結(jié)束getLenvoidint得到鏈表長度findNodeByPosintNodeInfo通過在鏈表中位置查找到設(shè)備節(jié)點(diǎn)線程類詳細(xì)描述1.MainReadThread類當(dāng)啟動(dòng)MainReadThread線程,執(zhí)行run方法,run方法先通過running判斷是否執(zhí)行讀操作,如果running為true,進(jìn)行對(duì)設(shè)備讀操作,判斷MainHandlerThread處理線程是否創(chuàng)立,未創(chuàng)立那么創(chuàng)立并將讀出的數(shù)據(jù)傳給MainHandlerThread,并啟動(dòng)線程,循環(huán)執(zhí)行。圖4.4MainReadThreadRUN流程圖2.MainHandlerThread類當(dāng)MainReadThread線程將讀取的數(shù)據(jù)傳到MainHandlerThread后,先對(duì)數(shù)據(jù)進(jìn)行有效性認(rèn)證,如果數(shù)據(jù)有誤,使用handler傳遞發(fā)送給SmartHomeActivity即主界面UI線程,進(jìn)行處理;如果數(shù)據(jù)無誤,判斷數(shù)據(jù)類型并使用handler傳遞,發(fā)送給SmartHomeActivity進(jìn)行處理。圖4.5MainHandlerThreadRUN流程圖3.NodeWriteThread類只負(fù)責(zé)執(zhí)行設(shè)備控制的命令,使用線程可以使程序?qū)掖为?dú)立線程執(zhí)行,不被影響。圖4.6NodeWriteThreadRUN流程圖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)注冊(cè)返回播送接收器。onDestroya) 卸載播送接收器,unregisterReceiver。b) 關(guān)閉讀線程,mainReadThread.stop。c〕 關(guān)閉主界面Activity,this.finish。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?!?〕 BackReceiver播送接受器a) 從節(jié)點(diǎn)列表刪除從界面返回的節(jié)點(diǎn)的原對(duì)象,nodeList.delByDevNum()b) 向節(jié)點(diǎn)列表插入從界面返回的新節(jié)點(diǎn)對(duì)象,nodeList.insertNode()c) 關(guān)閉從界面Activity,finishActivity()。2.NodeInfoActivity類onCreatea) 創(chuàng)立從節(jié)點(diǎn)對(duì)象NodeInfo。b) 設(shè)置視圖,setContentView。c) 獲取從界面控件的引用,findViewById。d) 通過Intent對(duì)象,獲取從主界面?zhèn)鱽淼膎odeInfo對(duì)象并賦給從界面對(duì)象。e) 設(shè)置從界面標(biāo)題,setTitle。f) 將主界面獲取的nodeInfo對(duì)象反應(yīng)到界面,setText。g) 注冊(cè)播送接收器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對(duì)象的execSQL方法去添加表。命令如下:createtableifnotexistsrfidTable(idINTEGERprimarykeyautoincrement,devIdvarchar,rfIdvarchar)·增加使用SQLiteDatabase對(duì)象的execSQL方法去增加數(shù)據(jù)。命令如下:insertintorfidTable(devId,rfId)values(?,?)·刪除使用SQLiteDatabase對(duì)象的execSQL方法去刪除數(shù)據(jù)。命令如下:deletefromrfidTablewhererfId=?2.數(shù)據(jù)庫表設(shè)計(jì)表4.9rfidTable數(shù)據(jù)庫表字段名類型屬性描述idINTEGERprimarykeyautoincrementID主鍵devIdVARCHARNull設(shè)備號(hào)rfIdVARCHARNullRFID號(hào)框架詳細(xì)描述·MyUartService類1.加載庫,System.loadLibrary("uart_runtime")2.重寫構(gòu)造函數(shù),調(diào)用本地__init方法,對(duì)設(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ū)動(dòng)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é)點(diǎn)參加發(fā)的包INFO0x02采集的信息包RFID0x04刷卡時(shí)發(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è)備時(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標(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層表4.15Framework層類表publicclassMyUartService方法功能System.loadLibrary裝載編譯好的JNI層的共享庫publicMyUartService構(gòu)造函數(shù),翻開并初始化串口publicStringUartDataUpdate讀取當(dāng)前串口信息數(shù)據(jù)包publicintUartSendCmd向串口傳送命令數(shù)據(jù)包整體流程下續(xù):hal層圖4.8整體流程圖關(guān)鍵代碼分析NodeCmd.javastaticMyUartServicemyUartService=newMyUartService();//新建對(duì)象,初始化Strings=myUartService.UartDataUpdate();//更新采集數(shù)據(jù)myUartService.UartSendCmd(1,LED_ON);//點(diǎn)亮1號(hào)設(shè)備的燈MyUartService.javapackagecn.smarthome.uart;importandroid.util.Log;publicclassMyUartService{ /* *loadnativeservice. */ static{ System.loadLibrary("uart_runtime");//裝載庫 } publicMyUartService(){ _init();//注冊(cè)本地方法,翻開串口并初始化 } /* *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),因此需要做這么一個(gè)繼承。structuart_control_device_t{ //自定義的一個(gè)針對(duì)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://定義一個(gè)MODULE_ID,HAL層可以根據(jù)這個(gè)ID找到我們這個(gè)HALstubcn_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層注冊(cè)的方法,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個(gè)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);//查找被注冊(cè)的類 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; }//向類中注冊(cè)本SO中Native的接口,接口定義在gMethods數(shù)組中 /*fillouttherestoftheIDcache*/ return0;}/****ThisiscalledbytheVMwhenthesharedlibraryisfirstloaded.*在Android系統(tǒng)初始化時(shí),就會(huì)自動(dòng)加載該JNI方法調(diào)用表。*當(dāng)?shù)谝淮渭虞d此庫時(shí),調(diào)用此函數(shù)注冊(cè)本地方法*/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; }//獲取當(dāng)前的VM的環(huán)境,保存在env變量中 assert(env!=NULL); if(registerMethods(env)!=0){ LOGE("ERROR:PlatformLibrarynativeregistrationfailed\n"); gotofail; }//自己寫的函數(shù),向當(dāng)前JAVA環(huán)境中注冊(cè)接口 /*success--returnvalidversionnumber*/ result=JNI_VERSION_1_4;fail: returnresult;}/*JNI_OnLoad()函數(shù)完成:(1)把虛擬機(jī)環(huán)境信息保存到本地庫的一個(gè)結(jié)構(gòu)體“JNIEnv〞的實(shí)例中;(2)建立一個(gè)應(yīng)用層中的UART控制效勞與本地庫的JNI函數(shù)表;(3)返回虛擬機(jī)本地庫使用的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#defineRFID0x04intfd;typedefstruct{ charhead; chardev_no; chartype_data; charlength; chartemp[2]; charhum[2]; charbright[2]; charadc[2]; characc[3]; charrfid[N]; shortcrc16;}dev_data;//傳輸協(xié)議的格式 //CRC16的校驗(yàn)函數(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};//用于存放整個(gè)消息包 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è)備號(hào) char*crc_head;//用于CRC校驗(yàn)的頭 intcrc_lenth; //用于crc校驗(yàn)的長度,從消息包頭到數(shù)據(jù)段尾 unsignedshortcrc16;//校驗(yàn)值 inttimeout=10;//超時(shí)處理,長時(shí)間讀不到消息,當(dāng)timeout減到0時(shí),返回到上層 while(1) { timeout--;//由于采用輪詢讀的方法,如果沒消息那么會(huì)一直循環(huán),設(shè)置一個(gè)超時(shí)值,當(dāng)超出后還沒數(shù)據(jù)的話,就退出此次讀消息 if(!timeout){ LOGI("Nostartinfo_buf"); return-1; } if(read(fd,&info_buf.head,1)<0){ LOGE("readSTARTerr"); continue; }//判斷是否為幀頭,不是就繼續(xù)循環(huán)判斷 if(info_buf.head!=START){ LOGI("headis%x",info_buf.head); continue; }else{ //判斷是否為幀頭,不是就繼續(xù)循環(huán)判斷 timeout=40; if(read(fd,&info_buf.dev_no,1)<0){ LOGE("readdev_noerr"); return-1; }//讀出設(shè)備號(hào) if(read(fd,&info_buf.type_data,1)<0){ LOGE("readtype_dataerr"); return-1; }//讀出數(shù)據(jù)類型 if(read(fd,&info_buf.length,1)<0){ LOGE("readlengtherr"); return-1; }//讀出數(shù)據(jù)長度 while(cur_size<(info_buf.length+2)){ if((r_size=read(fd,(rev_buf+4)+cur_size,(info_buf.length+2)-cur_size))<0){ LOGI("readdataerr"); continue; } cur_size+=r_size;//累加到總共已讀數(shù)據(jù),用以與應(yīng)對(duì)數(shù)據(jù)長度比擬 }//讀出數(shù)據(jù) break; } } rev_buf[0]=info_buf.head; rev_buf[1]=info_buf.dev_no; rev_buf[2]=info_buf.type_data; rev_buf[3]=info_buf.length; data_lenth=info_buf.length; crc16=((rev_buf[4+data_lenth]&0xffff)<<8)|rev_buf[5+data_lenth]; crc_head=rev_buf; crc_lenth=data_lenth+4;//CRC16校驗(yàn) if(crc16==get_crc16(crc_head,crc_lenth)){ switch(info_buf.type_data){ caseNEW: sprintf(buf,"S%dFnI%d",4,info_buf.dev_no);//傳遞到上層傳下的buf break; caseINFO: sprintf(data_buf,"T%d.%dH%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]); //傳遞到上層傳下的buf sprintf(buf,"S%dFiI%d%s",strlen(data_buf)+4,info_buf.dev_no,data_buf); break; caseRFID: for(i=0;i<data_lenth;i++){ sprintf(data_buf+i*2,"%x",rev_buf[i+4]>>4); sprintf(data_buf+i*2+1,"%x",rev_buf[i+4]&0xf); } //傳遞到上層傳下的buf sprintf(buf,"S%dFrI%dR%s",strlen(data_buf)+5,info_buf.dev_no,data_buf); break; }//將收到的數(shù)據(jù)打包成適合上傳的格式,向上傳遞 LOGI("HAL:bufis:%s",buf); }else{ LOGE("CRCerror!"); } return0;}staticintuart_write_drv(structuart_control_device_t*dev,constchar*cmd){ ssize_tw_size=0; charcmd_buf[10]={0}; char*crc_head; charcrc_lenth; unsignedshortcrc16; cmd_buf[0]='S'; cmd_buf[1]=cmd[0]; //dev_no cmd_buf[2]='c'; //cmdflag: cmd_buf[3]='1'; //sizeofcmd cmd_buf[4]=cmd[1]; //cmd crc16=get_crc16(cmd_buf,5); sprintf(cmd_buf+5,"%c%c",crc16>>8,crc16&0xff); //eg:S1c105656 if((w_size=write(fd,cmd_buf,strlen(cmd_buf)))<0){ LOGE("writeerro,write%dbytes",w_size); return-1; } LOGI("Halwrite%dbytescmd:%s",w_size,cmd_buf); return0;}staticintuart_device_open(conststructhw_module_t*module,constchar*name, structhw_device_t**device){ structuart_control_device_t*dev; structtermiosoptions; LOGD("HAL:uart_device_open"); dev=(structuart_control_device_t*)malloc(sizeof(*dev)); memset(dev,0,sizeof(*dev)); //HALmustinitproperty dev->common.tag=HARDWARE_DEVICE_TAG;//必須寫這個(gè) dev->common.version=0; dev->common.module=module; dev->common.close=uart_device_close;//關(guān)聯(lián)關(guān)閉函數(shù) //實(shí)例化支持的操作 dev->uart_read_hal=uart_read_drv; dev->uart_write_hal=uart_write_drv; *device=&dev->common; //將實(shí)例化后的uart_control_device_t地址返回給jni層 //這樣jni層就可以直接調(diào)用uart_read_drv、uart_write_drv、uart_device_close方法 //翻開硬件設(shè)備,由于上層需求底層不能阻塞,故使用非阻塞方式翻開 if((fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY))<0) { LOGE("openerror"); return-1;; }else{ LOGI("openok\n"); } //初始化串口 tcgetattr(fd,&options); options.c_cflag|=(CLOCAL|CREAD); options.c_cflag&=~CSIZE; options.c_cflag&=~CRTSCTS;//不使用數(shù)據(jù)流控制 options.c_cflag|=CS8;//將數(shù)據(jù)位修改為8bit options.c_cflag&=~CSTOPB;//無結(jié)束位 options.c_iflag|=IGNPAR; /*網(wǎng)上許多流行的linux串口編程的版本中都沒對(duì)c_iflag〔termios成員變量〕這個(gè)變量進(jìn)行有效的設(shè)置, 這樣傳送ASCII碼時(shí)沒什么問題,但傳送二進(jìn)制數(shù)據(jù)時(shí)遇到0x0d,0x11和0x13卻會(huì)被丟掉。 不用說也知道,這幾個(gè)肯定是特殊字符,被用作特殊控制了。關(guān)掉ICRNL和IXON選項(xiàng)即可解決。*/ c_iflag&=~(ICRNL|IXON); /*0x0d回車符CR 0x11^QVSTART字符 0x13^SVSTOP字符 ICRNL將輸入的CR轉(zhuǎn)換為NL IXON使起動(dòng)/停止輸出控制流起作用*/ options.c_oflag=0; options.c_lflag=0; cfsetispeed(&options,B115200);//指定輸入波特率,115200bps cfsetospeed(&options,B115200);//指定輸出波特率,115200bps tcsetattr(fd,TCSANOW,&options); return0;}//定一個(gè)hw_module_methods_t結(jié)構(gòu)體,關(guān)聯(lián)入口函數(shù) staticstructhw_module_methods_tuart_module_methods={open:uart_device_open};//定義Stub入口 //注意必須使用: //1。hw_module_t繼承類 //2。必須使用HAL_MODULE_INFO_SYM這個(gè)名字 conststructuart_module_tHAL_MODULE_INFO_SYM={common:{tag:HARDWARE_MODULE_TAG, version_major:1, version_minor:0, id:UART_HARDWARE_MODULE_ID, //模塊ID,上層的Service通過這個(gè)ID應(yīng)用當(dāng)前Stub name:"uartHALmodule", author:"farsight", methods:&uart_module_methods,//入口函數(shù)管理結(jié)構(gòu)體 }, /*supportingAPIsgohere*/};傳輸協(xié)議模塊設(shè)計(jì)A8接收數(shù)據(jù)格式表4.16數(shù)據(jù)格式表buf[0]buf[1]buf[2]buf[3]buf[length]send_buf[n]數(shù)據(jù)包頭設(shè)備號(hào)數(shù)據(jù)類型數(shù)據(jù)長度數(shù)據(jù)校驗(yàn)0xAAdev_notype_datalengthdataCrc16校驗(yàn)1byte1byte1byte1bytelengthbytes2bytes數(shù)據(jù)包頭:M0向A8發(fā)送數(shù)據(jù)包頭為0xAAA8向M0發(fā)送數(shù)據(jù)包頭為0x55設(shè)備號(hào):為M0設(shè)備號(hào)(房間號(hào))數(shù)據(jù)類型:0x01M0開機(jī)(房間開啟監(jiān)控)0x02為溫度、濕度、光照度類型數(shù)據(jù)0x04為RFID卡類數(shù)據(jù)數(shù)據(jù)長度:為數(shù)據(jù)域的字節(jié)數(shù)校驗(yàn):crc16校M0采集數(shù)據(jù)的結(jié)構(gòu)體#defineN6typedefstruct{ charhead;//數(shù)據(jù)包頭chardev_no;//設(shè)備號(hào)chartype_data;//數(shù)據(jù)類型0x02為一般溫度、濕度類型數(shù)據(jù)0x04為卡類數(shù)據(jù)類型charlength;//數(shù)據(jù)的長度溫濕度數(shù)據(jù)長度為chartemp[2];//溫度數(shù)據(jù)charhum[2];//濕度數(shù)據(jù)charbright[2];//光照度數(shù)據(jù)charadc[2];//ADC轉(zhuǎn)換數(shù)據(jù)characc[3];//三軸加速x,y,z charrfid[N];//卡類數(shù)據(jù)shortcrc16; //crc校驗(yàn)值}dev_data;表4.17M0發(fā)送數(shù)據(jù)類型命令類型0x01命令Crc16校驗(yàn)0x01開機(jī)高位低位Buf[4]Buf[5]Buf[6]溫濕度數(shù)據(jù)0x02溫度濕度光照度AD轉(zhuǎn)換高位低位位高位低位高位低位高位低位Buf[4]Buf[5]Buf[6]Buf[7]Buf[8]Buf[9]Buf[10]Buf[11]16位16位16位16位三軸加速Crc16校驗(yàn)XYZ高位低位Buf[12]Buf[13]Buf[14]Buf[15]Buf[16]8位8位8位16位卡類信息0x04RFID卡號(hào)Crc16校驗(yàn)高位低位高位低位高位低位高位低位Buf[4]Buf[5]Buf[6]Buf[7]Buf[8]Buf[9]Buf[10]Buf[11]16位16位16位16位M0接收命令數(shù)據(jù)結(jié)構(gòu)Typedefstruct{ charhead;//數(shù)據(jù)包頭‘S’chardev_no;//設(shè)備號(hào)(房間號(hào))chartype_data;//數(shù)據(jù)類型為‘c’charlength;//數(shù)據(jù)的長度數(shù)據(jù)長度為charcmd;//命令溫濕度數(shù)據(jù)長度為shortcrc16;}dev_cmd表4.18M0接收數(shù)據(jù)類型命令Crc16校驗(yàn)M0接收數(shù)據(jù)高位低位8位8位8位Buf[5]Buf[6]Buf[7]表4.19數(shù)據(jù)對(duì)應(yīng)命令命令動(dòng)作0x30LED_ON(開燈)0x31LED_OFF(關(guān)燈)0x32Fan_ON〔開風(fēng)扇〕0x33Fan_OFF(關(guān)風(fēng)扇)0x34Nixietube_ON(開數(shù)碼管)0x35Nixietube_OFF(關(guān)數(shù)碼管)0x36BEEP_ON(開蜂鳴器)0x37BEEP_OFF(關(guān)蜂鳴器終端M0模塊設(shè)計(jì)終端設(shè)備方案描述智能家居的終端設(shè)備,主要負(fù)責(zé)對(duì)室內(nèi)各種信息進(jìn)行采集,并將信息上傳給終端設(shè)備,并對(duì)終端設(shè)備發(fā)出的指令進(jìn)行及時(shí)響應(yīng)。室內(nèi)的相關(guān)信息主要包括溫濕度、光感度、三軸加速度、電壓信息以及進(jìn)出室內(nèi)的刷卡信息。主控制器選擇了NXP的LPC11C14(以下簡稱M0),它是ARMCortex-M0系列的低功耗32位處理器,它最高可以工作到50MHZ,無論是在速度上還是在功耗上,亦或是抗干擾能力上,它完全能夠勝任終端數(shù)據(jù)采集的重任。前端設(shè)備與終端設(shè)備的通信采用的是ZigBee通信模塊,它功耗低,本錢低,具有優(yōu)良的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),便于組網(wǎng)。它與M0之間的連接采用的是雙向的SPI/IIC到UART轉(zhuǎn)換芯片SC16IS752,節(jié)省了片上有限的UART資源。其他器件這里不做贅述,整體方案如圖5.1所示:圖5.1終端設(shè)備整體方案圖終端設(shè)備工作流程系統(tǒng)上電,初始化系統(tǒng)時(shí)鐘,使能IO時(shí)鐘、配置LED、FAN、SPEAKER、7LED的IO端口,初始化SPI0、SPI1。使能系統(tǒng)滴答定時(shí)器,設(shè)置其中斷時(shí)間為1ms。其中斷處理函數(shù)中每到1S,對(duì)全局變量counter1,counter2加1。向終端發(fā)送新設(shè)備注冊(cè)節(jié)點(diǎn)信息判斷counter1是否大于4S,大于那么收集數(shù)據(jù)信息,并按指定協(xié)議發(fā)送給終端設(shè)備,同時(shí)將counter1清零。判斷counter1是否大于3S,大于那么喂狗,同時(shí)將counter2清零。讀取SPI752_rbuf_1[],如果有數(shù)據(jù),那么將其存儲(chǔ)到指定的數(shù)組中,然后判斷是否接收完畢,假設(shè)接受完畢,那么進(jìn)行數(shù)據(jù)校

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論