アプリケーション層プロトコル:Jabber / XMPP Part1

記事を読んでチームを試した後、私たちは学びます

-Jabberサーバーに接続する

-ログイン

-ステータスの変更

-メッセージを送信する

-切断



そして、これらすべてを純粋なXMLで



原則として、記事「Introduction to XMPP」またはそのようなものを呼び出すことができます...しかし、本質は変わりません

さあ始めましょう!



単純なJabberセッションは、次の一連の操作です。



このスキームを実装してみましょう。 私の実験では、jabber.ruサーバーが使用されていますが、既にアカウントを持っていると仮定しています。

以下のリストでは、XMLブロック内にあるすべてのコメントはXMLコメントタグ内にあり、残りのXMLは変更なしで表示されます(読みやすくするために改行が追加されていない限り)。 これをすべてコンソールに入力する予定がある場合(これは非常に現実的です、私は自分でやった)、最初にすべてのコードをテキストエディターにコピーし、承認を置き換えることをお勧めします。 データ、コメントおよび改行を削除します。

クライアントによって送信されたXMLブロックは、-C:によって送信されます--S:によって送信されます



サーバー接続



ポート5222でjabber.ruサーバーに接続します

telnet jabber.ru 5222

Trying 213.180.203.19...

Connected to pluton.relax.ru.

Escape character is '^]'.






ストリーム作成



XMLストリームの先頭をサーバーに送信します。サーバーにはサーバーアドレスが示されます(jabber.ru)

--C:

<stream:stream xmlns="jabber:client" to="jabber.ru" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" >





それに応じて、サーバーXMLストリームの始まりが来ます。

--S:

<? xml version ='1.0' ? >

< stream:stream xmlns ='jabber:client' xmlns:stream ='http://etherx.jabber.org/streams' id ='2689330648' from ='jabber.ru' version ='1.0' xml:lang ='en' >

<!-- -->

< stream:features >

<!-- TLS ( Jabber , , ) TLS , Gajim -->

< starttls xmlns ='urn:ietf:params:xml:ns:xmpp-tls' />

<!-- -->

< compression xmlns ='http://jabber.org/features/compress' >

<!-- gz -->

< method > zlib </ method >

</ compression >

<!-- SASL -->

< mechanisms xmlns ='urn:ietf:params:xml:ns:xmpp-sasl' >

<!-- DIGEST-MD5 -->

< mechanism > DIGEST-MD5 </ mechanism >

<!-- PLAIN -->

< mechanism > PLAIN </ mechanism >

</ mechanisms >

<!-- -->

< register xmlns ='http://jabber.org/features/iq-register' />

</ stream:features >




* This source code was highlighted with Source Code Highlighter
.






認証



TLS暗号化には含まれず、まだ成熟していません))

Jabber認証はSASL(Simple Authentication and Security Layer)を使用して実装されます。 提案されたメカニズムのうち、DIGEST-MD5メカニズムを使用することをお勧めしますが、実装が非常に難しいため、最初にPLAINメカニズムを検討します。

ブロックは、属性mechanism =“ PLAIN”で送信され、 base64エンコードされた文字列を含みます。

{承認ID。例: user1@jabber.ru(オプション)} ASCII文字\ x00 {ユーザー名、例: user1} ASCII文字\ x00 {パスワードをクリア、たとえば123456}

ASCII文字\ x00は、16進コード00のASCII NUL文字です

このような文字列は、たとえばPHPで取得できます: base64_encode($ id。 "\ x00"。$ login。 "\ x00" $ pass);

ここで試すことができます: SASL認証用のデータの準備

--C:

<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">dXNlcjFAamFiYmVyLnJ1AHVzZXIxADEyMzQ=</auth>





サーバーからの応答で、許可の成功(成功)に関するメッセージ

--S:

<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>





注意! 実際のネットワークプログラムでは、この認証方法(暗号化されていないチャネルを介したクリアテキストのパスワードとログイン)を使用しないでください。 これにより、クライアント(ボット)とJabberサーバーが同じ安全なネットワーク上または同じサーバー上にある場合、パフォーマンスをわずかに向上させることができます。 実際のJabberネットワークアプリケーションでは、ストリーム全体のTLS暗号化、またはDIGEST-MD5認証方式のいずれかを使用しますが、多くの場合、両方を同時に使用します。



認証に成功したら、新しいXMLストリームを開始する必要があります

--C:

<stream:stream xmlns="jabber:client" to="jabber.ru" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" >





サーバーからの新しいストリーム:

--S:

<? xml version ='1.0' ? >

<!-- -->

< stream:features >

<!-- (bind) -->

< bind xmlns ='urn:ietf:params:xml:ns:xmpp-bind' />

<!-- XMPP- -->

< session xmlns ='urn:ietf:params:xml:ns:xmpp-session' />

</ stream:features >








ストリームをリソースにバインドする



iq-サーバーへの要求。 これらは、情報(名簿、「名刺」など)を要求/送信するために使用されます。type属性とid属性があります

type-リストの1つ:get(データを要求)、set(データを送信|値を設定/置換)、result(正常なgetまたはsetへの応答、要求されたデータを含む)、error(エラーへの応答getまたはセット)

id-後続のiqリクエストごとに、idを1ずつ増やします(増分)。 iqリクエストに応答するサーバーは、そのIDを繰り返します。 これは、いくつかの異なるiq要求が一度に送信されることがあるためです。

取得または設定への応答で、リクエストは結果タイプの応答を返す必要があります(何か問題がある場合はエラー)



このスレッドをtelnetリソースに割り当てます

--C:

<iq type="set" id="9746"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">

<resource>telnet</resource>

</bind>

</iq>






答えはiqであり、type result

--S:

<iq id='9746' type='result'>

<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>

<!-- JID @/ -->

<jid>user1@jabber.ru/telnet</jid>

</bind>

</iq>






セッション作成



次に、セッションを作成するために必要なサーバー...これは、ステータス、メッセージ、そして実際に送信するために必要です。 私たちは拒否しません:

--C:

<iq type="set" id="9747">

<session xmlns="urn:ietf:params:xml:ns:xmpp-session" />

</iq>






セッションが正常に作成されました:

--S:

<iq type='result' id='9747'>

<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>

</iq>






「利用可能」ステータスメーリングリスト



プレゼンス -ブロードキャスト情報(ステータス情報など)とサブスクリプション情報(連絡先リストへのユーザーの追加など)を送受信します。 特定のユーザーにのみデータを送信するためのtoポインターを含めることができます(たとえば、特定の名簿の連絡先に「邪魔しない」ステータスを設定します:))

属性があります

from -JID名@存在するサーバー/リソース。 原則として、それをインストールすることはできません-サーバーを停止します。

to-このプレゼンスが対象とするJID(リソースの有無にかかわらず)。 指定されていない場合、サインアップしているすべての人(連絡先リストなど)に送信されます

type-存在しない場合はプレゼンスタイプ-単純なステータスメッセージ、それ以外の場合はリスト:使用不可(無効)、プローブ(サーバーからクライアントステータスを要求)、サブスクライブ(サブスクリプションの要求/名簿への追加要求)、サブスクライブ解除(サブスクライブ解除/削除)名簿から)、購読済み(購読を承認/名簿に追加)



ステータスの変更に関するメッセージを送信しています。

--C:

< presence >

<!-- ( , ) -->

< priority > 50 </ priority >

<!-- , — «» xa (eXtended Away ), away (), chat ( ), dnd ( — ) -->

< show > chat </ show >

<!-- , - -->

< c xmlns =" http : //jabber . org / protocol / caps " node =" http : //gajim . org / caps " ext =" xhtml cstates " ver =" 0 . 11 . 4 " />

<!-- -->

< status > </ status >

<!-- x- ( sha1-) -->

< x xmlns =" vcard-temp:x:update " >

< photo > b2730e40aba4f7225456d0b4789bf2d5af34c3e3 </ photo >

</ x >

</ presence >








ネストされたパラメーターはいずれも必須ではないことに注意してください。 1つの<priority> </ priority>または<status> </ status>のみを送信できます...変更するのは送信す​​ることです。



応答として、サーバーは連絡先リストの全員にメッセージを送信します(より正確には、prescence type = "subscribe"コマンドを使用してサインアップしたユーザーに送信します。

--S:

<presence from='seriy.pr@jabber.ru/telnet' to='seriy.pr@jabber.ru/telnet'>

<priority>50</priority>

<show>chat</show>

<c xmlns="http://jabber.org/protocol/caps" node="http://gajim.org/caps" ext="xhtml cstates" ver="0.11.4" />

<status> </status>

<x xmlns="vcard-temp:x:update">

<photo>b2730e40aba4f7225456d0b4789bf2d5af34c3e3</photo>

</x>

</presence>






メッセージの送信/受信



メッセージ-メッセージの送受信用。 属性があります

宛先 -JID(リソースの有無にかかわらず)

送信者から -リソースを持つJID(別のものを置き換えることはできません:P)

メッセージタイプはリストのいずれかです:chat-プライベートチャットメッセージ(ICQなど、デフォルトで通常使用されます)、normal-単一のメッセージ、別のウィンドウで開き、同じメッセージ、groupchat(メッセージ会議中)、ヘッドライン(自動通知、RSSボットなどによって送信されたメッセージは別のウィンドウで開きますが、答えることはできません)、エラー-エラーメッセージはチャットウィンドウに特別な形式で表示されます

記事の著者にチャットメッセージを送信します。

--C:

< message to =" seriy . pr @ jabber . ru " from =" user1 @ jabber . ru / telnet " type =" chat " >

<!-- , -->

< body > -! </ body >

<!-- , « »/« »/« » .., -->

</ message >




(友達を怖がらせる-エラータイプのメッセージを送信する)



無効なステータスメーリング



セッションを正しく終了するために、通常、ステータスメッセージ「disconnected」(type =「unavailable」)が送信されます

--C:

<presence xmlns="jabber:client" type="unavailable" />





ストリームの閉鎖



このコマンドでストリームを閉じます

--C:

</stream:stream>





また、サーバーはストリームを閉じます

--S:

</stream:stream>





サーバーから切断する



接続は、サーバーのイニシアチブでストリームが閉じられた直後に閉じられます。



基本的には以上です。



続けて、私は考慮したいと思います:



参照:



私のブログからのクロスポスト

http://tools.ietf.org/html/rfc3920 rfc3920 XMPPプロトコルコア

http://tools.ietf.org/html/rfc3921 rfc3921 XMPPステータス、セッションなど

http://tools.ietf.org/html/rfc2831 rfc2831 SASL認証

http://www.bog.pp.ru/work/SASL.htmlロシア語のSASLについて少し

http://en.wikipedia.org/wiki/XMPP wikiのXMPP

Wikiのhttp://en.wikipedia.org/wiki/Jabber Jabber



All Articles