本文以Microchip公司的TCP/IP协议栈为基础,讨论XMLHttp对象在嵌入式Web实时系统中的具体应用方法。所选用的测试电以PIC18F4 52单片机与以太网接口芯片RTL8019AS为核心,嵌入式HTTP服务器所有Web相关文件保存在系统外部EEPROM存储器中。
创建XMLHttp对象后最重要的操作是设置onreaclystatechange属性(非IE中为onload),为其绑定异步回调函数。当XMLHttp对象状态变化时,所指定的回调函数将自动处理服务器回应数据。
该函数可由客户端Web中的控制命令按钮点击事件onClick触发调用,它调用CreateXMLHttpObj创建XMLHttp对象,设置回调函数,然后以GET方法对HTTP服务器发起请求。函数的第一个参数URL可以是控制命令串,也可以是CGI、HTML及其他各种Web文件名。如果要求在客户端Web中显示HTTP服务器返回信息,则需要设置第二个参数Html_id。例如,在发送控制命令点亮系统中某个灯后,要求将服务器返回的该灯的当前状态显示在客户端。所设置的参数Html_id是客户端Web页中的某个容器的ID,返回信息将显示到该容器中。如果不需要服务器回应文本信息,或对回应信息不予处理,可将该参数设为空。函数具体实现如下:
Send_Control_CMD在每次被涮用时首先创建一个通用对象Obj,然后创建XMLHttp对象,并将其保存在自定义的Obj.xmlhttpobj属性中,随后调用XMLHttp对象的open方法与send方法,调用格式为:
其中open方法的bstrMethod参数为HTTP请求的方法,例如所选择的“GET”方法,bstrUrl参数为请求的URL地址,在本文讨论的嵌入式Web实时系统中,它用来表示控制命令串,譬如用来启动外部直流电机的控制命令串“0?1=MOTOR”,varAsync参数用于指定当前请求是否为异步方式,默认为true,最后两个参数提供帐号密码,用于服务器验证。通过open方法初始化XMLHttp对象以后,要用send方法发送请求到HTTP服务器并等待回应。由于XMLHttp对象被设为异步模式,send调用将不会被阻塞,XMLHttp对象的回调函数mReadyCallBack将在HTTP服务器回应时异步执行。
由于Web页中可能有多个不同按钮要发送不同的控制命令,为简化程序设计且便于管理对象,可将每一按钮调用该函数创建的xMLHttp对象统一保存到全局对象数组ObjArray中。对象数组ObjArray由Web页中的Javascript脚本定义,即:
当ObjArray中的任意一个XMLHttp对象的就绪状态变化时,将触发对mReadyCallBack函数的异步调用,该函数将通过for循环扫描对象数组ObjArray,对HTTP服务器当前回应的对象进行处理。通过XMLHttp对象的responseText属性可获取服务器回应信息,通过Web容器的inner HTML属性可将回应信息显示到Web页中。在处理完当前XMLHttp对象以后,mReadyCallBack最终将用delete该对象所占用的资源。如果调用Send_control_CMD函数时第2个参数为空,则表示发出控制命令后不需要处理服务器回应文本信息,回调函数仅仅需要该对象所占用的资源。