java - 使用 smack4.2 firebase xmpp 发送消息错误
Posted
技术标签:
【中文标题】java - 使用 smack4.2 firebase xmpp 发送消息错误【英文标题】:java - send message error using smack4.2 firebase xmpp 【发布时间】:2017-07-26 07:30:52 【问题描述】:我正在尝试发送消息。与 firebase xmpp 服务器的连接已完成。我正在使用最新的 smack 4.2。
public myClient(String senderId, String serverKey) throws IOException, NotConnectedException, InterruptedException
Roster.setRosterLoadedAtLoginDefault(false);
Jid jid ;
jid = JidCreate.from(HOST);
final XMPPTCPConnectionConfiguration conf = XMPPTCPConnectionConfiguration.builder()
.setCompressionEnabled(false)
.setSendPresence(false)
.setConnectTimeout(10000)
.setHost(HOST)
.setDebuggerEnabled(false)
.setPort(PORT)
.setXmppDomain((DomainBareJid) jid)
.setSocketFactory(SSLSocketFactory.getDefault())
.setUsernameAndPassword(senderId + "@gcm.googleapis.com", serverKey)
.build();
this.conn = new MyXMPPTCPConnection(conf);
try
conn.connect();
conn.login();
catch (XMPPException | InterruptedException | SmackException e)
throw new IOException(e);
Roster roster = Roster.getInstanceFor(conn);
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries)
System.out.println(entry);
Entity jEntity ;
Jid jid1 = JidCreate.from("text");
EntityBareJid jid21 = JidCreate.entityBareFrom("ak@gcm.googleapis.com");
Chat chat = ChatManager.getInstanceFor(conn)
.createChat(jid21);
Message newMessage = new Message();
String t = "hello this is a test message";
newMessage.setBody(t.toString());
/* ((Object) chat).send(newMessage);*/
chat.sendMessage(newMessage);
StanzaFilter filter = new AndFilter(new StanzaTypeFilter(Message.class));
//PacketCollector myCollector = conn2.createPacketCollector(filter);
// Normally, you'd do something with the collector, like wait for new packets.
StanzaListener myListener = new StanzaListener()
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException
System.out.println("packet = [" + packet + "]");
;
conn.addAsyncStanzaListener(myListener, filter);
while (true)
//conn2.disconnect();
当我运行此方法时出现以下错误
数据包 = [你好 这是一个测试 message25667738-6dd1-4c74-a64b-2fdbac74339bInvalidJson : 缺少有效载荷] 2017 年 7 月 26 日下午 12:52:46
org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader parsePackets 信息:MyXMPPTCPConnection[438277974557@gcm.googleapis.com/41CA77F0] (0) 收到关闭元素。服务器想要终止 连接,调用disconnect()
请查看并提出建议。 提前致谢。
【问题讨论】:
GCM Invalid JSON Missing Payload的可能重复 【参考方案1】:FCM XMPP 服务器使用 JSON 语法。因此,您需要使用this documentation 中为 FCM 有效负载描述的系统税。由于 XMPP 使用 XML,因此您需要将 JSON 负载嵌入到名为 gcm 的 xml 节点中,如下所示:
<gcm xmlns:google:mobile:data>
JSON payload
</gcm>
例如,您的 JSON 有效负载可能如下所示:
"to":"APA91bEXJvW4jUdxxxxx-xxxxxxxx",
"data":"message":"Hello",
"priority":"high"
有关使用 GCM/FCM 使用 XMPP 连接服务器的完整详细信息,请查看this documentation。
使用 Smack,您可以使用 GcmPacketExtension 创建一个类,以使用 json 有效负载创建 gcm 元素。
【讨论】:
以上是关于java - 使用 smack4.2 firebase xmpp 发送消息错误的主要内容,如果未能解决你的问题,请参考以下文章
Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba
如何在 Android 的 Smack 4.2 中了解 1:1 对话中的打字状态?
Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba