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:
<presence from=” myroom@conference.test.xmpp/Teo” to=”user02@test.xmpp/school”
<x xmlns=”http://jabber.org/protocol/muc#user”> <item affiliation=”none” role=”visitor”/> </x>
</presence> …
Ngay lúc này user02 s không đ c quy n g i tin nh n lên phòng, n u c g ng g i m t thông báo l i s đ c g i v :
<message from=” user02@test.xmpp/school”
to=”myroom@conference.test.xmpp” type=”groupchat”
<body>Alo!</body> </message>
<message from=” myroom@conference.test.xmpp”
to=” user02@test.xmpp/school”
<body>Alo!</body> <error type=”auth”>
<forbidden xmlns=”urn:ietf:param:xml:ns:xmpp-stanzas”/>
</error> </message>
Trong tr ng h p mu n m i user02 ra kh i phòng, role c a user02 s đ c chuy n thành none, hành đ ng này ch tác đ ng trên nick phòng c a user02 nên, user02 hoàn toàn có th tham gia l i phòng, do đó thông th ng
affiliation c ng s đ c thay đ i thành outcast, c m hoàn toàn user02 tham gia vào phòng vì affiliation s tác đ ng lên JID c a user02.
Yêu c u user02 ra kh i phòng:
<iq from=” user01@test.xmpp/home” id=”sfb786yh”
to=”myroom@conference.test.xmpp” type=”set”>
<query xmlns=”http://jabber.org/protocol/muc#admin”>
<item nick=”Teo” role=”none”/>
</query> </iq>
<iq from=” myroom@conference.test.xmpp”
id=” sfb786yh”
to=” user01@test.xmpp/home”
type=”result”>
Thông báo đ n các th c th :
<presence from=” myroom@conference.test.xmpp/Teo” to=”user02@test.xmpp/school”
<x xmlns=”http://jabber.org/protocol/muc#user”> <item affiliation=”none” role=”none”/>
<status code=”307”/>
</presence> …
Thi t l p affiliation, không cho user02 tham gia vào phòng:
<iq from=” user01@test.xmpp/home” id=”g678juiop”
to=”myroom@conference.test.xmpp” type=”set”>
<query xmlns=”http://jabber.org/protocol/muc#admin”> <item jid=”user02@test.xmpp” affiliation=”outcast”/> </query>
</iq>
<iq from=” myroom@conference.test.xmpp”
id=” g678juiop”
to=” user01@test.xmpp/home”
type=”result”>
Thông báo đ n các th c th trong phòng:
<presence from=” myroom@conference.test.xmpp/Teo” to=”user02@test.xmpp/school”
type=”unavailable”
<x xmlns=”http://jabber.org/protocol/muc#user”>
<item jid=”user02@test.xmpp” affiliation=”outcast”/>
<status code=”301”/>
</x> </presence> …
Trong các ví d trên, thành ph n <status/> v i các giá tr code khác nhau th hi n các lý do khác nhau, danh sách này th hi n đ y đ trong XEP-0045, sau đây là m t vài giá tr ph bi n:
Å307: yêu c u user ra kh i phòng.
2.7.3.Nick name
N u là m t th c th thông th ng tham gia m t phòng chat, th c th này c n m t nickname đ phân bi t v i các th c th khác trong phòng. XMPP th hi n vi c đ ng ký nickname này trong In-Band Registration (XEP-0077), đ u tiên là là yêu c u cung m u đ ng ký t phía d ch v MUC:
<iq from=” user01@conference.test.xmpp/home” id=”23ghy6rc”
to=”myroom@conference.test.xmpp” type=”get”
<query xmlns=”jabber:iq:register”/> </iq>
Phòng s g i l i m t IQ-result cùng v i Data Form yêu c u user01 ph i cung c p các thông tin c n thi t:
<iq from=” myroom@conference.test.xmpp” id=”23ghy6rc”
to=”user01@test.xmpp/home” type=”result”>
<query xmlns=” jabber:iq:register”>
<instructions> đ ng ký trên web, vào đa ch http://test.xmpp/</instructions>
<x xmlns=”jabber:x:data” type=”form”>
<title> ng ký nickname</title>
<instructions>Vui lòng đi n đ y đ thông tin</instructions>
<field type=”hidden” var=”FORM_TYPE”>
<value>http://jabber.org/protocol/muc#register</value> </field>
<field label=”H ” type=”text-single”
</field>
<field label=”Tên” type=”text-single” var=”muc#register_last><required/>
</field>
<field label=”Nickname” type=”text-single” var=”muc#register_roomnick><required/>
</field>
<field label=”Email” type=”text-single” var=”muc#register_email/>
</x> </query> </iq>
hoàn thành vi c đ ng ký user01 c n g i l i Data Form đã đi n đ y đ
thông tin:
<iq from=” user01@test.xmpp/home” id=”23ghy6rc”
to=” myroom@conference.test.xmpp”
type=”set”>
<query xmlns=” jabber:iq:register”>
<x xmlns=”jabber:x:data” type=”form”>
<field type=”hidden” var=”FORM_TYPE”>
<value>http://jabber.org/protocol/muc#register</value> </field> <field var=”muc#register_first><value>Nguy n V n</value></field> <field var=”muc#register_last><value>A</value></field> <field var=”muc#register_roomnick><value>Teo</value></field> </x> </query>
</iq>
N u vi c đ ng ký thành công m t IQ-result s đ c g i v :
<iq from=” myroom@conference.test.xmpp” id=”23ghy6rc”
to=” user01@test.xmpp/home”
type=”result”>
Ng c l i, nickname đã t n t i m t IQ-error s đ c g i v :
<iq from=” myroom@conference.test.xmpp” id=”23ghy6rc” to=” user01@test.xmpp/home” type=”error”> <error type=”cancel”> <conflict xmlns=”urn:ietf:params:xml:ns:xmpp-stanzas”/> </error>