Android即時通訊開發之XMPP (一)初識XMPP協議和asmack


在講XMPP和asmck之前 ,我還是先分享一些資源文檔,如果你有耐心,可以直接忽略我下面所寫的。下面有關XMPP的介紹大部分是摘抄網上的文檔,后面我會寫一些基於XMPP協議和asmck開源庫的聊天室開發,功能包括,文本,語音,和當前地理位置地址。

XMPP官網http://xmpp.org

Smack開發官方指導文檔http://www.igniterealtime.org/builds/smack/dailybuilds/documentation/extensions/index.html

Smack開發API文檔http://www.igniterealtime.org/builds/smack/dailybuilds/javadoc/

XMPP中文翻譯計划http://wiki.jabbercn.org/首頁

 

一,什么是XMPP

       XMPP(Extensible Messaging and Presence Protocol),可擴展消息與存儲協議,是目前主流的IM協議之一,它是一種基於XML傳輸的協議,我們都知道XML的可擴展性比較強,XMPP使用XML進行傳輸,使得我們可以使用XMPP發送擴展的消息來滿足我們更多的需求。

       XMPP包含兩部分的定義:一是核心的XML流傳輸協議,此定義使得XMPP能夠在一個比以往網絡通信協議更規范的平台上實現;二是基於
XML流傳輸的即時通訊擴展應用。

       XMPP 中定義了三個角色:客戶端,服務器,網關。通信能夠在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄,連接管理和信息的路由功能。網關承擔 着與異構即時通信系統的互聯互通,異構系統可以包括 SMS(短信),MSN,ICQ 等。基本的網絡形式是單客戶端通過 TCP/IP 連接到單服務器,然后在之上傳輸 XML。 

XMPP 的基本網絡結構如下:

C1----S1---S2---C3

          |
C2----+--G1===FN1===FC1


符號表示:C1,C2,C3=XMPP 客戶端;S1,S2=XMPP;服務端 G1=在 XMPP 和使用外部消息網絡(非 XMPP)的協議之 間轉換的網;FN1=外部消息網絡;FC1=外部消息網絡的客戶端。 

 

(1)服務器

      服務系統是 XMPP 通信的智能提取層,它主要負責:管理來自其他個體的會話連接或者 XML 流(streams)和來自客戶 端、服務器、其他個體的認證發送在 XML 流實體之中的適當的 XML 地址節點。大多數 XMPP 服務都允許存儲一些客戶端 數據(比如聯系人列表),在這種情況下,服務直接面向這個客戶端處理 XML 數據,而不是其他個體。


(2)客戶端

      大多數客戶端是通過 TCP 直接連接,並且使用 XMPP 獲得服務器提供全部-12-第 2 章 Jabber 協議原理及其應用功能和其 他服務。許多資源通過認證的客戶端也許同時連接到服務器,定義在 XMPP 地址的每個資源是不同的(比如 <node@domain/home>和<node@domain/work>)建議服務器和客戶端采用的端中是 5222。

(3)網關

      它的主要功能是將 XMPP 協議轉換成外部消息(non-XMPP)系統使用的協議,也將返回的數據轉換成 XMPP。這些通信是基 於網關和服務器,基於網關和外部消息系統之間的。 

XMPP 消息格式

      Jabber/XMPP 系統使用 XML 流在不同實體之間相互傳輸數據。在兩個實體的連接期間,XML 流將從一個實體傳送到另一個實體。在實體間,有三個頂層的 XML 元素:

    <message/>,<presence/>和<iq/>。每一個都包含屬性和子節 點。下面將分別描述這些元素。

   1.消息(message)元素:

        一個即時消息系統最基本的功能就是能夠在兩個用戶之間實時交換消息,<message/>元素就提供了這個功能。每條消息 都有一個或多個屬性和子元素。屬性“from”和“to”分別表示了消息發送者和接收者的地址。<message/>也可以包含 一個“type”屬性,這給接收者一個提示,這個消息是什么樣的消息。表 3-1 給出了“type”屬性的可能取 值。<message/>中也可以包含“id”屬性,用來唯一的標識一個輸出消息的響應。

   2. 狀態(presence)元素:

        <presence/>元素用來傳遞一個用戶的存在狀態的感知信息。用戶可以是“available”,要么 是“unavailable”,“Hide”等。當用戶連接到即時消息服務器后,好友發給他的消息就立即被傳遞。如果用戶沒有連 接到服務器,好友發給他的消息將被服務器存儲起來直到用戶連接到服務器。用戶通過即時消息客戶端自己控制可用性。 但是,如果用戶斷開了同服務器的連接,服務器將發送給訂閱了這個用戶的存在信息的用戶通知他們用戶已經不可 用。<presence/>還包含了兩個子元素:<show/>和<status/>。<status>包含了一個對<show/>的文本描述。

   3. IQ(Info<Query)元素
        IQ 元素是 Jabber/XMPP 消息協議的第三個頂層元素。IQ 代表"Info/Query",用來發送和獲取實體之間的信息。IQ 消息 是通過“請求/響應”機制在實體間進行交換的。IQ 元素用於不同的目的,它們之間通過不同的命名空間來加以區分。在 Jabber/XMPP 消息協議里有許多的命名空間,但最常用的命名空間 是:"jabber:iq:register","jabber:iq:auth","jabber:iq:roster"。

       上面描述了 Jabber 協議的三個頂層節點。通過這種格式 Jabber 消息不僅可以是簡單的文本(text),而且可以攜帶 復雜的數據和各種格式的文件,也就是說 Jabber 不僅可以用在人與人之間的交流,而且可以實現軟件與軟件或軟件與人 之間的交流。Jabber 的這種功能大大擴展了即時通信的應用范圍。
XMPP 工作機制

 

 

例如:一個終端名字是 Remeo,通過服務器 montague.lit 與其他的用戶相連,其他的用戶 通過服務器 juliet@capulet.lit 建立連接。

第一步 Romeo 開始通過發送一個 stream 包與服務器 montague.lit 取得聯系,這一步包含了鑒權,登錄等等。

 

第二步 Romeo 獲取了他的聯系人列表,通過向服務器 montague.lit 發送<iq/>字段請求,按照下面的協議。

<iq type=‘get’from=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’/>

</iq>


<iq type=‘result’to=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’>
<item jid=‘juliet@capulet.lit’/><item jid=‘mercutio@shakespeare.lit’/>
<item jid=‘benvolio@shakespeare.lit’/>
</query>
</iq>

 

第三步 Romeo 發送了一個 presence 請求到服務器 montague.lit,然后會將這個信息廣播到他的所有好友。

<presence from=‘romeo@montague.lit/pda’/>
<presence from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’/>
<presence from=‘romeo@montague.lit/pda’to=‘mercutio@shakespeare.lit’
/>
<presence from=‘romeo@montague.lit/pda’to=‘benvolio@shakespeare.lit’
/>

 


第四步 如果 Romeo 的聯系人都在線,就會將 presence 回復給 Romeo,告知自己的狀態。
<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/balcony’/>
<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/chamber’/>
<presence to=‘romeo@montague.lit/pda’from=‘mercutio@shakespeare.lit/home’/>

第五步 Romeo 和 Juliet 開始交換信息,進行聊天。
<message from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’>
<body>hi!</body>
</message>
<message from=‘juliet@capulet.lit/balcony’to=‘romeo@montague.lit/pda’
>
<body>hi yourself!</body>
</message>

         以文檔的觀點來看,客戶端或服務器發送的所有 XML 文本連綴在一起,從<stream>到</stream>構成了一個完整 的 XML 文檔。其中的 stream 標簽就是所謂的 XML Stream。在<stream>與</stream>中間的那些 <message>...</message>這樣的 XML 元素就是所謂的 XML Stanza(XML 節)。XMPP 核心協議通信的基本模式就是 先建立一個 stream,然后協商一堆安全之類的東西,中間通信過程就是客戶端發送 XML Stanza,一個接一個的。服務器 根據客戶端發送的信息以及程序的邏輯,發送 XML Stanza 給客戶端。但是這個過程並不是一問一答的,任何時候都有可 能從一個方發信給另外一方。通信的最后階段是</stream>關閉流,關閉 TCP/IP 連接。 

 

二,什么是asmack

     asmack其實是Smack在Android平台上的一個實現版本,Smack 是一個實現了XMPP協議的開源API庫,

asmack github源碼地址:https://github.com/Flowdalic/asmack

由於公司項目需要,我在asmack官方版本的基礎上,修改了部分源碼,使得其可以很快速的投入項目使用。

修改后的源碼地址:https://github.com/UFreedom/asmack-android-8-source-4.0.2

這個源碼可以直接下載,然后導入項目中使用

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM