在这一讲中中,将讨论Symbian OS的通讯组件。必须强调的是,从一个游戏开发者的角度来看,通讯技术是非常重要的。 最后介绍如何接收补充的游戏数据。
通讯体系结构
智能电话的移动特性和通讯技术的飞跃发展决定了它们对通讯模块的需求。 全世界都在使用智能电话,但是每个国家或者地区可用的通讯服务可能会有很大的差异。 现有的服务和技术不断地发展,而且新的技术层出不穷。 这些事实就要求智能电话通讯模块具有灵活性和扩展性,因此Symbian OS的通讯体系结构是基于这些思想来设计的。 它由几个小的模块组成,并且支持可以在运行期间装载的可插入式模块。 而且通讯设置可以在系统不重新启动的情况下就进行更改。
Symbian OS 6.1版本支持多种通讯技术,图1中都作了介绍。 特定的智能电话的可用的技术取决于它的硬件解决方案。 例如诺基亚7650或者诺基亚3650没有串行的数据线,但是可以通过蓝牙技术支持串行通讯。
图1 Series 60通讯技术
Symbian OS的通讯体系结构基于三个通讯服务器:ETEL、C32和ESOCK。 服务器提供的通讯服务是异步操作,因此它们需要被封装到活动对象里。一个客户应用程序一般产生三个不同的活动对象:一个用于传送数据、一个用于接收数据还有一个用于应用程序端通讯引擎。通讯模块的关系如图2所示。
图2 Symbian OS的通讯组件
ETEL是一个电话通讯服务器,用于应用程序访问各种电话硬件和服务,例如GSM手机、模拟调制解调器和传真通讯服务。 这个服务器使用可动态装载的插入式模块--电话通讯服务器模块(TSYs),把硬件特定的信息转化为应用程序可理解的格式。 这个服务器的客户端应用编程接口定义在etel.h头文件中,它主要由RTelServer、RPhone、RLine和RCall类组成。
串行通讯服务器使用方法都是很相似的,不管是否使用了CSY模块。首先在初始化阶段,客户端加载所需要的驱动程序,打开服务器并且装载CSY模块。在实际的设备已经打开并且配置之后,服务器准备发送并接收数据。最后,需要释放所有的资源。 串行通讯服务器的客户端应用编程接口定义在c32comm.h头文件中,主要由RComm和RCommServ类组成。 下面的代码是一个红外线串行通讯初始化阶段的示例。
通讯体系结构
智能电话的移动特性和通讯技术的飞跃发展决定了它们对通讯模块的需求。 全世界都在使用智能电话,但是每个国家或者地区可用的通讯服务可能会有很大的差异。 现有的服务和技术不断地发展,而且新的技术层出不穷。 这些事实就要求智能电话通讯模块具有灵活性和扩展性,因此Symbian OS的通讯体系结构是基于这些思想来设计的。 它由几个小的模块组成,并且支持可以在运行期间装载的可插入式模块。 而且通讯设置可以在系统不重新启动的情况下就进行更改。
Symbian OS 6.1版本支持多种通讯技术,图1中都作了介绍。 特定的智能电话的可用的技术取决于它的硬件解决方案。 例如诺基亚7650或者诺基亚3650没有串行的数据线,但是可以通过蓝牙技术支持串行通讯。
图1 Series 60通讯技术
Symbian OS的通讯体系结构基于三个通讯服务器:ETEL、C32和ESOCK。 服务器提供的通讯服务是异步操作,因此它们需要被封装到活动对象里。一个客户应用程序一般产生三个不同的活动对象:一个用于传送数据、一个用于接收数据还有一个用于应用程序端通讯引擎。通讯模块的关系如图2所示。
图2 Symbian OS的通讯组件
ETEL是一个电话通讯服务器,用于应用程序访问各种电话硬件和服务,例如GSM手机、模拟调制解调器和传真通讯服务。 这个服务器使用可动态装载的插入式模块--电话通讯服务器模块(TSYs),把硬件特定的信息转化为应用程序可理解的格式。 这个服务器的客户端应用编程接口定义在etel.h头文件中,它主要由RTelServer、RPhone、RLine和RCall类组成。
串行通讯服务器
串行通讯服务器(C32)为它的客户端提供一个串行端口应用编程接口。这个服务器使用通讯服务器插入式模块(CSYs)处理实际的通讯协议。Symbian OS提供多个CSY模块,例如处理RS232和红外线串行通讯。应用程序开发者还可以使用串行协议模块应用编程接口来开发自定义CSY模块,自定义CSY模块定义在cs_port.h头文件中。串行通讯服务器使用方法都是很相似的,不管是否使用了CSY模块。首先在初始化阶段,客户端加载所需要的驱动程序,打开服务器并且装载CSY模块。在实际的设备已经打开并且配置之后,服务器准备发送并接收数据。最后,需要释放所有的资源。 串行通讯服务器的客户端应用编程接口定义在c32comm.h头文件中,主要由RComm和RCommServ类组成。 下面的代码是一个红外线串行通讯初始化阶段的示例。
// Load device drivers TInt err = User::LoadPhysicalDevice( _L("EUART1") ); if ( err != KErrNone && err != KErrAlreadyExists ) User::Leave( err ); err = User::LoadLogicalDevice( _L("ECOMM") ); if ( err != KErrNone && err != KErrAlreadyExists ) User::Leave(err); // Start serial communications server of type RCommServ User::LeaveIfError( iServer.Connect() ); // Load CSY module for IrComm User::LeaveIfError( iServer.LoadCommModule( _L("IRCOMM") ) ); // Open port of type RComm User::LeaveIfError( iPort.Open( iServer, _L(""IRCOMM::0""),ECommExclusive ) ); |
上面的示例代码可以通过加载ECUART CSY模块来从IRCOMM模式切换到RS232,同时使用COMM:0端口代替IRCOMM:0。 RComm::Open中的ECommExclusive枚举防止其他的RComm客户端使用这个端口。
可以使用RComm:Write和RComm::Read方法向端口写数据和从端口读取数据,它们都是使用一个TRequestStatus和一个描述符作为参数。 当传递完成时,生成一个事件作为活动对象,这个事件的TRequestStatus被传送到传递方法,这就使活动对象的RunL被调用。描述符参数通常是一个8位描述符,因此如果被传送的数据是文本的话,这个描述符需要被转换为Unicode。 数据传送方法可能还使用其它的一些参数,指定数据传送的最大长度或者时间等特征。
对于应用程序来说,使用红外线进行通讯是一个很简易的方法,但是支持IrComm的主要原因便于以前的应用程序的转化,使之可以更容易地使用串行端口来进行通讯。和其它IrDA协议相比,IrComm不利的一面是它不提供所有的IrDA服务。 例如,使用IrComm的最大数据传送速度只有9600比特/秒,这显然对于众多传送大量数据的终端游戏来说是不够快的。