Do tego celu można użyć packet extension: niestety nie ma dobrej dokumentacji ani przykładów użycia rozszerzeń pakietów. Wcześniej patrzyłem na this unresolved question, który ma przykładowy kod, ale nie byłem w stanie go uruchomić: nie mam wyjątków, ale po prostu nie zadziałało, ponieważ moje rozszerzenie nie zostało wywołane i przeszedłem do kodowania moich danych w ciele wiadomości.
EDYCJA: dla potomności, udało mi się uzyskać następujący kod działa. Używa klas DOM4J: DocumentHelper
i Element
.
Presence np, packet = new Presence();
packet.setID(sessionManager.nextStreamID().toString());
packet.setFrom(server.createJID(operator, null));
if(!available) packet.setType(Presence.Type.unavailable);
else packet.setType(null);
// add the custom XML
Element xml = DocumentHelper.createElement(QName.get("custom", "http://www.custom.com/xmpp"));
xml.addAttribute("type", "presenceupdate");
packet.addExtension(new PacketExtension(xml));
Lekko humorystyczny: Pobiegłem do mojego własnego odpowiedź rok później, podczas gdy faktycznie próbuje rozwiązać ten problem dla prawdziwego projektu (w przeciwieństwie do majsterkowania jak ja wcześniej), a ponieważ nie mogłem po prostu porzucić to ja musiałem to rozgryźć. Sądzę, że będę potrzebować tej odpowiedzi, więc oto jest. SO: moja pamięć na niebie.
EDIT: Znalazłem jeszcze prostszy sposób to zrobić:
Element xml = packet.addChildElement("custom", "http://www.custom.com/xmpp");
xml.addAttribute("type", "presenceupdate");
Warto zauważyć: próbuje dodać pewne rzeczy (w moim przypadku, próbując dodać opóźnienie elementu) spowodowało w pakiecie nie prowadzony. Coś w Openfire połknęło to, więc to jest coś, na co trzeba uważać.
jako [wspomnianym przez Robin] (http://stackoverflow.com/a/6390037/194894): Nigdy nie dodawać atrybutów niestandardowych do góry elementy Stanza poziomu. Zobacz także [XEP-134] (http://xmpp.org/extensions/xep-0134.html#xmpp). Często popełniany jest błąd. – Flow
Nie ma znaczenia, dlaczego tak jest. NIGDY NIE NALEŻY ZROBIĆ! – Robin