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 发送消息错误的主要内容,如果未能解决你的问题,请参考以下文章

smack 普通 SASL 到 jabberd

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

如何在 Smack 4.2 中使用证书

使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点