物聯(lián)網(wǎng)課程設(shè)計論文_第1頁
物聯(lián)網(wǎng)課程設(shè)計論文_第2頁
物聯(lián)網(wǎng)課程設(shè)計論文_第3頁
物聯(lián)網(wǎng)課程設(shè)計論文_第4頁
物聯(lián)網(wǎng)課程設(shè)計論文_第5頁
免費預(yù)覽已結(jié)束,剩余22頁可下載查看

下載本文檔

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

文檔簡介

1、物聯(lián)網(wǎng)課程設(shè)計論文東北石油大學(xué)課程設(shè)計課程 無線傳感網(wǎng)絡(luò)課程設(shè)計題目遠程燈控系統(tǒng)院系 計算機與信息技術(shù)學(xué)院專業(yè)班級 物聯(lián)網(wǎng)工程12-1班學(xué)生姓名學(xué)生學(xué)號指導(dǎo)教師摘要無線傳感器網(wǎng)絡(luò)的無線通信技術(shù)可以采用ZigBee 技術(shù)、藍牙、Wi-Fi 和紅外等技術(shù)。ZigBee 技術(shù)是一種短距離、低復(fù)雜度、低功耗、低數(shù)據(jù)速率、低成本的雙向無線通信技術(shù)或無線網(wǎng)絡(luò)技術(shù),是一組基于IEEE802.15.4 無線標準研制開發(fā)的有關(guān)組網(wǎng)、安全和應(yīng)用軟件方面的通信技術(shù)。ZigBee 聯(lián)盟于 2005 年公布了第一份ZigBee 規(guī)范“ ZigBee SpecificationV1.0 "。ZigBee協(xié)議規(guī)范

2、使用了 IEEE802. 15. 4定義的物理層(PHY)和媒體 介質(zhì)訪問層(MAC),并在此基礎(chǔ)上定義了網(wǎng)絡(luò)層(NWK)和應(yīng)用層(APL)架 構(gòu) 1 。本文設(shè)計主要利用C#S言在VS2010平臺上設(shè)計一個桌面應(yīng)用程序,用于連接物聯(lián)網(wǎng)實驗中間件服務(wù)器,從而獲取下位機發(fā)給中間件的數(shù)據(jù),顯示出網(wǎng)絡(luò)拓 撲和節(jié)點信息,并通過發(fā)送控制命令,達到控制下位機效果。關(guān)鍵詞:ZigBee協(xié)議;無線傳感器網(wǎng)絡(luò);物聯(lián)網(wǎng)中間件;通信協(xié)議目錄第 1 章 概 述 11.1 ZigBee 概述11.2 物聯(lián)網(wǎng)中間件介紹 11.3 無線傳感器網(wǎng)絡(luò)簡介 21.4 遠程燈控系統(tǒng)簡介 2第2章遠程燈控系統(tǒng)的總體設(shè)計 3第3 章硬件

3、設(shè)計 43.1 節(jié)點選擇 43.2 硬件模塊原理 5第4 章網(wǎng)絡(luò)節(jié)點軟件設(shè)計與實現(xiàn) 74.1 軟件架構(gòu) 74.2 SAPI初始化和任務(wù)事件處理 74.3 ZDO初始化和任務(wù)事件處理84.4 協(xié)調(diào)器程序執(zhí)行流程圖114.5 終端程序執(zhí)行流程圖124.6 數(shù)據(jù)發(fā)送與數(shù)據(jù)接收12第 5 章 上位機軟件設(shè)計與實現(xiàn) 155.1 上位機軟件界面設(shè)計155.2 上位機軟件執(zhí)行流程圖165.3 網(wǎng)絡(luò)參數(shù)配置與服務(wù)器的連接175.4 網(wǎng)拓撲樹的生成 185.5 LED燈控制消息發(fā)送205.6 LED燈控成果展示21結(jié)論 22參考文獻 23第 1章 概 述1.1 ZigBee 概述ZigBee 是為低數(shù)據(jù)速率、短

4、距離無線網(wǎng)絡(luò)通信定義的一系列通信協(xié)議標準?;赯igBee的無線設(shè)備工作在868MHZ, 915MHz和2.4G頻帶。其最大數(shù)據(jù)速率是 250Kbps。 ZigBee 技術(shù)主要針對以電池為電源的應(yīng)用,這些應(yīng)用對低數(shù)據(jù)速率、低成本、更長時間的電池壽命有較高的需求。在一些ZigBee 應(yīng)用中,無線設(shè)備持續(xù)處于活動狀態(tài)的時間是有限的,大部分時間無線設(shè)備是處于省電模式(也稱休眠模式)的。因此,ZigBee 設(shè)備在電池需要更換以前能夠工作數(shù)年以上2。ZigBee 標準是由ZigBee 聯(lián)盟所開發(fā)的,該聯(lián)盟有數(shù)百個成員公司,從半導(dǎo)體產(chǎn)業(yè)和軟件開發(fā)者到原始設(shè)備生產(chǎn)商、安裝商。 ZigBee 聯(lián)盟是 2002

5、年創(chuàng)立的一個非盈利性組織,對每一個想加入的成員都開放3。ZigBee標準采用IEEE 802.15.4 標準作為其PHY 層和 MAC 層協(xié)議。因此,遵循ZigBee 的設(shè)備也同樣遵循IEEE802.15.4標準 4。通過簡化通信協(xié)議和降低數(shù)據(jù)速率,ZigBee 標準有助于降低應(yīng)用成本。和其他的標準例如IEEE 802.11 相比,滿足ZigBee 和 IEEE 802.15.4標準的最低需求相對輕松,這同時也降低了 ZigBee收發(fā)器的應(yīng)用復(fù)雜度和成本5。1.2 物聯(lián)網(wǎng)中間件介紹為了更好地管理和監(jiān)控ZigBee 無線網(wǎng)絡(luò),通過“串口-網(wǎng)口”轉(zhuǎn)換器,將物聯(lián)網(wǎng)傳感層所實現(xiàn)對各種物理量的傳感采集和

6、反饋控制,以物聯(lián)網(wǎng)中間件( IOTService) 方式提供給PC 機不同形式的上層應(yīng)用程序,物聯(lián)網(wǎng)綜合演示系統(tǒng)就屬于其中之一。IOTService 是一個以Windows 系統(tǒng)服務(wù)形式存在的服務(wù)程序,目的在于將不同的應(yīng)用項目集中到統(tǒng)一的軟件平臺中。所有的設(shè)備及上層應(yīng)用都通過網(wǎng)絡(luò)連接到IOTService, 并通過 IOTService 進行通信6。 IOTService 的優(yōu)勢在于給不同形式的上層應(yīng)用提供了統(tǒng)一的接口,比如可以讓設(shè)備與C/S 架構(gòu)的桌面程序進行通訊,也可以搭建 WebService通過 WebService和IOTService進行通信,再進一 步編寫 B/S 架構(gòu)的應(yīng)用軟件

7、。1.3 無線傳感器網(wǎng)絡(luò)簡介無線傳感器網(wǎng)絡(luò)是由大量體積小、成本低,具有無線通信、傳感、數(shù)據(jù)處理能力的傳感器節(jié)點組成的,傳感器節(jié)點一般由傳感單元、處理單元、收發(fā)單元、電源單元等功能模塊組成。除此之外,根據(jù)具體應(yīng)用的需要,可能還會有定位系統(tǒng)、電源再生單元和移動單元等。在無線傳感器網(wǎng)絡(luò)中,大量傳感器節(jié)點被布置在整個觀測區(qū)域中,各個傳感器節(jié)點將所探測到的有用信息通過初步的數(shù)據(jù)處理和信息融合后傳送給用戶,數(shù)據(jù)傳送的過程是通過相鄰節(jié)點接力傳送的方式傳送回基站,然后再通過基站以衛(wèi)星通信或者有線網(wǎng)絡(luò)連接的方式傳送給最終用戶。因此,與其他傳統(tǒng)的網(wǎng)絡(luò)相比,無線傳感器網(wǎng)絡(luò)具有如下特性。( 1)低功耗( 2)自組織網(wǎng)

8、絡(luò)( 3)高可擴充性1.4 遠程燈控系統(tǒng)簡介遠程燈控系統(tǒng)是建立在ZigBee PRO協(xié)議棧和物聯(lián)網(wǎng)中間件之上的,通過規(guī)定 好的通信協(xié)議和中間件提供的應(yīng)用接口,利用串口數(shù)據(jù)傳輸和無線數(shù)據(jù)傳輸,可以控制各個節(jié)點LED 燈和蜂鳴器的系統(tǒng)。通過中間件提供的接口和通信協(xié)議,我們開發(fā)了C/S 模式下的桌面應(yīng)用軟件。應(yīng)用軟件連接中間件所在的服務(wù)器,中間件給予反饋信息,依據(jù)傳感網(wǎng)絡(luò)通信協(xié)議和中間件進行通訊,通訊分兩個階段:第一階段是應(yīng)用連接服務(wù)并完成應(yīng)用類型識別,第二階段設(shè)備進行通訊。物聯(lián)網(wǎng)課程設(shè)計論文第2章遠程燈控系統(tǒng)的總體設(shè)計遠程燈控系統(tǒng)主要實現(xiàn)以下功能:應(yīng)用軟件啟動后連接中間件所在的服務(wù)器, 連接成功后

9、向服務(wù)器發(fā)送設(shè)備識別消息并等待服務(wù)器給予應(yīng)答和設(shè)備序號消息, 收到設(shè)備序列號后,說明連接服務(wù)器成功,正式開始系統(tǒng)的工作。應(yīng)用軟件必須 定時發(fā)送自己的心跳消息給服務(wù)器來保持正常通信,與此同時,應(yīng)用軟件也會收 到服務(wù)器發(fā)送過來心跳,應(yīng)用軟件會判斷心跳是否超時,如果心跳超時,表示與 服務(wù)器失去連接,應(yīng)用軟件就會斷開連接。在保持與服務(wù)器通信的同時,系統(tǒng)一直處于消息處理循環(huán),接收處理由服務(wù) 器發(fā)送過來的消息,包括:設(shè)備連接信息、設(shè)備斷開信息、心跳信息、父子節(jié)點 關(guān)系信息、節(jié)點信息、上傳母版資源信息等,通過這些信息實現(xiàn)的遠程燈控。本系統(tǒng)屬于C/S模式下的應(yīng)用軟件,實現(xiàn)了心跳機制、網(wǎng)絡(luò)拓撲樹形展示、 節(jié)點信

10、息顯示、節(jié)點控制模塊、消息記錄等功能,通過物聯(lián)網(wǎng)中間件實現(xiàn)與終端 的對接,并控制終端。通信體系如下圖 2-1所示:圖2-1 lOTService通信體系物聯(lián)網(wǎng)課程設(shè)計論文第3章硬件設(shè)計3.1 節(jié)點選擇所選節(jié)點必須滿足有LED燈和蜂鳴器的模塊,以便可以對其進行控制,除此 之外,協(xié)調(diào)器節(jié)點的選擇還需要有 RS-232串行接口,以此保證協(xié)調(diào)器與上位機通 信。為了展示網(wǎng)絡(luò)拓撲結(jié)構(gòu)為樹形網(wǎng)絡(luò),必須保證所選節(jié)點中有一個協(xié)調(diào)器節(jié)點, 至少需要一個路由器節(jié)點,任意個終端節(jié)點。本次系統(tǒng)開發(fā)所選節(jié)點有一個協(xié)調(diào)器模塊,三個傳感節(jié)點,一個用轉(zhuǎn)網(wǎng)模塊, 如下圖3-1所示:圖3-1節(jié)點選擇物聯(lián)網(wǎng)課程設(shè)計論文3.2 硬件模

11、塊原理3.2.1 CC2530無線節(jié)點模塊一個基于802.15.4的CC2530無線收發(fā)模塊如圖3-2所示。無線模塊的核心部 分是一個CC2530射頻收發(fā)器。mK 二 O«Rt>K:-QB口 CWBUiV怒:;-.3*皿:-£:£ 書刃 r 碼制U*好的和砧峨依. 某ill借瓶收購起 由iUji:圖3-2 2530無線節(jié)點模塊CC2530的無線接收器是一個中低頻的接收器。接收到的射頻信號通過低噪聲 放大器放大而正交降頻轉(zhuǎn)換到中頻。 在中頻2MHZ中,當(dāng)ADC模數(shù)轉(zhuǎn)換時,輸入 信號被過濾和放大。CC2530的數(shù)據(jù)緩沖區(qū)通過先進先出(FIFO)的方式來接受128

12、位數(shù)據(jù)。使用 先進先出讀取數(shù)據(jù)需要通過特殊功能寄存器接口。內(nèi)存與先進先出緩沖區(qū)數(shù)據(jù)移 動使用DMA方式來實現(xiàn)。CC2530發(fā)射器是基于上變頻器。接收數(shù)據(jù)存放在一個接收先進先出(區(qū)別于 發(fā)送先進先出)的數(shù)據(jù)緩沖區(qū)內(nèi)。發(fā)送數(shù)據(jù)幀的前導(dǎo)符和開始符由硬件生成。通 過數(shù)模轉(zhuǎn)換把數(shù)字信號轉(zhuǎn)換成模擬信號發(fā)送出去。3.2.2 RS-232 串行接口RS-232-C是美國電子工業(yè)協(xié)會 EIA (Electronic Industry Association)制定的一種用行物理接口標準。模塊原理圖如下圖3-3所示:圖3-3 RS-232串行接口模塊圖3-4 LED燈與按鍵RS-232C標準對邏輯電平的定義。對于數(shù)

13、據(jù)(信息碼):邏輯“ 1”的電平低 于-3V,邏輯“0”的電平高于+3V;對于控制信號;接通狀態(tài)(ON)即信號有效 的電平高于+3V,斷開狀態(tài)(OFF)即信號無效的電平低于-3V,也就是當(dāng)傳輸電 平的絕對值大于3V時,電路可以有效地檢查出來,介于-3+3V之間的電壓無意 義,低于-15V或高于+15V的電壓也認為無意義。3.2.3 LED燈和按鍵LED燈和按鍵的原理圖如下圖3-4所示:第4章 網(wǎng)絡(luò)節(jié)點軟件設(shè)計與實現(xiàn)4.1 軟件架構(gòu)ZigBee標準定義了一種網(wǎng)絡(luò)協(xié)議,這種協(xié)議能夠確保無線設(shè)備在低成本、低 功耗和低數(shù)據(jù)速率網(wǎng)絡(luò)中的互操作性9。ZigBee協(xié)議棧構(gòu)建在IEEE 802.15.4標準

14、基礎(chǔ)之上,802.15.4標準定義了 MAC和PHY層的協(xié)議標準,而ZigBee協(xié)議棧則 定義了網(wǎng)絡(luò)層、應(yīng)用層和安全服務(wù)層的標準。圖 4-1為ZigBee協(xié)議的層次架構(gòu), 越向下越貼近硬件,越向上越貼近軟件本身和應(yīng)用10。(叩6,41打,口和爾airawN度朝髭營時nNjDN 3AP因喀一(K7k>福山宣理網(wǎng)冷筲Pt當(dāng)魚石埴Y .卜栩切層f PUT)81K RL5fHr.3. KHe餐向Mfl .irCFfF笠全 限更 假應(yīng)向琳點1APSDF-S4PATS 田總中轉(zhuǎn)W%F SA ipi>-s*p T圖4-1 ZigBee協(xié)議的層次架構(gòu)訕管珅A幅ATS宏主皆克MIK內(nèi)豈內(nèi)情理律午m由

15、Hfr. I'C)lrMK-SAr4.2 SAPI初始化和任務(wù)事件處理SAPI的初始化和任務(wù)事件處理是應(yīng)用程序的入口,是在 SAPI.C中完成的, 初始化的函數(shù)為SAPI_Init (),在系統(tǒng)任務(wù)初始化時會給它分配一個任務(wù)ID,通過任務(wù)ID就能進入用戶層任務(wù)事件處理函數(shù)了,實現(xiàn)方式如下:物聯(lián)網(wǎng)課程設(shè)計論文void SAPI_Init( bytetask_id)sapi_TaskID = task_id;/分配任務(wù)IDsapi_bindInProgress = 0xffff;/綁定標志位,默認不允許綁定sapi_epDesc.task_id = &sapi_TaskID;sap

16、i_epDesc.endPoint = 0;afSetMatch(sapi_epDesc.simpleDesc->EndPoint, FALSE);/默認關(guān)閉匹配描述符的響應(yīng)ZDO_RegisterForZDOMsg( sapi_TaskID, NWK_addr_rsp );/注冊返回事件 ZDO_RegisterForZDOMsg( sapi_TaskID, Match_Desc_rsp ); RegisterForKeys( sapi_TaskID ); /注冊(HAL )鍵盤事件osal_set_event(task_id, ZB_ENTRY_EVENT); /設(shè)置事件,啟動應(yīng)用

17、API_ProcessEvent( byte task_id, UINT16 events ),參數(shù):task_id 為 OSAL 分配任務(wù)ID, events 為當(dāng)前需要處理的事件。該函數(shù)為SAPI 的任務(wù)處理函數(shù),用戶自定的事件都在此得以實現(xiàn),實現(xiàn)功能如下:UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events ) if ( events & SYS_EVENT_MSG ) /系統(tǒng)消息事件if ( events & ZB_ALLOW_BIND_TIMER )/允許綁定計時事件if ( events & ZB_BIN

18、D_TIMER )/綁定時間事件if ( events & ZB_ENTRY_EVENT )/進入用戶處理事件函數(shù),在 SAPI_Init的最后注冊了該事件if ( events & ( ZB_USER_EVENTS ) )4.3 ZDO 初始化和任務(wù)事件處理ZigBee設(shè)備對象(ZDO)是駐留于應(yīng)用層(APL)的一種應(yīng)用解決方案,它位 于ZigBee協(xié)議棧的應(yīng)用支持子層(APS)之上。ZDO負責(zé)初始化應(yīng)用支持子層(APS)、網(wǎng)絡(luò)層(NWK)、安全服務(wù)提供模塊(SSP)及非1240端點應(yīng)用的任何其他 ZigBee 設(shè)備層;另外ZDO 還負責(zé)從終端應(yīng)用收集配置信息來實現(xiàn)設(shè)備和服務(wù)

19、發(fā)現(xiàn)、安全管理、網(wǎng)絡(luò)管理、綁定管理和節(jié)點管理功能。ZDO的初始化實現(xiàn)形式為 ZDApp的初始化,Z-Stack目錄下的ZDO文件夾下 的 ZDApp.c 中實現(xiàn)的,實現(xiàn)初始化ZDApp 函數(shù)為 void ZDApp_Init( uint8 task_id ) ,具體功能如下注釋:void ZDApp_Init( uint8 task_id ) ZDAppTaskID = task_id;/保存任務(wù)IDZDAppNwkAddr.addrMode = Addr16Bit;/使用16 位短地址ZDAppNwkAddr.addr.shortAddr = INV ALID_NODE_ADDR; /0xF

20、FFE (void)NLME_GetExtAddr();ZDAppCheckForHoldKey(); / Joystick up 控制ZDO_Init();/通過判斷預(yù)編譯來開啟一些函數(shù)功能/在 AF 層注冊該端口描述符afRegister( (endPointDesc_t *)&ZDApp_epDesc );ZDApp_RegisterCBs();ZDO 任務(wù)事件處理是在ZDApp.c 中實現(xiàn)的,實現(xiàn)任務(wù)處理的函數(shù)為UINT16ZDApp_event_loop( uint8 task_id, UINT16 events ) ,實現(xiàn)了網(wǎng)絡(luò)的初始化和網(wǎng)絡(luò)的 啟動,建立網(wǎng)絡(luò)成功后會保存網(wǎng)

21、路配置并重啟系統(tǒng),實現(xiàn)主要功能如下:UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )if ( events& ZDO_NETWORK_INIT )/網(wǎng)絡(luò)初始化事件devState = DEV_INIT;/啟動網(wǎng)絡(luò)ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );return (events A ZDO_NETWORK_INIT

22、);if ( events & ZDO_NETWORK_START ) / 協(xié)調(diào)器所建網(wǎng)絡(luò)開始物聯(lián)網(wǎng)課程設(shè)計論文ZDApp_NetworkStartEvt(); /觸發(fā)網(wǎng)絡(luò)建立成功事件 return (events A ZDO_NETWORK_START);if ( events & ZDO_STATE_CHANGE_EVT )/加入網(wǎng)絡(luò)成功后觸發(fā)該事件,更新網(wǎng)絡(luò)信息(協(xié)調(diào)器建網(wǎng)成功)ZDO_UpdateNwkStatus( devState );if ( events & ZDO_NWK_UPDATE_NV )ZDApp_SaveNetworkStateEvt();/

23、保存網(wǎng)絡(luò)狀態(tài)if ( events & ZDO_DEVICE_RESET )SystemReset();/重啟系統(tǒng)由于無線網(wǎng)絡(luò)看不見摸不到,就需要由實質(zhì)性的東西來表明網(wǎng)絡(luò)的狀態(tài),在此, 我們用LED燈的亮滅來顯示網(wǎng)絡(luò)的狀態(tài),系統(tǒng)啟動后,系統(tǒng)運行燈(LED5)會亮 起,建立網(wǎng)絡(luò)成功后,網(wǎng)絡(luò)狀態(tài)燈會不停的閃爍。如下圖 4-2所示:4.4 協(xié)調(diào)器程序執(zhí)行流程圖直到服務(wù)器給予應(yīng)答并受到設(shè)4-3所示:向SEV發(fā)送設(shè)備識別消息說明APP一應(yīng)用層軟件SEV 中間服務(wù)COOR一協(xié)調(diào)器等待應(yīng)答超時等待SEV應(yīng)答等待SEV發(fā)送設(shè)備序列號消息等待SEV發(fā)送第 個應(yīng)用連接信息定時發(fā)送心跳消息其他模塊酢GPIO

24、控制協(xié)調(diào)器啟動后會一直向串口發(fā)送應(yīng)用識別消息 備序列號消息后,開始各項工作,工作流程如下圖收到SEV發(fā)來最后一個 應(yīng)用斷開連接的消息圖4-3協(xié)調(diào)器程序執(zhí)行流程圖物聯(lián)網(wǎng)課程設(shè)計論文4.5 終端程序執(zhí)行流程圖終端節(jié)點加入有協(xié)調(diào)器建立的網(wǎng)絡(luò)后,會獲取節(jié)點信息,然后開始向協(xié)調(diào)器 無線發(fā)送父子節(jié)點關(guān)系信息,如果收到無線信息,則進入消息處理循環(huán)中處理, 工作流程圖如下圖4-4所示:IIC控制信息加入網(wǎng)絡(luò)成功獲取節(jié)點信息定時發(fā)送父子節(jié)點關(guān)系消息H消息處理循環(huán)GPIO控制信系統(tǒng)事件其他消息圖4-4終端程序執(zhí)行流程圖4.6 數(shù)據(jù)發(fā)送與數(shù)據(jù)接收4.6.1 無線發(fā)送數(shù)據(jù)無線發(fā)送數(shù)據(jù)的時候可以直接調(diào)用SAPI中封裝好

25、的一個發(fā)送數(shù)據(jù)函數(shù):* 函數(shù)名稱:zb_SendDataRequest* 功能描述:發(fā)送數(shù)據(jù)* 參 數(shù):destination -發(fā)送方式物聯(lián)網(wǎng)課程設(shè)計論文commandId - 發(fā)送命令I(lǐng)Dlen - 發(fā)送的數(shù)據(jù)包長度handle - 發(fā)送序列處理txOptions - 發(fā)送選項radius - 最大傳輸半徑(發(fā)送的跳數(shù))void zb_SendDataRequest ( uint16 destination, uint16 commandId, uint8 len, uint8 *pData, uint8 handle, uint8 txOptions, uint8 radius )dst

26、Addr.addr.shortAddr = destination;/使用短地址 dstAddr.addrMode = afAddr16Bit;dstAddr.panId = 0;dstAddr.endPoint = sapi_epDesc.simpleDesc->EndPoint; /設(shè)定端口status = AF_DataRequest(&dstAddr, &sapi_epDesc, commandId, len, pData, &handle, txOptions, radius); /發(fā)送信息if (status != afStatus_SUCCESS)S

27、API_SendCback( SAPICB_DATA_CNF, status, handle ); /設(shè)置發(fā)送確認事件/有該函數(shù)可以看出,真正發(fā)送數(shù)據(jù)的函數(shù)為AF_DataRequest發(fā)送的數(shù)據(jù)存于 pDATA 中,發(fā)送數(shù)據(jù)時需要配置發(fā)送的目的地址等。4.6.2 無線接收數(shù)據(jù)當(dāng)有無線數(shù)據(jù)需要接收時,SAPI 層會有事件被觸發(fā),就會進入應(yīng)用層任務(wù)事件處理函數(shù)SAPI_ProcessEvent中,如下:case AF_INCOMING_MSG_CMD:/AF 信息輸入,無線接收到信息后,觸發(fā)該事件pMSGpkt = (afIncomingMSGPacket_t *) pMsg; /接收信息包SA

28、PI_ReceiveDataIndication( pMSGpkt->srcAddr.addr.shortAddr, pMSGpkt->clusterId, /調(diào)用處理函數(shù)pMSGpkt->LinkQuality,pMSGpkt->rssi,pMSGpkt->cmd.DataLength, pMSGpkt->cmd.Data);接著就會調(diào)用數(shù)據(jù)接收處理函數(shù):* 函數(shù)名稱:SAPI_ReceiveDataIndication* 功能描述:數(shù)據(jù)接收處理函數(shù)* 參 數(shù): source - 發(fā)送設(shè)備的源短地址* commandId-命令I(lǐng)D* len - 接收的數(shù)據(jù)

29、包長度* pData - 數(shù)據(jù)緩存指針void SAPI_ReceiveDataIndication( uint16 source, uint16 command,uint8 lqi, int8 rssi, uint16 len, uint8 *pData )#if defined ( MT_SAPI_CB_FUNC )/調(diào)試輸出接收數(shù)據(jù)的信息if ( SAPICB_CHECK( SPI_CB_SAPI_RCV_DATA_IND ) )zb_MTCallbackReceiveDataIndication( source, command, len, pData );else#endif /MT

30、_SAPI_CB_FUNC#if ( SAPI_CB_FUNC )zb_ReceiveDataIndication( source, command, lqi, rssi,len, pData );/調(diào)用接收處理函數(shù)#endif該函數(shù)被調(diào)用的,會把接收到的數(shù)據(jù)包的內(nèi)存地址傳進來,接著會調(diào)用處理 函數(shù)zb_ReceiveDataIndication,對接收到的數(shù)據(jù)進行處理。物聯(lián)網(wǎng)課程設(shè)計論文第5章上位機軟件設(shè)計與實現(xiàn)5.1 上位機軟件界面設(shè)計上位機軟件因為需要通過網(wǎng)絡(luò)通信與服務(wù)器進行通信連接, 所以需要有輸入服 務(wù)器的IP地址和通信端口號,點擊連接按鈕后根據(jù)輸入的IP地址和端口號去連接 服務(wù)器。

31、當(dāng)有終端設(shè)備接入服務(wù)器時,上位機會收到設(shè)備接入信息以及節(jié)點父子關(guān)系信 息,此時,上位機會根據(jù)這些信息在 treeview控件中生成節(jié)點關(guān)系樹,以此來展 現(xiàn)網(wǎng)絡(luò)拓撲。點擊treeview中的節(jié)點,會獲取該節(jié)點的信息,并在節(jié)點信息展示模塊中顯示 該模塊的地址信息、信號值信息、PID信息等,同時激活節(jié)點控制模塊,也就能控 制該節(jié)點的LED燈和蜂鳴器。在軟件運行中,會出現(xiàn)各種提示信息,以便使用者了解程序運行的各種狀態(tài), 這些信息會在界面上顯示出來。軟件界面如下圖5-1所示:5.2 上位機軟件執(zhí)行流程圖上位機軟件需要連接服務(wù)器才能進一步工作,連接服務(wù)器成功后需要發(fā)送設(shè)備 識別消息并等待服務(wù)器給予應(yīng)答,收

32、到應(yīng)答后表明連接服務(wù)器成功,才真正開啟 了上位機的功能:一方面需要定時發(fā)送心跳信息給服務(wù)器,來保證通信的正常運 行,另一方面要循環(huán)接收服務(wù)器發(fā)來的各種消息,不同的消息跳到相應(yīng)地執(zhí)行函 數(shù)中去,完成上位機的各個功能。程序流程圖如下圖5-2所示:圖5-2上位機程序流程圖5.3 網(wǎng)絡(luò)參數(shù)配置與服務(wù)器的連接運行軟件時,需要連接服務(wù)器才能進行下一步,我們用TCP 協(xié)議連接服務(wù)器,連接前需要配置網(wǎng)絡(luò)參數(shù),通過網(wǎng)絡(luò)配置窗口,可以快速配置連接服務(wù)器的網(wǎng)絡(luò)IP 地址和端口,進而連接服務(wù)中間件,實現(xiàn)代碼如下:在窗口初始化的時候,首先聲明一個TCP 客戶端:private TcpClient tcpclient;然

33、后把IP地址和端口號提取出來進行連接,用自己封裝好的socketouttime類,可以對連接進行設(shè)定超時,連接成功后會開啟一個數(shù)據(jù)流:IPEndPoint ipendport = new IPEndPoint(IPAddress.Parse(tbIP.Text), int.Parse(tbPort.Text);tcpclient = socketouttime.Connect(ipendport, 5000); /設(shè)定超時為/5 秒NetworkStream MyMsg = tcpclient.GetStream();而真正去連接服務(wù)器時是調(diào)用 TcpClient類封住的方法BeginConn

34、ect,代碼如下:tcpclient.BeginConnect(serverip, serverport, new AsyncCallback(CallBackMethod), tcpclient);連接服務(wù)器成功后,程序向下執(zhí)行,上位機軟件會向中間件發(fā)送應(yīng)用識別消息并等待服務(wù)器的應(yīng)答,收到成功應(yīng)答后表明成功與服務(wù)器建立通訊。由于發(fā)送的消息種類眾多,所以事先封住好一個消息包類message.c,s 在該類中有各種靜態(tài)數(shù)據(jù)包格式,發(fā)送和接收數(shù)據(jù)包時,直接調(diào)用相應(yīng)對象即可。message.AppIdentMsg appidentmsg = new message.AppIdentMsg();app

35、identmsg.head.header = (byte)('');appidentmsg.head.len = (byte)9;appidentmsg.head.id = 0;appidentmsg.head.type = (byte)(message.APPINENTMSGTYPE);appidentmsg.apptype = 1;appidentmsg.serheadbeatover =(byte)(message.HEARTBEATINTERBALTOSER * 3);/心跳超時時間設(shè)置為心跳間隔的3 倍appidentmsg.serheadbeatinte = (by

36、te)(message.HEARTBEATINTERBALFROMSER); /發(fā)送應(yīng)用識別消息result = socketouttime.MyWrite(tcpclient, message.AppIdentMsgToBytes(appidentmsg), appidentmsg.head.len, 5000);/設(shè)置發(fā)送超時為5 秒if (result) ShowStatus(連接服務(wù)器成功!");5.4 網(wǎng)拓撲樹的生成上位機軟件成功連接服務(wù)器后,只要有終端設(shè)備接入服務(wù)器,就會定時發(fā)送父 子節(jié)點關(guān)系信息,服務(wù)器會轉(zhuǎn)發(fā)到上位機,上位機收到下位機發(fā)來的父子節(jié)點信 息,根據(jù)該信息,可

37、以生成網(wǎng)絡(luò)拓撲樹。若收到父子節(jié)點信息已經(jīng)存在,則保持 原有的樹形,若是節(jié)點不存在,則在樹中生成新的節(jié)點,并獲取該節(jié)點的節(jié)點信 息。程序流程圖如下圖5-3所示:增加子節(jié)點并發(fā)送 獲取節(jié)點信息消息消息處理循環(huán)圖5-3父子節(jié)點信息處理程序流程圖根據(jù)父子節(jié)點信息,利用treeview控件,可以輕松實現(xiàn)網(wǎng)絡(luò)拓撲樹的生成,并 在每一各樹節(jié)點中保存自己的信息,以便顯示節(jié)點信息和控制時候地址的使用, 具體代碼如下:連接服務(wù)器成功后,會開啟一子線程,循環(huán)等待接收有服務(wù)器發(fā)送過來的消息, 根據(jù)通信協(xié)議,不同的消息有不同的標識,根據(jù)消息代碼,跳轉(zhuǎn)到相應(yīng)地處理函 數(shù)中去。if (result) ShowStatusC

38、連接服務(wù)器成功!");MsgCycleThread = new Thread(MsgCycle); MsgCycleThread.Start();private void MsgCycle() /消息處理循環(huán) message.MsgHeadermsgheader;消息頭int recv;/接收到數(shù)據(jù)的長度NetworkStream ns = tcpclient.GetStream();/啟數(shù)據(jù)流 byte口 msgbuffer =new byte4096;數(shù)據(jù)緩沖區(qū)while (true)/循環(huán)接收處理消息recv = ns.Read(msgbuffer, 0, 4096); /接收

39、數(shù)據(jù),存放于 /msgbuffer/提取出數(shù)據(jù)的頭部信息msgheader = (message.MsgHeader)message.GetHeader(msgbuffer,0);switch(msgheader.type)/判斷消息的類型,跳轉(zhuǎn)到相應(yīng)函數(shù)case message.UNODEPARSONMSGTYPE: /設(shè)備父子關(guān)系消息break;收到父子關(guān)系信息并進入到消息處理函數(shù)后,根據(jù)父子信息,在treeview中生成相應(yīng)地節(jié)點。message.NodeParsonMsg nodeparsonmsg;/把消息提取出來,封裝成包nodeparsonmsg = (message.NodeP

40、arsonMsg)message.BytesToStuct(msgbuffer,i - recv);首先添加協(xié)調(diào)器節(jié),協(xié)調(diào)器地址為0。treeView1.Invoke(new EventHandler(delegate/因為在子線程里,所以需要代理來更新控件rtbRecord.AppendText("收至 ij 父子關(guān)系消息! rn");CoorNode.Name = nodeparsonmsg.ParNodeAddr.ToString ();CoorNode = treeView1.Nodes.Add("0");/直接添加到 treeview,地址為

41、0CoorNode.Name = "0");當(dāng)收到一個節(jié)點,且這個節(jié)點并不在網(wǎng)絡(luò)拓撲樹中,就需要把它加到樹節(jié)點中,并發(fā)送獲取節(jié)點信息命令,獲取節(jié)點的信息。此處以父節(jié)點恰好為協(xié)調(diào)器為例,在協(xié)調(diào)器節(jié)點下添加子節(jié)點并發(fā)送獲取節(jié)點信息命令。if (nodeparsonmsg.ParNodeAddr = 0) /恰好父節(jié)點是協(xié)調(diào)器TreeNode RouterNode = new TreeNode(); /申請一個新的節(jié)點 /節(jié)點的地址作為節(jié)點顯示文本RouterNode.Text = nodeparsonmsg.NodeAddr.ToString();/節(jié)點的地址作為名字Route

42、rNode.Name = nodeparsonmsg.NodeAddr.ToString();treeView1.Invoke(new EventHandler(delegate CoorNode.Nodes.Add(RouterNode); /添加在協(xié)調(diào)器節(jié)點下);物聯(lián)網(wǎng)課程設(shè)計論文/封裝節(jié)點信息獲取數(shù)據(jù)包nodecommmsg.head.id = nodeparsonmsg.head.id;nodecommmsg.head.type = message.GETNODEINFOMSGTYPE;nodecommmsg.addr = nodeparsonmsg.NodeAddr;/發(fā)送節(jié)點信息獲

43、取命令socketouttime.MyWrite(tcpclient,message.NodeCommMsgToBytes(nodecommmsg), nodecommmsg.head.len, 5000);5.5 LED 燈控制消息發(fā)送在選中一個節(jié)點后,可以激活LED 燈控模塊,點擊LED 選中項,就會發(fā)送LED 燈控制信息到節(jié)點,節(jié)點收到信息后會改變燈的狀態(tài),控制成功后會返回確認信息。以1 燈為例,代碼如下:private void cbLED1_CheckedChanged(object sender, EventArgs e)if (cbLED1.CheckState = CheckS

44、tate.Checked)cbLED1.Tag = 1;elsecbLED1.Tag = 0;LEDControl();/LED 燈控制函數(shù)LED 燈控制函數(shù)是為了方便發(fā)送LED 燈控制信息,因為 LED 控制選項有四個,如果每個cbLED_CheckedChanged 都直接發(fā)送控制信息,則使得代碼冗余,下面是 LEDControl ()函數(shù)的代碼及解釋:private void LEDControl()/led 燈控制message.MotherResData msg; /led 燈控制信息包/獲取選中節(jié)點的信息,提取出節(jié)點資源信息message.NodeInfoMsg info = (message.NodeInfoMsg)treeView1.SelectedNode.Tag;msg.head.header = (byte)''msg.head.len = 15;msg.head.id = selectedid;msg.head.type = message.DMOTHERRESMSGTYPE; /消息類型,下傳控制/msg.addr = UInt16.Parse(treeView1.SelectedNode.Name);/選中節(jié)點的地址信息msg.mboardtype = info.

溫馨提示

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

評論

0/150

提交評論