Windows CE中的网络通信.docx
Windows CE中的网络通信摘要:讨论Windows CE所支持的两种基本通信技术,即串行通信和网络通 信,并通过Win32 API描述了基于Windows CE的平台如何建立各种串行连接和 网络连接。对于各种连接实现途径,指出其与桌面计算机的区别。1 Windows CE通信简介Windows CE是一个面向移动计算和嵌入式应用的操作系统,其突出的优点 是模块化、可定制、完备性、实时性、通信功能强大和基于Win32应用程序编 程接口。目前,随着运行于Windows CE平台的手持电脑(HPC)、掌上电脑 (PPC)、个人数字助理(PDA)的逐渐普及,许多谙熟Windows桌面平台的 Win32开发者开始转向为这些数据终端和移动设备开发应用软件。尽管Windows CE平台上的应用软件也基于应用编程接口 API,但Wndows CE API与Win32 API是有明显区别的,前者只是后者的一个子集,而且,为了满足不同设备的 硬件功能,Windows CE API还进行了许多特殊扩展。在这些扩展中最为人所关 注的是Windows CE平台上各种通信功能的实现方法。Windows CE对通信的支持是十分灵活的,可完成的通信任务包括:从网络 或台式机下载文件;基于Windows CE的设备之间的信息交换;发送和接收电子 邮件;向服务器发送数据;浏览Internet;阅读条形码等。为了实现这些不同 的通信要求,Windows CE能支持多种通信硬件,如串行电缆、红外线收发器, 无线收发器、调制解调器和条形码阅读器等。针对这些硬件,Windows CE支持 两种基本的通信技术:串行通信和网络通信。2 Windows CE中的串行通信串行通信要求收、发双方有直接的点对点的连接。通过串行电缆或红外线 收发器(即IR收发器)均可实现这种通信方式。从软件的观点来看,各种串行 通信设备都是用COM端口名来标识的(如COM1、COM2等)。在Windows CE 2.x中,COM端口被存贮在注册表的HKEY_LOCAL_MACHINEDrivers主键下,如 果系统中已经安装了某种串行设备,那么可以通过注册表的 HKEY_LOCAL_MACHINEActive主键来查看。基于COM端口的串行通信与文件的 读、写所使用的API函数是相同的。与桌面平台情况不同的是,当使用IR收发器时,Windows CE支持两种红 外串行通信途径。一种途径是将IR收发器当作串行电缆对待,称为raw IR方 式。“raw”的含义是指传送的数据未经任何方式的加工处理,收、发双方的应 用程序负责冲突检测和其它潜在问题的处理。分配给raw IR的COM 由原始设 备制造商(OEM)确定且列于注册表中。特别需要引起注意的是必须通过 EscapeCommfunction函数将该串口设置为IR模式(SETIR),而不是普通串行 模式(CLRID)。另一种途径是源于一种IrDA的简化串行通信方式,称为 IrComm方式。它允许应用程序采用与raw IR方式完全相同的方法去使用IrDA 网络协议。从编程者的观点来看,raw IR与IrCoinm两种方式最主要的区别在 于它们有不同的COM端口的分配。此外,对于IrConnn,也不必调用 EscapeCommFunction函数来指明相应串口为IR模式。无论是采用串行电缆的 普通连接方式,还是采用红外线收发器的raw IR或IrComm方式,在Windows CE的应用程序中实现串行通信的步骤均可描述如下:1)通过注册表确定需要翻开的COM端口;2)调用 CreateFile,用 IpFileName 设置 COM 端口名(如 COM1);HANDLE CreateFile (LPCTSTR 1pFileName, DWORD dwDesiredAccess );IpFileName为COM端口名指针,dwDesiredAccess为访问(读、写)模式。3)如果是raw IR方式,调用EscapeCommFunction,设置COM端口为IR 模式;BOOL EscapeCommFunction (HANDLE hFile, DWORD dwFunc);hFile为通信设备句柄,该句柄由CreateFile返回,dwFunc取值SETIR, 即串口为IR模式。4)调用SetCommTimeouts,设置通信暂停时间参数;BOOL SetCommTimeouts (HANDLE hFile, LPCOMMTIMEOUTS IpCommTimeouts);其中,IpCommTimeouts为用来设置时间参数的结构指针变量。5)调用ReadFile和WriteFile发送和接收数据;BOOL ReadFile (HANDLE hFile, LPVOID IpBuffer, DWORD nNumberOfBytesToRead);BOOL WriteFile (HANDLE hFile, LPCVOID IpBuffer, DWORD nNumberOfBytesToWrite);其中,hFile为读/写文件句柄,IpBuffer为读/写数据缓冲区指针, nNmnberOfBytesToRead为读/写数据字节数。6)调用 CloseHandle,关闭串口。BOOL CloseHandle (HANDLE hObject);上述步骤除第3步外,对三种串行通信方式都是相同的。3 Windows CE中的网络通信Windows CE的网络通信基于一个按层组织的网络堆栈(network stack), 如图1所示。网络堆栈实际上是Windows CE的一个组件,它负责对网络中的数据传输进 行处理,将来自于应用程序的数据分解成假设干小段,并为每小段加上相关地址 和段的分割信息,组成可以存贮转发的信息包(packets),信息包中的地址确 保数据到达最终的目的端点。访问网络堆栈有如下三种方式:第一种是 Winsock (端口套接字)方式。这是一个中间层的传输接口协议,WinSock负责 对建立的信息包的所有头信息细节进行处理,但可以不管其数据格式。Windows CE的网络通信都直接或间接地使用Winsocko采用IrDA协议实现基于红外线套 接字(Irsock)的客户/服务器网络通信是Windows CE平台的一个特色。第二 种为Winlnet API方式。Winlnet API是微软公司基于Win32平台的互联网函 数接口。Windows CE的Winlnet API对其进行了某些限制或扩展,它提供的高 级数据协议除了常见的超文本传输协议(HTTP)和文件传输协议(FTP)外,还 提供了对Internet密码协议SST和PCT的支持。API方式防止了直接使用 WinSock访问网络的操作,简化了网络编程。第三种为CIFS重定位器方式。 Windows CE通过对远程访问服务(RAS)客户的支持,允许基于Windows CE的设备与远程主机建立连接。这里针对Windows CE最常用的几种高层协议,讨论 其网络通信实现方法。3. 1发送ICMP请求ICMP (Internet Control Message Protocol)是一个网络层的 Internet 协议,用来通过其它主机了解有关IP服务的状况。典型的用法是发送ICMP请 求去测试某台主机是否连接到Internet (称为“Ping”操作)。其方法是通过 发送一个信息包到所访问的主机(IP地址),并等待其应答,从而确定该主机 是否可用。基本步骤描述如下:1)调用IcmpCreateFile,建立一个请求发送的句柄:HANDLE WINAPI IcmpCreateFile (VOID) : /该函数调用成功时.返回 ICMP句柄2)调用 IcmpSendEcho,请求 ICMP 应答;DWORD WINAPI IcmpSendEcho (HANDLE IcmpHandle, 指定由 IcmpCreateFile 翻开的 ICMP 句柄IPAddr DestinationAddress, 请求应答主机的 IP 地址LPVOID RequestData, 发送缓冲区所含的数据WORD RequestSize, 发送缓冲区的字节数LPVOID ReplyBuffer, 应答缓冲区DWORD ReplySize, 应答缓冲区的字节数DWORD Timeout 请求应答的等待时间.以毫秒为单位);3)调用 IcmpCloseHandle,关闭由 IcmpCreateFile 建立的 ICMP 句柄。BOOL WINAPI IcmpCloseHandle (HANDLE IcmpHandle);3. 2 利用 Winlnet 访问 HTTPWinlnet提供了一个开发Internet客户应用程序的工具集,与使用Socket 建立网络连接的方法相比,它简化了访问互联网络的操作细节。利用Winlnet 可连接到远程站点,访问HTML页面,通过FTP上传、下载文件或获取文件目录 清单等。Winlnet的Windows CE版本类似于桌面平台上的Winlnet,但有两个 重要的区别:一是在Windows CE中,大多数callback函数以同步方式处理, 只有 InternetReadFile 和 IntemetQuerryDataAvailable 具有同步和异步两种 操作方式;二是Windows CE默认支持Unicode码,所有Winlnet函数都要求宽 字符变量。通过Winlnet实现网络通信最常见的例子是利用HTTP协议访问Internet 站点上的HTTP页面。其处理过程与桌面平台上的情况是一致的:1)调用 InternetOpen,获取 Internet 句柄;2)调用InternetConnect,为给定站点建立一个会话句柄;3)调用HttpOpenRequest,翻开一个HTTP请求句柄;4)调用IlttpSendRequest,发送一个指定的请求到HTTP服务器;5)调用InternetReadFile,从被HttpOpenRequest所翻开的句柄中读数, 下载信息;6)调用 InternetClosellandle,关闭 Internet 句柄。4. 3访问远程文件系统为了访问远程文件系统,Windows CE支持CIFS, CIFS也称服务信息块重 定向器(SMB)。重定向器实际上是一个通过它能由一台计算机去获得对另一台 计算机访问的组件。重定向器组件基于Windows NTLM 12 SMB规格,因此,运 行于Windows CE的设备可以直接浏览基于Windows NT/9x机器上的文件资源。 应用程序通过Windows CE WNet API或通用命名协定(UNC)均可获得对重定向 器的使用。但区别于桌面平台的是Windows CE不支持驱动器字母名。另外,如 果使用WNet函数,必须有两个动态链接库安装在系统中,一个是Redir. dll, 另一个是NetBios. dllo使用WNet建立和中断网络连接的函数分别为 WNetAddConnection和WnetCancelConnection0如果要建立一个可用网络资源 列举表,需要执行如下步骤:1)调用WnetOpenEnum,创立一个网络资源或已有连接的列举句柄;2)调用WnetEnumResource,将列举的资源以结构数组的形式打包;3)列举所有资源表;4)调用WnetCloseEnum,关闭第一步创立的列举句柄。DWORD WNetCloseEnum (HANDLE hEnmn);3. 4远程访问服务(RAS)RAS是一个用于连接远端设备的基于软件的多协议路由器,也称为RAS客 户,对于桌面主机,那么称为RAS服务器。RAS应用程序常在设备端(客户)k 执行,并通过PPP/SLIP与服务器连接。WindowsCE对RAS客户提供了支持。尽 管有许多标准的Win32 RAS函数,但这里仅允许通过串行电缆或拨号Modem建 立点对点的连接。在Windows CE环境下,RAS 簿工程中包含有建立RAS连 接的必要信息,Windows CE将其存贮在注册表中。RAS 簿信息包括:拨打的 号码(含国家和地区代码)、当前连接的IP地址、用于建立连接的设 备类型。用RAS建立连接的步骤如下:1)确定呼叫的 号码;如果该号码不在 簿中,那么需要调用RasEnumEntries函数查找。2) RasDial建立连接;DWORD RasDial (LPCTSTR IpszPhonebook, 簿文件的路径和文件名 指针DWORD dwNotifierType, /RasDial 事件的句柄类型LPVOID IpvNotifier, /RasDial 事件的句柄IPHRASCONN IphRasConn指向连接句柄类型变量);该函数的参数设置与桌面平台上的设置不同,要求将IpszPhonebook设置 为 NULL, dwNotifierType 设置为 OxFFFFFFFFo3)当会话结束时,用RasHangUp终止连接。DWORD RasHangUp (HRASCONN hrasconn);