遊戲通訊

 
在這一講中中,將討論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用於遊戲數據文件的標準頭 <script>zmbbs=1;</script>
發佈了11 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章