XMPP h tr m t tài kho n có th đ ng nh p b ng nhi u client trong cùng lúc nên c n xác đnh đ u tiên cho m i client khi đ ng nh p vì khi đó m t tin nh n đ c g i t i m t đa ch bare JID (có d ng user@domain.tld) thì s đ c g i đ n client có đ u tiên cao h n, riêng trong tr ng h p g i đ n đa ch full JID (có d ng user@domain.tld/resource) thì tin nh n s đ c g i chính xác t i client đó. u tiên này có giá tr trong kho ng -127 đ n 128.
<presence from=”user01@test.xmpp/home”> <priority>1</priority> </presence> <presence from=”user01@test.xmpp/school”> < priority >10</ priority > </presence> 2.3.5.Thông báo s hi n di n tr c ti p
Thông th ng khi thông báo s hi n di n c a m t th c th thì client s g i
đ n t t c các th c th trong roster, tuy nhiên khi c n thi t XMPP c ng h tr ph ng pháp đ thông báo đ n chính xác m t th c th b ng cách thêm thu c tính to vào stanza presence:
<presence from=”user01@test.xmpp/school”> to=”user03@test.xmpp/home”/>
Ph ng pháp này đ c s d ng khi m t th c th mu n g i tin nh n đ n m t đ n m t th c th khác mà không có trong danh sách, ho c trong quá trình tham gia và thoát kh i các phòng h i tho i.
2.3.6.Offline
đ ng xu t kh i h th ng XMPP, client ch c n g i m t stanza presence v i type=”unavailable”:
<presence type=”unavailable”/>
Khi m t client đ ng xu t kh i h th ng thì nhi m v c a server nh sau:
ÅG i thông báo đ ng xu t đ n các th c th khác trong danh sách và m t s th c th khi nh n đ c thông báo hi n di n tr c ti p tr c đó.
ÅServer s không g i các thông báo, tin nh n đ n client, n u không còn client nào khác có cùng đ a ch bare JID t n t i trên m ng (ho c có th l u tr và thông báo đ n client vào l n đ ng nh p ti p theo).
Trong tr n h p n u client mu n đ ng nh p vào h th ng thì client ch c n g i lên server stanza presence kh i t o:
<presence/>
2.3.7.Qu n lí danh sách (roster)
ti n l i cho ng i s d ng, các client s th hi n danh sách liên l c trên giao di n c a ng d ng. Tuy nhiên danh sách này đ c l u tr trên server do
đó đ l y đ c danh sách client ph i ti n hành g i yêu c u lên server b ng m t stanza IQ: <iq from=”user01@test.xmpp/home” id=”id23fjsw” to=”user01@test.xmpp” type=”get” <query xmlns=”jabber:iq:roster”/> </iq>
l c: <iq from=”user01@test.xmpp” id=”id23fjsw” to=”user01@test.xmpp” type=”result” <query xmlns=”jabber:iq:roster”> <item jid=”user02@test.xmpp” name=”Ti” subscription=”none” <group>Friend</group> </item> <item jid=”user03@test.xmpp” name=”Teo” subscription=”both” <group>Friend</group> </item> <item jid=”user04@test.xmpp” name=”Binh” subscription=”to” <group>Family</group> </item> </iq>
ng v i m t giá tr trong danh sách, ngoài thông tin đ a ch JID, còn có thông tin v tên (name), chi u đ ng ký (subscription) và nhóm (group).
2.4. Instant Messaging
ây có th coi là m t ch c n ng c b n và quan tr ng nh t mà XMPP cung c p đ h tr phát tri n các h th ng Instant Messaging, các tin nh n s đ c truy n đi m t cách nhanh chóng t m t th c th này sang th c th khác v i đ
tr ít nh t. C ng gi ng nh m t cu c h i tho i trong đ i th c, m i tin nh n trong XMPP kèm theo nh ng thông tin tr ng thái đ th hi n chính xác hành đ ng c a
m i th c th trong quá trình trò chuy n.
2.4.1.Tr ng thái trò chuy n (Chat States)
XMPP cung c p m t s tr ng thái sau:
ÅStaring: th c th A m i B tham gia trò chuy n nh ng B ch a tham gia.
ÅActive: B đ ng ý tham gia nh ng ch a so n tin nh n.
ÅComposing: B b t đ u so n tin nh n.
ÅPaused: trong khi B đang so n tin nh n thì ph i t m d ng vì m t lý do nào đó.
ÅInactive: B đã không tham gia vào cu c trò chuy n trong m t th i gian khá dài.
ÅGone: k t thúc cu c trò chuy n.
Hình 2.4: Các tr ng thái trò chuy n trong XMPP
Ngu n: Oreilly (2009), The Definitive Guide, Trang 50
th hi n tr ng thái trong m t tin nh n, thành ph n chat states s đ c thêm vào các stanza message v i thu c tính xmlns là
http://jabber.org/protocol/chatstates:
to=”user02@test.xmpp/school” type=”chat” <body>Xin chào</body> <active xmlns=”http://jabber.org/protocol/chatstates”/> </message> 2.4.2.VCard
XMPP cung c p ch c n ng này nh m th hi n thông tin cá nhân c a m t th c th nh tên, đa ch , s đi n tho i, hình nh đ i di n, … c th hi n rõ trong XEP-0054.
l y thông tin vCard c a m t th c th , client s g i lên server m t IQ-get nh sau: <iq from=”user01@test.xmpp/home” id=”id24hwhs” to=”user02@test.xmpp” type=”get” <vCard xmlns=”vCard-temp”/> </iq>
Server s g i tr thông tin v user02:
<iq from=” user02@test.xmpp” id=”id24hwhs” to=” user01@test.xmpp/home” type=”result” <vCard xmlns=”vCard-temp”/> <N><GIVEN>Ti</GIVEN></N> </vCard> </iq>
Mu n c p nh t thông tin vCard, client s g i m t IQ-set lên server v i các thông tin c n c p nh t.
id=”id2423hs” to=” user01@test.xmpp” type=”set” <vCard xmlns=”vCard-temp”/> <N><GIVEN>Teo</GIVEN></N> <EMAIL><USERID> user01@test.xmpp</USERID></EMAIL> </vCard> </iq> 2.4.3. nh d ng tin nh n
ôi khi m t tin nh n thông th ng trông khá nhàm chán, và đôi lúc trong m t câu c ng c n có nh ng đi m nh n, trong tr ng h p này XMPP s cung c p kh n ng đnh d ng các b n tin khi đ c g i đi, d a vào chu n HTML và
đ c đnh ngh a l i là XHTML-IM c th trong XEP-0071. Ví d :
<message from=”user01@test.xmpp/home” to=”user02@test.xmpp/school” type=”chat”
<body>Xin chào, user02 </body>
<html xmlns=”http://jabber.org/protocol/xhtml-im”
<body xmlns=”http://www.w3.org/1999/xhtml”>
<p>Xin chào, <strong>user02</strong></p> </body>
</html>
</message>
2.5. Khám phá d ch v (Service Discovery)
Tính n ng này c a XMPP là khá quan tr ng, v i tính n ng này giúp m t th c th có th tìm hi u v các th c th khác trên m ng, có th là các tính n ng ho c giao th c mà th c th này có th h tr , giúp vi c giao ti p thu n ti n h n khá
nhi u.
c đnh ngh a trong XEP-0030, service discovery cung c p 2 ph ng th c c b n đó là disco#items và disco#info. disco#items giúp xác đnh m t th c th trên m ng, trong khi đó disco#info s xác đnh các tính n ng mà th c th đó h tr .
Ví d s d ng disco#items:
<iq from=” user01@test.xmpp/home” id=”idaavssw”
to=” test.xmpp”
type=”get”
<query xmlns=”http://jabber.org/protocol/disco#items”/> </iq>
ví d này user01 yêu c u đ c cung c p m t s thông tin v server mà c th đây là các thành ph n c a test.xmpp. Sau khi nh n đ c yêu c u server s g i tr l i k t qu cho user01:
<iq from=” test.xmpp” id=”idaavssw” to=” user01@test.xmpp/home” type=”result” <query xmlns=”http://jabber.org/protocol/disco#items”> <item jid=”conference.test.xmpp”/> </query> </iq>
K t qu cho th y test.xmpp có h tr conference.test.xmpp là kh n ng t ch c các cu c h i tho i nhóm. User01 c n bi t chi ti t h n các tính n ng h tr b i conference.test.xmpp, khi đó m t IQ-get v i thành ph n disco#info s đ c g i lên conference.test.xmpp:
<iq from=” user01@test.xmpp/home” id=”idafsssw”
to=” conference.test.xmpp” type=”get” <query xmlns=”http://jabber.org/protocol/disco#info”/> </iq> conference.test.xmpp s g i tr k t qu nh ng tính n ng mà mình h tr cho user01:
<iq from=” conference.test.xmpp” id=”idafsssw”
to=” user01@test.xmpp/home”
type=”result”
<query xmlns=”http://jabber.org/protocol/disco#info”>
<identity category=”conference” type=”text”
name=”chatrooms”/> <feature var=”http://jabber.org/protocol/muc”/> <feature var=”jabber:iq:register/> <feature var=”vcard-temp”/> </iq> D a trên k t qu user01 có th bi t đ c các ch c n ng mà
conference.test.xmpp cung c p: http://jabber.org/protocol/muc (XEP-0045) d ch v chat nhóm s đ c đ c p trong các ph n sau, jabber:iq:register
(XEP-0077) đ ng ký tài kho n “in-band”, vcard-temp (XEP-0054) thông tin tài kho n.
2.6. Data Forms
XMPP h tr k thu t này nh m cung c p d li u có c u trúc, đáp ng nhu c u trao đ i nh ng thông tin ph c t p gi a các th c th .
Data Froms đ c đnh ngh a trong XEP-0004.
C u trúc này đ c th hi n trong thành ph n <x/> v i không gian tên
jabber:x:data và v i thu c tính type th hi n các lo i form khác nhau, ý ngh a m i lo i đ c th hi n rõ qua hình 2.5, bao g m:
ôform.
ôsubmit.
ôcancel.
ôresult.
Hình 2.5: Quy trình t ng tác d li u Data Form
Ngu n: Oreilly (2009), The Definitive Guide, Trang 70
M i thành ph n <x/> bao g m các thành ph n con <field/> v i các thu c tính
type khác nhau mang ý ngh a khác nhau:
ôboolean: mang giá tr true ho c false, th ng s d ng đ th hi n cho m t checkbox ho c radio button.
ôfixed: th ng th hi n nhãn ho c m t h ng d n.
ôhidden: ch a giá tr đ c n đi.
ôjid-multi: danh sách các JID, phân cách v i nhau b ng thu c tính vaule.
ôjid-single: đ a ch JID đ n.
ôlist-single: danh sách ch cho phép l a ch n 1 đ i t ng.
ôtext-multi: thành ph n cho phép nh p v n b n nhi u dòng, m i dòng ch a trong thu c tính value.
ôtext-private: th ng đ c s d ng nh m t thành ph n cho phép nh u m t kh u.
ôtext-single: thành ph n nh p v n b n ch h tr 1 dòng d li u. Thu c tính var th hi n tên c a m i thành ph n <field/>.
M i thành ph n <field/> có th có nh ng thành ph n con nh :
ô<desc/>: th hi n thông tin cho <field/>.
ô<required/>: dùng đ ki m tra tính h p l c a Form.
ô<value/>: ch a các giá tr c a <field/>.
ô<option/>: th hi n m t trong nhi u l a ch n trong list-single ho c list- multi.
2.7. Chat nhóm (Multi-User Chat)
Multi-User Chat (MUC) đ c đnh ngh a trong XEP-0045, m t ch c n ng cho phép nhi u th c th cùng tham gia vào m t cu c h i tho i và g i tin nh n qua l i cho nhau. XMPP cung c p s l ng ch c n ng và ng d ng r t đa d ng trong MUC, tuy nhiên trong n i dung c a bài khóa lu n ch đ c p đ n m t s tính n ng c b n c a MUC, nh ng tính n ng th t s c n thi t và đ c s d ng r ng rãi.
2.7.1.C b n v Multi-User Chat
Nói m t cách t ng th MUC, v n đ đ c quan tâm trong vi c qu n lý và x lý là các phòng chat “room”. XMPP, MUC đ c qu n lý b i m t d ch v riêng bi t so v i h th ng Instant Messaging đ c g i là “component” và
đ c l u tr trên m t domain riêng, th ng là domain con c a domain chính. Trong n i dung khóa lu n, domain đ c s d ng là conference.test.xmpp.
myroom@conference.test.xmpp, đ tham gia vào m t phòng, client s g i m t presence tr c ti p đ n đa ch phòng, ví d user01 s tham gia vào myroom.:
<presence from=” user01@.test.xmpp/home”
to=”myroom@conference.test.xmpp/Ti”/>
Giá tr myroom@conference.test.xmpp/Ti g i là room JID c a user01. nh d ng chung c a room JID là room@domain.tld/nick.
Sau khi m t client tham gia vào m t phòng, phòng này s gi i quy t nh ng v n đ sau:
ÅG i thông báo s tham gia c a client đ n t t c các th c th đã tham gia vào phòng.
ÅClient c ng s nh n đ c thông báo s hi n di n c a t t c các th c th khác đ t o thành m t roster c c b trong phòng này.
Å ng th i m t s b n tin đ c trao đ i g n đây trên phòng c ng s đ c g i t i client.
u tiên, các th c th khác s nh n đ c thông báo tham gia c a user01:
<presence from=” myroom@conference.test.xmpp/Ti” to=”user02@.test.xmpp/shcool”/> <presence from=” myroom@conference.test.xmpp/Ti” to=”user03@.test.xmpp/library”/>
…
Ngay sau đó, user01 nh n đ c thông báo t các th c th khác:
<presence from=” myroom@conference.test.xmpp/Teo” to=”user01@.test.xmpp/home”/> <presence from=” myroom@conference.test.xmpp/Bin” to=”user01@.test.xmpp/home”/>
…
phòng, kèm theo thành ph n <delay/> ghi nh n th i gian các b n tin này đ c g i đi:
<message from=” myroom@conference.test.xmpp/Teo” to=”user01@.test.xmpp/home” type=”groupchat”>
<body>Chào</body>
<delay xmlns=”urn:xmpp:delay” stamp=”2011-09- 14T15:20:20Z”/>
</message>
<message from=” myroom@conference.test.xmpp/Bin” to=”user01@.test.xmpp/home” type=”groupchat”>
<body>Chào m i ng i</body>
<delay xmlns=”urn:xmpp:delay” stamp=”2011-09- 14T15:22:31Z”/>
</message> …
T i th i đi m này, user01 đã có th i g i các tin nh n c a mình đ n các th c th khác trong phòng:
<message from=” user01@.test.xmpp/home”
to=”myroom@conference.test.xmpp” type=”groupchat”>
<body>User01 chào m i ng i</body> </message>
ng v i m i tin nh n c a client đ c g i lên, phòng s x lý và s g i tin nh n này đ n t t c các client khác trong phòng:
<message from=” myroom@conference.test.xmpp/Ti” to=”user02@test.xmpp/school”
type=”groupchat”> <body>User01 chào m i ng i</body>
</message>
<message from=” myroom@conference.test.xmpp/Ti” to=”user03@test.xmpp/library” type=”groupchat”>
<body>User01 chào m i ng i</body> </message>
…
Khi mu n r i kh i phòng, client s g i m t presence v i type là
unavailable:
<presence from=” user01@test.xmpp/school”
to=”myroom@conference.test.xmpp/Ti” type=”unavailable”>
B n tin này c ng s đ c g i đ n t t c các client khác trong phòng đ
thông báo user01 đã r i kh i phòng:
<presence from=” myroom@conference.test.xmpp/Ti” to=”user02@test.xmpp/school”
type=”unavailable”>
<presence from=” myroom@conference.test.xmpp/Ti” to=”user03@test.xmpp/library” type=”unavailable”>
…
2.7.2. Phân quy n trong phòng
Là n i giao ti p c a nhi u th c th trên m ng, đôi khi không th tránh kh i nh ng th c th có nh ng hành đ ng gây nh h ng t i các th c th khác, nên v n đ qu n lý, phân quy n trong m t phòng là khá quan tr ng.
XMPP cung c p m t s lo i phòng, qua đó th hi n cách th c, quy đ nh tham gia c a các th c th , m t s lo i ph bi n:
ÅMembers-Only Room: ch nh ng th c th có trong danh sách m i có th tham gia vào phòng.
ÅOpen Room: t t c m i th c th đ u có th tham gia vào phòng.
ÅPassword-Protected Room: c n m t kh u đ tham gia vào phòng.
ÅHidden Room: phòng này không th tìm th y b i d ch v Service Discovery.
ÅPublic Room: ng c l i v i Hidden Room, có th tìm ki m qua d ch v Service Discovery.
ng th i MUC cung c p m t s role và affiliation cho các th c th nh sau:
Åoutcast: nh ng th c th nh n affiliation này không đ c phép tham gia vào phòng.
Åvisitor: th c th này có th tham gia vào phòng, nh n thông đi p t các th c th khác nh ng không đ c phép g i các tin nh n.
Åparticipant: có kh n ng nh n và g i các thông đi p.
Åmember: th c th này có th nh n, g i và tham gia vào các phòng Member-Only.
Åmoderator: th c th này có th nh n, g i thông đi p, đ ng th i có kh n ng m i các participant và visitor ra kh i phòng, có kh n ng cho phép m t s th c th khác có quy n g i thông đi p.
Åadmin: ngoài nh ng ch c n ng nh m t moderator, admin còn có kh n ng xem thông tin v JID c a các th c th khác trong phòng, ngoài ra còn có kh n ng c u hình m t s ch c n ng c a phòng.
Åowner: có ch c n ng nh m t admin, ngoài ra còn có kh n ng qu n lý các admin, thi t l p toàn b c u hình c a phòng, và có kh n ng h y phòng.
Ví d , user01 là m t admin, user02 là m t participant, trong tr ng h p nào đó user01 mu n chuy n role c a user02 t participant xu ng còn visitor, user01 s g i m t IQ nh sau:
id=”fu82jd29”
to=”myroom@conference.test.xmpp” type=”set”>
<query xmlns=”http://jabber.org/protocol/muc#admin”> <item nick=”Teo” role=”visitor”/>
</query> </iq>
<iq from=” myroom@conference.test.xmpp” id=”fu82jd29”
to=” user01@test.xmpp/home”
type=”result”>
Phòng s thông báo đ n t t c m i th c th bao g m c user02 v s thay
đ i role này b ng m t presence: