利用TINI平臺(tái)設(shè)計(jì)網(wǎng)絡(luò)On/Off開(kāi)關(guān)(圖)
系統(tǒng)軟件概述
com.dalsemi.tininet.http.httpserver類(lèi)允許開(kāi)關(guān)控制應(yīng)用程序充當(dāng)簡(jiǎn)單的web服務(wù)器,將java程序傳遞給遠(yuǎn)端主機(jī)。在被主機(jī)內(nèi)部瀏覽器執(zhí)行后,該java程序就建立了一個(gè)與tini應(yīng)用程序交換命令和狀態(tài)的雙向tcp連接,也為顯示控制和狀態(tài)提供了一個(gè)圖形用戶(hù)界面。整個(gè)軟件系統(tǒng)如圖1所示。
系統(tǒng)硬件概述
在圖2中,基于tinim390/4002模板的開(kāi)/關(guān)控制電路構(gòu)成了該接口。tinim390/400模板提供了ethernet網(wǎng)絡(luò)接口能力,以及通過(guò)引腳p5.0(其他引腳也可以等效工作)控制開(kāi)關(guān)。n溝道m(xù)osfet開(kāi)關(guān)切換流過(guò)繼電器的電流,控制繼電器。用戶(hù)可以根據(jù)繼電器和fet的大小要求,供給不同的電壓和電流;如果不需要隔離外部電路與tini模板的電源,則可以去掉繼電器。在開(kāi)關(guān)狀態(tài)改變時(shí),二極管抑制繼電器線圈的感生電壓。為了實(shí)現(xiàn)某些新的服務(wù),如網(wǎng)絡(luò)開(kāi)關(guān)控制。
tini開(kāi)關(guān)控制應(yīng)用
由四個(gè)類(lèi)構(gòu)成了該應(yīng)用的開(kāi)關(guān)控制和web服務(wù)器接口。powerswitch類(lèi)通過(guò)采用tini類(lèi)中的com.dalsemi.system.bitport應(yīng)用程序接口類(lèi),直接與硬件接口。webworker類(lèi)直接來(lái)自maxim的software developers kit(tini sdk)中的tiniwebserver實(shí)例,負(fù)責(zé)為到來(lái)的http連接提供服務(wù)。switchworker類(lèi)管理java程序和tini應(yīng)用之間的所有命令和狀態(tài)通信。tiniwebserver類(lèi)通過(guò)綁定各個(gè)類(lèi)的操作,來(lái)實(shí)現(xiàn)本應(yīng)用。
powerswitch類(lèi)是一個(gè)連接硬件的接口,在其構(gòu)造器內(nèi)為引腳p5.0創(chuàng)建一個(gè)bitport目標(biāo)。在該類(lèi)中,可以執(zhí)行兩種函數(shù),開(kāi)函數(shù)設(shè)定的引腳端口狀態(tài)是接通繼電器線圈的電壓;而關(guān)函數(shù)通過(guò)清零端口狀態(tài),來(lái)斷開(kāi)繼電器線圈的電壓。圖2中的單刀雙擲(spdt)繼電器能夠工作于常閉或常開(kāi)位置,即在這兩種位置之間切換外部電壓源。開(kāi)、關(guān)函數(shù)假設(shè)電路工作于常開(kāi)狀態(tài),且必須能夠被改變至常閉電路狀態(tài)。為了指示開(kāi)/關(guān)是否對(duì)應(yīng)于bitport的置位或清零函數(shù),則在該類(lèi)中引入了一個(gè)外部的boolean變量(invert),另一個(gè)函數(shù)(setinvert)要求用來(lái)初始化invert變量。圖2所示的硬件圖描述的是常開(kāi)電路。
webworker類(lèi)提供了網(wǎng)絡(luò)和應(yīng)用之間的接口。它簡(jiǎn)單地建立和驅(qū)動(dòng)一個(gè)目標(biāo)(com.dalsemi.tininet.http.httpserver),該目標(biāo)依次產(chǎn)生線程,為每個(gè)到來(lái)的http連接提供服務(wù)。該類(lèi)取自上述tiniwebserver實(shí)例,無(wú)須作任何修改,可以在網(wǎng)絡(luò)上的任何地方接入。httpserver能夠提示輸入密碼,或者接受任何其他形式的控制,僅允許那些授權(quán)的用戶(hù)接入。
通過(guò)將網(wǎng)絡(luò)和硬件接口組合在一起(圖3所示),tiniserver允許遠(yuǎn)程開(kāi)關(guān)控制。例如,drive()函數(shù)通過(guò)創(chuàng)建一個(gè)webworker線程和網(wǎng)頁(yè)“index.htm1”,建立此web服務(wù)器。網(wǎng)頁(yè)的主要目的是為了在主機(jī)工作站上下載并執(zhí)行該java程序。如果提示網(wǎng)頁(yè)僅包含靜態(tài)信息,該應(yīng)用就沒(méi)有必要?jiǎng)?chuàng)建網(wǎng)頁(yè)。提示網(wǎng)頁(yè)只需要與包含java程序的文件目錄一起,拷貝至web服務(wù)器的根目錄下即可。
codebase是一個(gè)在每個(gè)tini芯片組設(shè)計(jì)中可以改變的網(wǎng)頁(yè)參數(shù)。java程序使用該信息,以返回連接至某個(gè)獨(dú)立的服務(wù)器插件中的tini應(yīng)用程序。可以創(chuàng)建并上傳一個(gè)定制的網(wǎng)頁(yè)至任何一個(gè)安裝在現(xiàn)場(chǎng)的tini芯片組參考設(shè)計(jì)。一個(gè)簡(jiǎn)單的方法是由應(yīng)用程序在每次運(yùn)行時(shí),創(chuàng)建該網(wǎng)頁(yè)。通過(guò)三次寫(xiě)操作,createindexpage函數(shù)可以創(chuàng)建文件index.html,并將ip地址插入codebase部分。
1)index.write(indextop.getbytes(),0,indextop.length());
2)index.write(inetaddress.getlocalhost().gethostaddress().getbytes());
3)index.write(indexbottom.getbytes(),0,indexbottom.lenghth());
第一次和第三次寫(xiě)操作是將網(wǎng)頁(yè)的靜態(tài)部分拷貝至文件中,而第二次寫(xiě)操作是將ip地址拷貝至文件的codebase部分。在應(yīng)用程序建立web服務(wù)器和創(chuàng)建網(wǎng)頁(yè)后,就啟動(dòng)了web服務(wù)器。它創(chuàng)建一個(gè)服務(wù)器插件,用來(lái)處理來(lái)自下載java程序的進(jìn)入連接,并且在java程序每次連接tini應(yīng)用時(shí),調(diào)用serviceconnection函數(shù)。
serviceconnection函數(shù)創(chuàng)建了一個(gè)新例程switchworker,并將這個(gè)插件傳給該類(lèi)。switchworder構(gòu)造器創(chuàng)建一個(gè)新的線程,以處理主機(jī)java程序和tini應(yīng)用之間的連接。serviceconnection函數(shù)也處理下一個(gè)進(jìn)入連接,接著將控制傳給drive函數(shù)。
switchworker類(lèi)管理java程序和webserver之間的所有通信,如圖4所示,在連接被斷開(kāi)之前,它不斷地循環(huán),執(zhí)行下列步驟:
停留在read(),等待一個(gè)來(lái)自java程序的命令字節(jié);
如果命令字節(jié)為0,則斷開(kāi)開(kāi)關(guān);如果為1,則閉合開(kāi)關(guān);
讀入當(dāng)前開(kāi)關(guān)狀態(tài),回傳至java程序。
通過(guò)分配每個(gè)命令字節(jié)的低7位來(lái)表示不同開(kāi)關(guān)的狀態(tài),如圖5所示,該運(yùn)算法則可以適用于更多的開(kāi)關(guān)。保留最高位,用來(lái)指示只讀操作。該運(yùn)算法則也可以被擴(kuò)展,以允許在同一時(shí)刻多個(gè)java程序連接至單個(gè)tini webserver應(yīng)用。switchworker只是簡(jiǎn)單地保持一個(gè)“監(jiān)聽(tīng)向量”。每次java程序發(fā)出一個(gè)修改開(kāi)關(guān)狀態(tài)的命令,webserver就將其狀態(tài)回傳至當(dāng)前與之連接的所有java程序。
主機(jī)java程序
tini類(lèi)中的com.dalsemi.tininet.http.httpserver類(lèi)是一種小巧而快速的類(lèi),但僅支持http get操作。由此產(chǎn)生的數(shù)據(jù)只能從tini應(yīng)用到主機(jī)單向傳遞。然而,該應(yīng)用要求雙向數(shù)據(jù)傳輸。命令由主機(jī)發(fā)送至tini webserver,而狀態(tài)由webserver發(fā)送至所有相連的主機(jī)。主機(jī)和tini應(yīng)用之間的通信無(wú)協(xié)議開(kāi)銷(xiāo),單字節(jié)命令和單字節(jié)狀態(tài)允許極快的控制和狀態(tài)響應(yīng)。
主機(jī)java程序包括兩個(gè)類(lèi),主類(lèi)(switchcontrol)處理主機(jī)端的網(wǎng)絡(luò)通信和創(chuàng)建網(wǎng)頁(yè)上所有的顯示圖形單元,見(jiàn)圖6;另一個(gè)類(lèi)(image button)創(chuàng)建一個(gè)圖形撥動(dòng)按鈕,顯示對(duì)應(yīng)于按鈕狀態(tài)的兩種位圖之一,見(jiàn)圖7。撥動(dòng)按鈕用于開(kāi)關(guān)的控制和狀態(tài)指示應(yīng)該是足夠的,但java程序的表現(xiàn)會(huì)因?yàn)g覽器的不同而異,因此,加入簡(jiǎn)單的開(kāi)/關(guān)按鈕和一個(gè)狀態(tài)文本窗,以適應(yīng)于更多的瀏覽器。imagebutton和開(kāi)/關(guān)按鈕將完成相同的控制功能,位圖和狀態(tài)窗完成相同的狀態(tài)指示功能而已。在創(chuàng)建圖形單元后,switchcontrol類(lèi)將創(chuàng)建一個(gè)狀態(tài)監(jiān)測(cè)線程。該線程接著進(jìn)入休眠模式,停留于read(),等待來(lái)自于tini應(yīng)用的狀態(tài)信息。當(dāng)線程向下運(yùn)行時(shí),imagebutton的位圖和狀態(tài)窗被刷新,接著又循環(huán)到程序的頂部,等待下一次的狀態(tài)字節(jié)。java程序事件線程驅(qū)動(dòng)actionperformed函數(shù),該函數(shù)在每次按下圖形按鈕后被調(diào)用。如果調(diào)用是由imagebutton觸發(fā)的,則它翻轉(zhuǎn)當(dāng)前狀態(tài),并向tini發(fā)出一個(gè)開(kāi)或關(guān)的命令。如果由開(kāi)/關(guān)按鈕觸發(fā),則它發(fā)出一個(gè)開(kāi)/關(guān)命令。imagebutton類(lèi)只是一個(gè)簡(jiǎn)單的采用awt(abstract window toolkit)組件編程的范例。
結(jié)論
采用tini實(shí)時(shí)環(huán)境、java程序和簡(jiǎn)單的繼電路電路,就可以實(shí)現(xiàn)遠(yuǎn)程控制閉合/關(guān)斷開(kāi)關(guān)。通過(guò)網(wǎng)絡(luò),可以在任何地點(diǎn)控制從照明燈到機(jī)床的各種設(shè)備。
tcp/ip相關(guān)文章:tcp/ip是什么
評(píng)論