基于SX52的嵌入式Web服务器的快速实现
扫描二维码
随时随地手机看文章
随着互联网的日益普及,信息共享的程度不断提高,网络仪表及网络控制设备的流行逐渐成为趋势。如何通过互联网共享以单片机应用系统为中心的小型嵌入式设备的信息,成为当今电子界的热门话题。传统的互联网应用以PC为中心。如今,互联网应用正在转到以嵌入式设备为中心。用单片机实现嵌入式互联网方案的技术难点是:如何利用单片机本身有限的资源对信息进行TCP/IP协议处理,使之变成可以在互联网上传输的IP数据包。目前解决这个问题有两种方案:一种是PC网关+专用网,缺点是要增加布线和第三方协议转换软件;另一种是32位MCU+RTOS,弊端是开发难,成本极高。而用软件方法实现网络协议比采用集成网络协议的芯片,具有节省空间、降低成本的优点,更重要的是可以随意配置甚至修改各种协议,且能通过软件升级方式跟随未来的发展。八位单片机目前仍占有很大的市场份额,而通过美国Ubicom公司的SX52微控器进行网络控制更具其独特优势,主要体现在:(1)速度快,在100MHz频率下能达到100MIPS;(2)现成的协议模块供使用,即使对不熟悉网络协议的开发人员也能简单套用。虽然其它八位单片机也能用软件实现精简的TCP/IP协议,如PICl6C76等,但上面所说两大优点是采用SX52MCU的充分理由。套用成熟的现有程序是最具效率的开发办法,这也是避免目前国内普遍存在的低水平开发的有效途径。虽然目前还没有单独的TCP/IP软件虚拟模块提供,但在演示板程序的基础上,可以采用其成功的网络协议模块和一些适用于小型嵌入系统的做法构筑现场控制Web服务器。
1SX52控制器简介
SX52MCU与PIC单片机有很多地方相似,它也采用RISC指令系统,带可擦写上万次的片上Flash程序存储器,具在系统编程等。SX52的流水线指令操作可1个时钟周期执行一条指令。没有中断嵌套使中断响应时间固定为3个时钟周期,适用于一些要求强实时性的系统。5个可驱动30mA电流的I/O口可自由设置为TI'L或CMOS输入电子,262×8bit的SRAM数据空间,4096×12bit的EE/Flash程序空间。内部集成有模拟比较器、定时器、捕捉/PWM比较器、欠压检测、看门狗等多种功能部件。具有三个特殊器件配置寄存器,其长度分别为12位,(FUSE、FUSEX、DEVICE),硬件配置灵活多样,加密性能好,能有效地防止产品被盗版或仿制的可能性。已提供的软件虚拟模块有UART、A/D、DTMF、PWM、FSK、IRDA、VC等众多常用功能块。应用微控器用软件方法替代硬件功能是一大特色,可以避免一些常用功能的重复开发。
2联网的实现
对于资源紧缺的小型嵌入系统,一般都要对TCP/IP协议族做一些精简处理。WingPoon等提供的演示板程序集合了如下模块:ARP、DHCP、ICMP的echo响应,精简的TCP/IP、HTYP、SMTP等;还可以看到应用了I2C以及∑-△A/D的软件虚拟模块。由于程序空间的限制,当实现DHCP时,只能用SMTP。底层采用8019AS网络接口芯片。网页通过12C存储于24C256中,中断程序可用于A/D虚拟模块的计数及TCP/IP协议族的各个定时器。
系统设计主程序流程如图1。当IP包头有选项或存在分片时,此包被简单丢弃而不处理。TCP能同时打开两个连接,连接1用于SMTP(套接字用Bank3,TCBI_BANK),连接2用于HTTP(套接字用Bank4,TCB2_BANK)。TCP不使用滑动窗口的流量控制,发送时每发一个分组就停下来等待确认。程序中发送的数据长度放在变量Tcp2Un-AckMSB、Tcp2UnAckLSB中。在接收模块TcpProcPktln中只有接收到Ack包后才复位这两个变量;而发送模块Tcp·Transmit中只有这两个变量为零才允许发送下一段数据,否则检查Tcp2TimeMSB是否超时;如是则重发。TCP接收模块TcpProcPktln检查端口号及32序列号是否与套接字内的相符,如不符则可能是收到重发的包,TCP简单地发Ack的空包并丢弃本包;否则处理本包数据同时清除上次发送数据长度变量Tcp2UnAckMSB、Tcp2UnAckLSB,以便在TcpTransmit中能发送下一段数据。
子模块TcpAppTxBytes、TcpAppRxData是TCP处理发送及接收数据的模块。用户如不变更原TCP/IP的精简设计,只要修改这两个模块就能实现自己特定的应用功能。
16位校验和Checksum的计算对于很少或没有数据缓冲的系统来说并不容易,一般有两种方法处理。一是在TCP头的检验和域放任意一个16位数,数据发送的同时计算Checksum,然后在数据最后附加2个字节以保证之前任意取值的正确。这种方法的缺点是要让接收的应用程序忽略最后2个字节的数据,可能导致许多程序的运行异常。二是先对产生的数据计算Checksum,但不发送,然后再产生同样的数据加上正确的校验和发送。显然要求系统产生重复的数据有时是不现实的,利用网卡芯片8019的缓冲可以解决这一问题,将数据写入8019的同时计算Checksum,最后将Checksum写入8019后调用NicSendTxFrame才真正发送数据。
3Web服务器实现
TCP在Web服务器下采用的状态转移见图2。
(1)服务器在closed状态下主动打开端口80进入listen状态;
(2)经过3次常规握手后进人establish的数据传送状态;
(3)服务器发完数据发fin关闭请求进入finwait-1状态;
(4)收到对方发来的Ack后进入finwait-2状态;
(5)收到对方发来的fin关闭请求后回送Ack回到closed状态。
考虑HTYP常用的abs_path形式的统一资源标识符URI,在资源紧缺的系统中实现完整的文件结构如"imagesledon.gif''的查询与定位,如果采用一般计算机程序中常用的方法则代价很高。一种简便有效的方法是计算URI各字符的ASCII码之和。网页存放于SX52的外部EEPROM中。假设利用前512字节存放最大256个网页的地址,绝对路径"index.btm"的不带进位ASCII码之和为#$be,可以到2x#$be+#$17c的地方找到要发送回客户浏览器的数据存放地址;下载网页到服务器时也用一个程序按上述方法将各网页排好即可,当然网页前都加了一段HTYP1.0的标准响应头信息。这正是Ubicom公司提供的E2File程序所做的,也可以自己编写一个这样的程序以实现HTFP1.1的除GET、POST方法外的其它方法或扩展功能。[!--empirenews.page--]
除了用JavaApplet实现动态网页外,利用post方法也可与服务器交互。例如通过IE浏览器用复选框按钮控制并显示一组灯的开与关的基本Web控制,其HTML网页的提交表单FORM内应该包含有的类似语句,其中0~n为欲控制灯的编号,name的取值为一位数字或字符,有利于节省SX52的查询匹配程序空间,E2File程序将网页中如下显示灯的状态的HTML超链接语句中的"?"编号为非ASCII字符#$f0~#$fn等下载存储到服务器的EEPROM中。当n用POST方法发送数据给服务器时,SX52服务器计算两个空格间的abs_path形式的URI的ASCII字符之和后到相应EEPROM中,用上述下载网页的计算方法找到该网页的地址后,跳过HTTP的请求头匹配l=0&…l=n表示复选框被选中的数据并对相应编号的灯开关后,返回该网页给IE时会根据实际灯的状态将EEPROM中存储网页的非ASCII字符#$f0~#$fn退换为ASCII字符"n"或"f"。这样IE就能正确地通过超链接再次与服务器交互(GET方法),下载显示ledon.gif或ledof.gif显示实际灯的状态了。而要在IE上正确显示现场某个控制变量的值时,同样可以将n位显示数值编号为非ASCII字符#$f0#$fl…#$fn的形式存储到服务器中,SX52服务器端先将实际的数值转换为BCD码后再用对应的ASCII字符将#Sf0#$f1…#$fn替换返回,从而能在浏览器端显示服务器端控制变量的变化。国内用户使用的北京革新提供的开发演示板程序较充分地提供了常用的Intemet网络协议软件虚拟模块,也提供了一个基本可实际应用的Web演示控制,只要做较少改动就可以用于实际控制中。不过它只能一次控制一个灯的开关,且任何人都可以轻易地更改。现要求一次能控制所有的灯,但需要在IE浏览器上输入密码123abc方可生效。程序修改如下:
(5)在模块TcpAppRxData的分支:lookforl的开头增加以下语句:
当然以上密码通过IE仍以明文传送,不安全,但是它可以通过常用的IE浏览器操作,不需要专用的客户端软件。这适用于大企业,它们有局域网,电脑上只能用固定的几种软件。当然编写客户端软件加入加密解密算法来适应各种应用环境也是容易实现的。用SX52构建各种小型的现场控制Web服务器只要合理利用相应的网络协议软件虚拟模块,参照演示板的做法在应用子模块TcpAppTxBytes、TcpAppRxData中对发送及接收数据按照自己特定的要求做处理即可。它还可以通过UDP的方式同时与客户端软件传送语音或视频数据流,只要增加很少的外围接口电路并改动相应的UDP处理模块UDPProcPktIn即可。而如果未来协议的更新也只要下载最新的程序替换即可,开发人员单独修改特定协议模块的一些实现方式如增加滑动窗口的TCP/IP等也比重新编写一个完整的协议族远为轻松。