提出一種基于TINI平臺(tái)的網(wǎng)絡(luò)ON/OFF開(kāi)關(guān)系統(tǒng)設(shè)計(jì)方案,介紹以D S 8 0 C 4 0 0 單片機(jī)為核心的系統(tǒng)硬件構(gòu)成和基于T I N I 運(yùn)行環(huán)境的應(yīng)用程序設(shè)計(jì)方法。該方案可以實(shí)現(xiàn)網(wǎng)絡(luò)開(kāi)關(guān)的開(kāi)關(guān)控制。
引言
為了達(dá)到利用Internet強(qiáng)大的網(wǎng)絡(luò)功能,實(shí)現(xiàn)遠(yuǎn)程控制的目的,需要研究合理的網(wǎng)絡(luò)接入方案。利用基于TINI平臺(tái)的嵌入式系統(tǒng),搭建不同設(shè)備接入計(jì)算機(jī)網(wǎng)絡(luò)的橋梁。利用嵌入式系統(tǒng)強(qiáng)大的軟硬件功能,可以支持不同的設(shè)備,實(shí)現(xiàn)接入方案的通用性。由于嵌入式系統(tǒng)具備較好的數(shù)據(jù)處理能力,不僅可以作為簡(jiǎn)單的網(wǎng)絡(luò)接口,還可以擴(kuò)展接入設(shè)備的網(wǎng)絡(luò)功能。
本次設(shè)計(jì)方案,IP網(wǎng)絡(luò)繼電器所需的TCP/IP棧和本地控制全部可由TINI平臺(tái)提供。JAVA運(yùn)行環(huán)境極大地降低了這項(xiàng)任務(wù)的復(fù)雜性,利用它可以實(shí)現(xiàn)通過(guò)網(wǎng)絡(luò)遠(yuǎn)程訪問(wèn)和控制小型傳感器和執(zhí)行器。本次設(shè)計(jì)的IP ON/OFF開(kāi)關(guān),采用一個(gè)簡(jiǎn)單的繼電器和微控制器DS80C400構(gòu)建,它還可以延伸到其他遠(yuǎn)程監(jiān)視和控制應(yīng)用中。本電路由一個(gè)成為T(mén)INIWebServer的應(yīng)用進(jìn)行控制,它直接由TINI運(yùn)行環(huán)境執(zhí)行,applet服務(wù)于主工作站,為了命令和狀態(tài)返回到TINI運(yùn)行環(huán)境而打開(kāi)雙向通信,并且顯示一個(gè)用于遙控繼電器的圖形用戶界面。
一、系統(tǒng)軟件概述
Com.dalsemi.tininet.http.HTTPServer類(lèi)屬于JAVAKIT里的一個(gè)擴(kuò)展類(lèi),它允許開(kāi)關(guān)控制應(yīng)用程序充當(dāng)簡(jiǎn)單的web服務(wù)器,其唯一的目的是將applet傳遞給遠(yuǎn)端主機(jī),在被主機(jī)內(nèi)部瀏覽器執(zhí)行后,該applet就建立了一個(gè)于TINI應(yīng)用程序交換命令和狀態(tài)的雙向TCP連接,它也為顯示控制和狀態(tài)提供了一個(gè)圖形用戶界面。圖1描述了整個(gè)軟件系統(tǒng)的原理圖。

圖1 系統(tǒng)軟件原理圖
二、系統(tǒng)硬件概述
在圖2中,基于DS80C400芯片的ON/OFF控制電路構(gòu)成了開(kāi)關(guān)接口。DS80C400芯片提供了以太網(wǎng)接口能力,以及通過(guò)引腳P5.0(其他引腳也可以等效工作)控制開(kāi)關(guān)。N溝道MOSFET通過(guò)開(kāi)關(guān)流過(guò)繼電器的電流,來(lái)控制繼電器。用戶可以根據(jù)繼電器和FET的大小要求,供給不同的電壓和電流;如果不需要隔離外部電路于TINI驗(yàn)證模塊的電源,則可以去掉繼電器。在開(kāi)關(guān)狀態(tài)改變時(shí),二極管抑制繼電器線圈的感生電壓。為了可能實(shí)現(xiàn)某些新的服務(wù),如網(wǎng)絡(luò)開(kāi)關(guān)控制,在TINI芯片組參考設(shè)計(jì)中,采用基于標(biāo)準(zhǔn)的因特網(wǎng)技術(shù),集成了所需要的軟硬件組件。

圖2 系統(tǒng)硬件原理圖
三、網(wǎng)絡(luò)開(kāi)關(guān)控制原理
由四個(gè)類(lèi)構(gòu)成了該應(yīng)用的開(kāi)關(guān)控制和web服務(wù)器接口部分。Power-Switch類(lèi)通過(guò)采用TINI類(lèi)中的com.dalsemi.system.BitPort API類(lèi),直接接口至硬件。WebWorker類(lèi)直接來(lái)由Software Developer’s Kit (TINI SDK)中的TINIWebServer,負(fù)責(zé)為到來(lái)的HTTP連接提供服務(wù)。SwitchWorker類(lèi)管理applet和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ù),ON函數(shù)設(shè)定的引腳端口狀態(tài)是接通繼電器線圈的電壓;而OFF函數(shù)通過(guò)清零端口狀態(tài),來(lái)斷開(kāi)繼電器線圈的電壓。在圖2中的單刀雙擲(SPDT)繼電器能夠工作于常閉或常開(kāi)位置,即在這兩種位置之間切換外部電壓源。ON和OFF函數(shù)假設(shè)電路工作于常開(kāi)狀態(tài),且必須能夠被改變至常閉電路狀態(tài)。為了指示ON/OFF是否對(duì)應(yīng)于BitPort的位置或clear函數(shù),則在該類(lèi)中引入了一個(gè)外部的布爾變量(invert)。另一個(gè)函數(shù)(setInvert)要求用來(lái)初始化invert變量。硬件圖描述的是常開(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,無(wú)須作任何修改,可以在網(wǎng)絡(luò)上的任何地方接入,HTTPServer能夠提供輸入密碼,或者接受任何其他形式的控制,僅允許那些授權(quán)的用號(hào)接入。
通過(guò)將網(wǎng)絡(luò)和硬件接口組合在一起(圖3所示),TINIWebServer允許遠(yuǎn)程開(kāi)關(guān)控制。例如,drive()函數(shù)通過(guò)創(chuàng)建一個(gè)WebWorker線程和網(wǎng)頁(yè)“index.html”,建立此web服務(wù)器,網(wǎng)頁(yè)的主要目的是為了在主機(jī)工作站上,下載并執(zhí)行該applet。如果提示網(wǎng)頁(yè)僅包含靜態(tài)信息,該應(yīng)用就沒(méi)有必要?jiǎng)?chuàng)建網(wǎng)頁(yè)。該索引只需要包含applet的jar文件一起,拷貝至web服務(wù)器的根目錄下即可。

圖3 網(wǎng)絡(luò)與硬件接口連接流程
CODEBASE是一個(gè)在每個(gè)TINI芯片組設(shè)計(jì)中可以改變的網(wǎng)頁(yè)參數(shù)。Applet使用該信息,以返回連接至某個(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.length ());
第一次和第三此寫(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)自下載applet的鍵入連接,并且在applet每次連接TINI應(yīng)用時(shí),調(diào)用serviceConnection函數(shù)。
serviceConnection函數(shù)創(chuàng)建了一個(gè)新例程SwitchWorker,并將這個(gè)插件傳給該類(lèi),SwitchWorker構(gòu)造器創(chuàng)建一個(gè)新的線程,以處理主機(jī)applet 和TINI應(yīng)用之間的連接,SwitchWorker 函數(shù)也處理下一個(gè)進(jìn)入連接,接著將控制傳給drive函數(shù)。
SwitchWorker類(lèi)管理applet和Web服務(wù)器之間的所有通信(圖4),在連接被斷開(kāi)之前,它不斷地循環(huán),執(zhí)行下列步驟:
1) 停留在read(),等待一個(gè)來(lái)自applet的命令字節(jié);
2) 如果命令字節(jié)為0,則斷開(kāi)開(kāi)關(guān);如果為1,則閉合開(kāi)關(guān);
3) 讀入當(dāng)前開(kāi)關(guān)狀態(tài),回傳至applet。

圖4 applet與web服務(wù)器通信狀態(tài)圖
通過(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è)applet連接至單個(gè)TINI web服務(wù)器應(yīng)用。SwitchWorker只是簡(jiǎn)單地保持一個(gè)“監(jiān)聽(tīng)向量”(” vector of listerners”)。每次applet發(fā)出一個(gè)修改開(kāi)關(guān)狀態(tài)的命令,web服務(wù)器就將其狀態(tài)回傳至當(dāng)前之連接的所有applet。

圖5 網(wǎng)絡(luò)開(kāi)關(guān)控制流程圖
將applet應(yīng)用在主機(jī)上,是因?yàn)樗峁┝艘惶棕S富的、用于顯示控制和狀態(tài)的圖形對(duì)象以及允許雙向通信。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 web服務(wù)器,而狀態(tài)由web服務(wù)器發(fā)送至所有相連的主機(jī)。主機(jī)和TINI應(yīng)用之間的通信無(wú)協(xié)議開(kāi)銷(xiāo),單字節(jié)命令和單字節(jié)狀態(tài)允許極快的控制和狀態(tài)響應(yīng)。
主機(jī)applet包括兩個(gè)類(lèi):主類(lèi)(SwitchControl)處理主機(jī)端的網(wǎng)絡(luò)通信和創(chuàng)建網(wǎng)頁(yè)上所有的顯示圖形單元(圖6);另一個(gè)類(lèi)(ImageButton)創(chuàng)建一個(gè)圖形撥動(dòng)按鈕,顯示對(duì)應(yīng)于按鈕狀態(tài)的兩種位圖之一。撥動(dòng)按鈕用于開(kāi)關(guān)的控制和狀態(tài)指示應(yīng)該是足夠的,但applet的表現(xiàn)會(huì)因?yàn)g覽器的不同而異。因此,加入簡(jiǎn)單的ON/OFF按鈕將完成相同的控制功能,位圖和狀態(tài)窗完成相同的狀態(tài)指示功能而已。

圖6 SwitchControl控制流程圖
在創(chuàng)建圖形單元后,SwitchControl類(lèi)將創(chuàng)建一個(gè)狀態(tài)監(jiān)測(cè)線程。該線程接著進(jìn)入休眠模式,停留于讀命令狀態(tài),等待來(lái)自于TINI應(yīng)用的狀態(tài)信息。當(dāng)線程向下運(yùn)行時(shí),ImageButton的位圖和狀態(tài)窗被刷新,接著又循環(huán)到程序的頂部,等待下一次的狀態(tài)字節(jié)。Applet事件線程驅(qū)動(dòng)actionPerformed函數(shù),該函數(shù)在每次按下圖形按鈕后被調(diào)用,如果調(diào)用由ImageButton或ON/OFF按鈕觸發(fā),則它翻轉(zhuǎn)當(dāng)前狀態(tài),并向TINI發(fā)出一個(gè)開(kāi)或關(guān)的命令,ImageButton類(lèi)只是一個(gè)簡(jiǎn)單的采用AWT(Abstract Window Toolkit)組件編程的范例。
四、結(jié)論
由上述可知,采用TINI運(yùn)行環(huán)境,JAVA程序和簡(jiǎn)單的繼電器電路,實(shí)行遠(yuǎn)程控制ON/OFF開(kāi)關(guān)時(shí)非常容易的。挑選合適的現(xiàn)有電路元件使得許多應(yīng)用成為可能,可以控制任何事物(從任何位置的網(wǎng)絡(luò)接入),從照明燈到任何工業(yè)設(shè)備。
參考文獻(xiàn)
1 DS80C400 Network Microcontroller 1999
2 High-Speed Microcontroller User Guide: DS80C400Supplement 1999
3 Exploring Tiny InterNet Interface 1999
4 The TINI Specification and Developer Guide 1999