基于Nokia S60的游戏开发之五
发布时间:2006-10-14 3:13:39   收集提供:gaoqian
  在这一讲中中,将讨论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类组成。

  串行通讯服务器

  串行通讯服务器(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比特/秒,这显然对于众多传送大量数据的终端游戏来说是不够快的。
  套接字服务器

  套接字服务器(ESOCK)提供一个使用套接字的通讯协议的接口。 对于所有的协议和指定协议行为,客户端应用编程接口都是相同的。 套接字服务器使用TCP/IP、IrDA和蓝牙这些协议模块,它们可在运行期间动态装载。 一个协议模块可能包含多个协议。 例如IrDA模块可能包含原始的IrMUX、IrTinyTP、IrLAP、IrLMP和IrObex协议。 对应于TSY和CSY模块的公共协议模块可以由应用程序开发者开发。

  套接字服务器的客户端应用编程接口的主要的类是RSocketServ和RSocket。 可以看到它们与RCommServ和Rcomm很相像。 RSocketServ处理一个服务器的会话,提供可用的协议的信息,但是不提供任何数据传送服务--它们由套接字类RSocket提供。 因为客户端应用编程接口对于所有协议都是相同的,某种单一协议的属性和语义与TProtocolDesc结构是有区别的。RSocketServer::GetProtocolInfo方法可用于读取当前装载的协议的信息。 套接字服务器至少需要两个不同的套接字。 一个用于监听进入连接请求,另一个用于建立一个连接和传送数据。 套接字服务器的客户端应用编程接口定义在es_sock.h头文件中。

  最吸引游戏开发者眼球的套接字服务器协议是蓝牙技术。 它提供了一个相对快速的、近程的解决方案,并且是免费使用的,因此很适合用于开发游戏。 与红外线通讯相比,蓝牙的优势是它有更大的活动半径以及在终端之间不需要任何可见的连接。

  如图3所示蓝牙由一个协议组组成。 Symbian OS 6.1版支持蓝牙1.0版,并且提供给应用程序完全访问RFCOMM、L2CAP和SDP协议的权限。 RFCOMM协议模拟串行通讯,因此简化了从原有应用程序的转化为使用蓝牙技术的过程。 应用程序的通常选择是使用逻辑链路控制和适应协议(L2CAP),提供给应用程序更加强大的函数来控制蓝牙连接。 服务发现协议(SDP)允许应用程序查询服务和服务提供商。通常当创建一个新的连接的时候,SDP搜索要求的终端并且建立连接设置。 Symbian OS还提供一个完整的用户界面组件来搜索可用的蓝牙终端。 它使用Symbian OS的通知框架,在应用程序窗口上产生一个对话类型组件并且把可用的终端作为一个列表来显示。


图3 蓝牙堆栈

  游戏数据接收

  为了支持游戏接收额外的游戏数据,Series 60能让第三方游戏使用MIME类型在OS中注册它们的数据文件格式。 MIME类型被像WML浏览器和消息应用程序这样的通讯应用程序来使用,用于弄清楚一个具有某种特定类型的文件应该被保存在什么路径。 例如这个文件可以包含用于一个游戏的新的等级、武器或者图形。
在Series 60中,用于游戏的MIME类型是下面这种格式:application/x-NokiaGameData-<APPLICATION-ID>,这其中的<APPLICATION-ID>是Symbian OS游戏应用程序的UID的最后八个数字。MIME类型在Symbian OS应用程序信息文档aif文件中声明:

RESOURCE AIF_DATA
{
 app_uid=0x12345678; // Application UID
 datatype_list =
 {
  DATATYPE
  {
   priority = EDataTypePriorityHigh;
   type = "application/x-NokiaGame-Data-12345678";
  }
 };
}

  DATATYPE结构中的优先级指定当前的应用程序是如何处理这些数据格式。 EDataTypePriorityHigh应用于不能被其它应用程序处理的数据格式。

  接收数据的目的路径在名为<APPLICATION-ID>.ini的ini文件中指定。 这个文件需要使用Unicode格式,并且它包含SDDataDir=<GAME-PATH>,在这里<GAME-PATH>是用于接收文件的路径。 这个路径是相对于默认游戏数据目录c:\nokia\games的。 当一个游戏被安装时,ini文件需要被复制到\System\SharedData目录下,它可以通过在一个游戏的pkg文件中指定路径来实现。

  Series 60指定一个用于游戏数据文件的遵循MIME类型的标准头结构。 头格式的结构在图4中说明。 Data类型字段可用于指定游戏内部的文件类型。 Name字串是一个Unicode字串,可用于指定一个用户可见的文本来显示菜单中的数据选项。 Data ID和Data版本是用于指定文件数据的类型和版本的号码。 NGDX字段必须包含ASCII字串"NGDX"。


图4用于游戏数据文件的标准头

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50