2

私は Android バージョンの Smack API を使用しており、以前に登録されていない場合に備えて、それ自体を自動登録するクライアントを開発しています。

ユーザーを手動で登録してクライアントにログインすると、すべてが機能します。しかし、クライアントに新しいユーザーを作成させることはできません。コードの一部は次のとおりです。

try {
    conn1.connect();
    // (Try to) Log into the server
    try{
        conn1.login(imei, XMPP_ACCOUNT_PASSWORD);
    }catch (XMPPException ex){
        // Probably not registered
        createdAccount = checkAndRegister(conn1);
    }
    if (createdAccount){
        conn1.login(imei, XMPP_ACCOUNT_PASSWORD);
        ChatManager chatmanager = conn1.getChatManager();
        serverConversation = chatmanager.createChat(SERVER_USERNAME_FULL, this);
        serverConversation.addMessageListener(this);                
} catch (XMPPException e) {
    Log.e(TAG, "Error al comunicarse con XMPP.");
    e.printStackTrace();
}

public boolean checkAndRegister(XMPPConnection currentConn){
    if (!currentConn.isAuthenticated()){
        AccountManager acManager = currentConn.getAccountManager();
        try {
            acManager.createAccount(imei, XMPP_ACCOUNT_PASSWORD);
        } catch (XMPPException e) {
            Log.e(TAG, "No se puede autoregistrar la cuenta de XMPP. " + e.getLocalizedMessage());
            return false;
        }
        return true;
    }else{
        return true;
    }
}

そして、これがサーバー ログから取得したトレース os スタンザです。これらの特定の 4 がプロセス全体を示していると思われますが、私が間違っていると思われる場合は修正してください。

<packet xmlns="http://www.jivesoftware.org" streamID="c0057471" status="connected" timestamp="oct 25,2011 04:43:52:207 PM">
  <iq xmlns="" id="D1Dq5-2" to="www.fundacionvf.es" type="get">
    <query xmlns="jabber:iq:register" />
  </iq>
</packet>
<packet xmlns="http://www.jivesoftware.org" streamID="c0057471" status="connected" timestamp="oct 25, 2011 04:43:52:208 PM">
  <iq xmlns="" type="result" id="D1Dq5-2">
    <query xmlns="jabber:iq:register">
      <username />
      <password />
      <email />
      <name />
      <x xmlns="jabber:x:data" type="form">
        <title>XMPP Client Registration</title>
        <instructions>Please providethe following information</instructions>
        <field var="FORM_TYPE" type="hidden">
          <value>jabber:iq:register</value>
        </field>
        <field var="username" type="text-single" label="Username">
          <required />
        </field>
        <field var="name" type="text-single" label="Full name" />
        <field var="email" type="text-single" label="Email" />
        <field var="password" type="text-private" label="Password">
          <required />
        </field>
      </x>
    </query>
  </iq>
</packet>
<packet xmlns="http://www.jivesoftware.org" streamID="c0057471" status="connected" timestamp="oct 25, 2011 04:43:52:265 PM">
  <iq xmlns="" id="D1Dq5-3" to="www.fundacionvf.es" type="set">
    <query xmlns="jabber:iq:register">
      <email />
      <password />
      <username />
      <name />
    </query>
  </iq>
</packet>
<packet xmlns="http://www.jivesoftware.org" streamID="c0057471" status="connected" timestamp="oct 25, 2011 04:43:52:265 PM">
  <iq xmlns="" type="error" id="D1Dq5-3" to="www.fundacionvf.es/c0057471">
    <query xmlns="jabber:iq:register">
      <email />
      <password />
      <username />
      <name />
    </query>
    <error code="500" type="wait">
      <internal-server-error xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
    </error>
  </iq>
</packet>

私の推測が正しければ、最後のエラー タグが問題の鍵になるはずですが、それはどういう意味ですか?

PD: もちろん、OpenFire 構成でクライアント側の登録を有効にするようにしました。
編集: 私の問題をさらに調査した後、いくつかの質問が出てきました:
1.<iq xmlns="" id="D1Dq5-3" to="www.fundacionvf.es" type="set">タグには登録情報が含まれているはずですか?
2. 2 番目のスタンザにリストされているすべてのフィールドは、登録に必須ですか?

よろしく。

4

1 に答える 1

2
  1. はい、または代わりに、http: //xmpp.org/extensions/xep-0077.htmlのユースケースに示されているように、最初のパケットで提示されたフォームをサーバーに送信できます。
  2. 仕様によると、クライアントはサーバーに必須フィールドを照会するため、おそらくそうです。しかし、フォームで必須としてタグ付けされたものだけが実際にサーバーの実装に必要であると推測できます。そうでない場合、違いは意味がありません。
于 2011-10-26T14:14:07.113 に答える