Smackを使用して2つの異なるAndroidデバイスから同じJabberアカウントにログインする
質問
SMACK APIを使用してXMPPサーバーに接続するAndroidでアプリケーションを開発しました。このアプリケーションでは、ユーザーサインイン情報IEユーザー名とパスワードをハードコードしました。
xmpp.login( "admin"、 "tigase");
そして、別のユーザーからパケットを取得します
packetfilter filter = new andFilter(new PacketTypefilter(message.class)、new fromContainsFilter( "ameya@mwbn43-1"));
今、私は2つの異なるAndroidデバイスで同じアプリを実行すると、1つのデバイスが他のデバイスの資格情報を上書きし、したがってデータを送信しようとしているとき、そのうちの1つだけがそれを取得するという問題に直面しています。 AFAIKは通常のGoogleチャットで、2つの異なる場所から同じアカウントにログインすることができ、同時に両方の場所でメッセージを受信できます。
誰かが私に何が問題になるのか教えてもらえますか?それはSmack APIと関係がありますか?
ありがとう、
アメヤ
解決
あなたがしなければならないことは、あなたがログインするときに異なるリソースを設定することです
xmpp.login("admin", "tigase", "a random string here");
リソースは、TCPポートと概念が似ています。これを参照してください リンク. 。リソース文字列の使用方法を使用して、デバイスを同じアカウントにログインすることを区別します。デスクトップでは、リソースがAndroidの「デスクトップ」と「Android」などです。しかし、あなたの場合、2つのAndroidデバイスがあるため、リソースを事前に設定することはできません。アカウント名やIMEI番号など、Androidデバイスで一意の識別子文字列を使用することをお勧めします。
リソース文字列を使用すると、特定のユーザーに送信できます。
admin@server/12345
ここで、12345はあなたのリソースです
admin@server
すべてのログインユーザーに。
アプリケーションでリソース文字列を使用していない場合は、使用できます StringUtils.randomString(20)
20文字のランダムな文字列を生成します。 StringUtils
Smackパッケージに記載されています。
他のヒント
一般的なルールとして、Jabberメッセージはサーバーに接続されている最後のデバイスに送信されるため、接続している場合
youruser@yourserver.org
2つの異なるデバイスから、後で接続するデバイスはメッセージを取得するものです。
ただし、リソースを指定すると、すべてが簡単になるため、ラップトップと携帯電話から接続されているとしましょう。リソースを使用して、完全なJID(Jabber ID)でログインできます。
youruser@yourserver.org/laptop
youruser@yourserver.org/cellphone
これで、携帯電話から接続されたクライアントが特別に受信するJabberメッセージを送信する場合は、「youruser@yourserver.org」の代わりに、メッセージが「youruser@yourserver.org/cellphone」に送信されるようにしてください。
アイテムを1つのデバイスに配信する唯一のデバイスではなく、1つのデバイスに配信される理由は、Googleチャットとは異なり、TigaseがXEPを追跡し、最優先度(または優先度がある場合に最後にログインしたデバイスにメッセージを配信しているためです。同じ。)
JIDを特定のリソースにバインドし、要求したリソースが実際に割り当てられていることを確認するときは、注意する必要があります。サーバーは、既存のJIDの定義されたリソースと競合するため、それを提供しない場合があります。
Googleチャットサーバーは、リソースや優先度の設定に関係なく、接続されたJIDにメッセージを配信するという点で「特別」なことを行います。設計による動作を許可するためにいくつかの変更が提案されていますが、それらはまだXSFによってまだ受け入れられていません。
すべての接続されたデバイスにメッセージを配信したい場合は、TigaseサーバーでPubSubノードの作成を検討し、ノードをオンラインJIDに配信するように設定することをお勧めします。オンラインの場合はノード。