Błąd usługi OpenFire / XMPP 503 niedostępny (XEP-0065 przy użyciu iOS XMPPFramework)

Problem : Próbuję nawiązać połączenie TURN (XEP-0065) przy użyciu iOS XMPPFramework i serwera OpenFire. Chcę móc wysyłać i odbierać pliki. Jednak otrzymuję błąd 503 niedostępności usługi.

Uwaga : Baza mojego kodu pochodzi z następującego samouczka:http://mobile.tutsplus.com/tutorials/iphone/building-a-jabber-client-for-ios-server-setup/

Błąd XML :

Debugowałem przez TURNSocket.m. Przechodzi do processRequestResponse i ma następujący XML. (Jeśli się nie mylę, to zostało wysłane z OpenFire do mnie, a nie odwrotnie?) ...

<iq xmlns="jabber:client"
    type="error" 
    id="03CC977E-2645-4E87-AE78-536D985CA2B5" 
    from="friendsUsername@beta.myCompany.co.uk"
    to="myUsername@beta.myCompany.co.uk/12f10b69">
    <query xmlns="http://jabber.org/protocol/bytestreams" 
        sid="03CC977E-2645-4E87-AE78-536D985CA2B5"
        mode="tcp">
        <streamhost jid="proxy.beta.myCompany.co.uk"
            host="127.0.1.1"
            port="7777"/>
    </query>
    <error code="503"
        type="cancel">
        <service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
    </error>
</iq>

Dlaczego jest błąd?

Aktualizacja : XEP-0065&nbsp;mówi następująco. Nawet jeśli ten błąd wygląda trochę inaczej niż mój, czy ma to znaczenie? Jeśli tak, jaki jest problem?

Jeśli Proxy nie może działać jako StreamHost, Proxy MUSI zwrócić błąd do Requester, który POWINIEN być<not-allowed/>.

<iq from='requester@example.com/foo'
    id='uj2c15z9'
    to='streamer.example.com'
    type='error'>
  <error type='cancel'>
    <not-allowed 
        xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</iq>

Aktualizacja&nbsp;: W tej chwili zastanawiam się, czy problem polega na włączeniu lub wyłączeniu zasobu JID w różnych wysyłanych i pobieranych bitach XML. Lub, alternatywnie, nie mam nawet „from” w następującym xml. doktorzy sugerują, że potrzebuję tego. Czy to jest ten problem? Nie widzę aktualnego sposobu w kodzie, aby zrobić „z” ...

<iq type="get" 
    to="beta.myCompany.co.uk"
    id="215784CF-81A8-403E-89BF-455C926BEAE5">
    <query xmlns="http://jabber.org/protocol/disco#items"/>
</iq>

Aktualizacja 19/04/12 11:00&nbsp;: W odpowiedzi na odpowiedź Matta J. publikuję więcej XML. Nie jestem pewien, czy Matt zażądał pełnego dziennika XML tego, co jest wysyłane i pobierane, ale na wszelki wypadek tutaj. Zauważ, że te dzienniki nie są wszystkie z tego samego uruchomienia (ponieważ kiedy debuguję je, aby uzyskać dzienniki XML, powoduje to przekroczenie limitu czasu, więc muszę zacząć od nowa)

Wysłane :

<iq type="get" to="beta.myCompany.co.uk" 
    id="082A1987-384F-43CD-9E7B-A2C0E31F2CA8">
    <query xmlns="http://jabber.org/protocol/disco#items"/>
</iq>

Odpowiedź :

<iq xmlns="jabber:client" 
    type="result" 
    id="18EED477-B0E4-492D-89CF-CA692FCF13AD"
    from="beta.myCompany.co.uk" 
    to="myUsername@beta.myCompany.co.uk/72d23cd0">
    <query xmlns="http://jabber.org/protocol/disco#items">
        <item jid="pubsub.beta.myCompany.co.uk" 
            name="Publish-Subscribe service"/>
        <item jid="broadcast.beta.myCompany.co.uk" 
            name="Broadcast service"/>
        <item jid="search.beta.myCompany.co.uk" 
            name="User Search"/>
        <item jid="conference.beta.myCompany.co.uk" 
            name="Public Chatrooms"/>
        <item jid="proxy.beta.myCompany.co.uk" 
            name="Socks 5 Bytestreams Proxy"/>
    </query>
</iq>

Wysłane :

<iq type="get" 
    to="proxy.beta.myCompany.co.uk" 
    id="F1B5370C-234F-4F2D-93E7-D60D2C35D063">
    <query xmlns="http://jabber.org/protocol/disco#info"/>
</iq>

Odpowiedź :

<iq xmlns="jabber:client" 
    type="result" 
    id="F1B5370C-234F-4F2D-93E7-D60D2C35D063"
    from="proxy.beta.myCompany.co.uk" 
    to="myUsername@beta.myCompany.co.uk/32276f6">
    <query xmlns="http://jabber.org/protocol/disco#info">
        <identity category="proxy" 
            name="SOCKS5 Bytestreams Service" 
            type="bytestreams"/>
            <feature var="http://jabber.org/protocol/bytestreams"/>
            <feature var="http://jabber.org/protocol/disco#info"/>
    </query>
</iq>

Wysłane :

<iq type="get" 
    to="proxy.beta.myCompany.co.uk" 
    id="84904B7D-2BB2-4B8E-90BE-BE0F5A934764">
    <query xmlns="http://jabber.org/protocol/bytestreams"/>
</iq>

Odpowiedź :

<iq xmlns="jabber:client" 
    type="result" 
    id="B412512B-FA27-4531-88BE-2FC0A26E6ED2"
    from="proxy.beta.myCompany.co.uk" 
    to="myUsername@beta.myCompany.co.uk/45ca808d">
    <query xmlns="http://jabber.org/protocol/bytestreams"/>
</iq>

dodatkowo otrzymujemy streamhost z kodu z zapytania takiego jak to:NSXMLElement *streamhost = [query elementForName:@"streamhost"];

<streamhost xmlns="http://jabber.org/protocol/bytestreams"
    jid="proxy.beta.myCompany.co.uk"
    host="127.0.1.1" 
    port="7777"/>

Wysłane :

<iq type="set" 
    to="friendsUsername@beta.myCompany.co.uk/spark" 
    id="DD96A581-BFA3-47BC-A3C0-D26AD48D7442">
    <query xmlns="http://jabber.org/protocol/bytestreams" 
        sid="DD96A581-BFA3-47BC-A3C0-D26AD48D7442" 
        mode="tcp">
        <streamhost xmlns="http://jabber.org/protocol/bytestreams"
            jid="proxy.beta.myCompany.co.uk" 
            host="127.0.1.1"
            port="7777"/>
    </query>
</iq>

To nie daje żadnej odpowiedzi, ale wygląda mi dobrze, gdy porównuję się do przykładu 17 zXEP-0065. JEDNAK, jeśli nie uwzględni zasobu na jID przekazanym do TurnSocket.m (nazwa_użytkownika@beta.myCompany.co.uk zamiast nazwa_użytkownika@beta.myCompany.co.uk/spark), to żądanie wysłania zmieni się odpowiednio

<iq type="set"
     to="friendsUsername@beta.myCompany.co.uk" **LOOK! NO RESOURCE!**
     id="5D08B85E-CA78-4AA8-A893-C1DC571A9808">
     <query xmlns="http://jabber.org/protocol/bytestreams" 
        sid="5D08B85E-CA78-4AA8-A893-C1DC571A9808" 
        mode="tcp">
        <streamhost xmlns="http://jabber.org/protocol/bytestreams"
            jid="proxy.beta.myCompany.co.uk"
            host="127.0.1.1"
            port="7777"/>
      </query>
</iq>

i XML w moim oryginalnym pytaniu powyżej jest zwracany! (z kodem błędu 503). Ponadto zauważam, że ten xml zawiera „streamhost”, ale na tym etapie powinien rzeczywiście zawierać „streamhost-used”? Dlaczego jest błąd? Czy powinienem czy nie powinienem włączyć zasobu do „do”?

Mniejsza aktualizacja 19/04/2012 15:07&nbsp;: Dodałem xmpp.proxy.transfer.required jako false w OpenFire. Wynika to z tych dyskusji:tutaj&nbsp;itutaj. Nie skonfigurowałem tego serwera (mój kolega to zrobił) i nie rozumiem, co to znaczy, ale wydaje się, że nie wpłynęło to na mój problem.

Aktualizacja 20/04/2012 10:00&nbsp;: Mój błąd 503 uważam za słuszny, gdy nie uwzględniam zasobu (zgodnie zto). Nawet jeśli tak jest, nie jestem pewien, dlaczego nie otrzymuję żadnej odpowiedzi z pełnym jID.