利用TINI平台设计网络On/Off开关(图)
系统软件概述
com.dalsemi.tininet.http.httpserver类允许开关控制应用程序充当简单的web服务器,将java程序传递给远端主机。在被主机内部浏览器执行后,该java程序就建立了一个与tini应用程序交换命令和状态的双向tcp连接,也为显示控制和状态提供了一个图形用户界面。整个软件系统如图1所示。
系统硬件概述
在图2中,基于tinim390/4002模板的开/关控制电路构成了该接口。tinim390/400模板提供了ethernet网络接口能力,以及通过引脚p5.0(其他引脚也可以等效工作)控制开关。n沟道mosfet开关切换流过继电器的电流,控制继电器。用户可以根据继电器和fet的大小要求,供给不同的电压和电流;如果不需要隔离外部电路与tini模板的电源,则可以去掉继电器。在开关状态改变时,二极管抑制继电器线圈的感生电压。为了实现某些新的服务,如网络开关控制。
tini开关控制应用
由四个类构成了该应用的开关控制和web服务器接口。powerswitch类通过采用tini类中的com.dalsemi.system.bitport应用程序接口类,直接与硬件接口。webworker类直接来自maxim的software developers kit(tini sdk)中的tiniwebserver实例,负责为到来的http连接提供服务。switchworker类管理java程序和tini应用之间的所有命令和状态通信。tiniwebserver类通过绑定各个类的操作,来实现本应用。
powerswitch类是一个连接硬件的接口,在其构造器内为引脚p5.0创建一个bitport目标。在该类中,可以执行两种函数,开函数设定的引脚端口状态是接通继电器线圈的电压;而关函数通过清零端口状态,来断开继电器线圈的电压。图2中的单刀双掷(spdt)继电器能够工作于常闭或常开位置,即在这两种位置之间切换外部电压源。开、关函数假设电路工作于常开状态,且必须能够被改变至常闭电路状态。为了指示开/关是否对应于bitport的置位或清零函数,则在该类中引入了一个外部的boolean变量(invert),另一个函数(setinvert)要求用来初始化invert变量。图2所示的硬件图描述的是常开电路。 webworker类提供了网络和应用之间的接口。它简单地建立和驱动一个目标(com.dalsemi.tininet.http.httpserver),该目标依次产生线程,为每个到来的http连接提供服务。该类取自上述tiniwebserver实例,无须作任何修改,可以在网络上的任何地方接入。httpserver能够提示输入密码,或者接受任何其他形式的控制,仅允许那些授权的用户接入。
通过将网络和硬件接口组合在一起(图3所示),tiniserver允许远程开关控制。例如,drive()函数通过创建一个webworker线程和网页“index.htm1”,建立此web服务器。网页的主要目的是为了在主机工作站上下载并执行该java程序。如果提示网页仅包含静态信息,该应用就没有必要创建网页。提示网页只需要与包含java程序的文件目录一起,拷贝至web服务器的根目录下即可。
codebase是一个在每个tini芯片组设计中可以改变的网页参数。java程序使用该信息,以返回连接至某个独立的服务器插件中的tini应用程序。可以创建并上传一个定制的网页至任何一个安装在现场的tini芯片组参考设计。一个简单的方法是由应用程序在每次运行时,创建该网页。通过三次写操作,createindexpage函数可以创建文件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());
第一次和第三次写操作是将网页的静态部分拷贝至文件中,而第二次写操作是将ip地址拷贝至文件的codebase部分。在应用程序建立web服务器和创建网页后,就启动了web服务器。它创建一个服务器插件,用来处理来自下载java程序的进入连接,并且在java程序每次连接tini应用时,调用serviceconnection函数。
serviceconnection函数创建了一个新例程switchworker,并将这个插件传给该类。switchworder构造器创建一个新的线程,以处理主机java程序和tini应用之间的连接。serviceconnection函数也处理下一个进入连接,接着将控制传给drive函数。
switchworker类管理java程序和webserver之间的所有通信,如图4所示,在连接被断开之前,它不断地循环,执行下列步骤:
停留在read(),等待一个来自java程序的命令字节;
如果命令字节为0,则断开开关;如果为1,则闭合开关;
读入当前开关状态,回传至java程序。
通过分配每个命令字节的低7位来表示不同开关的状态,如图5所示,该运算法则可以适用于更多的开关。保留最高位,用来指示只读操作。该运算法则也可以被扩展,以允许在同一时刻多个java程序连接至单个tini webserver应用。switchworker只是简单地保持一个“监听向量”。每次java程序发出一个修改开关状态的命令,webserver就将其状态回传至当前与之连接的所有java程序。
主机java程序
tini类中的com.dalsemi.tininet.http.httpserver类是一种小巧而快速的类,但仅支持http get操作。由此产生的数据只能从tini应用到主机单向传递。然而,该应用要求双向数据传输。命令由主机发送至tini webserver,而状态由webserver发送至所有相连的主机。主机和tini应用之间的通信无协议开销,单字节命令和单字节状态允许极快的控制和状态响应。
主机java程序包括两个类,主类(switchcontrol)处理主机端的网络通信和创建网页上所有的显示图形单元,见图6;另一个类(image button)创建一个图形拨动按钮,显示对应于按钮状态的两种位图之一,见图7。拨动按钮用于开关的控制和状态指示应该是足够的,但java程序的表现会因浏览器的不同而异,因此,加入简单的开/关按钮和一个状态文本窗,以适应于更多的浏览器。imagebutton和开/关按钮将完成相同的控制功能,位图和状态窗完成相同的状态指示功能而已。在创建图形单元后,switchcontrol类将创建一个状态监测线程。该线程接着进入休眠模式,停留于read(),等待来自于tini应用的状态信息。当线程向下运行时,imagebutton的位图和状态窗被刷新,接着又循环到程序的顶部,等待下一次的状态字节。java程序事件线程驱动actionperformed函数,该函数在每次按下图形按钮后被调用。如果调用是由imagebutton触发的,则它翻转当前状态,并向tini发出一个开或关的命令。如果由开/关按钮触发,则它发出一个开/关命令。imagebutton类只是一个简单的采用awt(abstract
window toolkit)组件编程的范例。
结论
采用tini实时环境、java程序和简单的继电路电路,就可以实现远程控制闭合/关断开关。通过网络,可以在任何地点控制从照明灯到机床的各种设备。
tcp/ip相关文章:tcp/ip是什么
评论