Java Android聊天应用程序,使用XMPP服务器和谷歌云消息(或更新的Firebase云消息)进行推送通知

Java Android聊天应用程序,使用XMPP服务器和谷歌云消息(或更新的Firebase云消息)进行推送通知,java,android,google-cloud-messaging,xmpp,firebase-cloud-messaging,Java,Android,Google Cloud Messaging,Xmpp,Firebase Cloud Messaging,我正在为Android开发一个聊天应用程序。我已经阅读了数周关于XMPP和Google云消息(以及Firebase云消息)的内容,但我仍然非常困惑 目前,我已经在本地安装了一个XMPP服务器(Ejabberd),并使用Smack库成功地将我的Android应用程序连接到它 据我所知,我需要使用GCM或更新的FCM进行推送通知,因此我已经在Google云平台上创建了一个项目。我的Android应用程序也可以使用Smack库连接到它(而不是直接连接到我的XMPP服务器)。在我的服务器中,我有一个小型

我正在为Android开发一个聊天应用程序。我已经阅读了数周关于XMPP和Google云消息(以及Firebase云消息)的内容,但我仍然非常困惑

目前,我已经在本地安装了一个XMPP服务器(Ejabberd),并使用Smack库成功地将我的Android应用程序连接到它

据我所知,我需要使用GCM或更新的FCM进行推送通知,因此我已经在Google云平台上创建了一个项目。我的Android应用程序也可以使用Smack库连接到它(而不是直接连接到我的XMPP服务器)。在我的服务器中,我有一个小型Java应用程序,它也使用Smack库连接到GCM

在这里之前一切都很好。我最大的困惑是:如何将我的XMPP服务器与GCM一起用于推送通知?我为服务器端实现找到的所有文档、示例、指南和教程都告诉我如何连接到GCM,但没有人告诉我如何将XMPP服务器与GCM一起使用我错过了什么?我的Java应用程序只是连接到GCM,从GCM接收和发送消息,但我的XMPP服务器只是坐在那里无所事事。实际上,我的Android应用程序和服务器Java应用程序只使用GCM,而不是我的XMPP服务器。


我希望有人能帮助我从整体上理解这一点,我显然缺少了实现这一实现的一些关键元素。

您应该设置一个连接到FCM(以前的GCM)的Java服务器。然后,您可以从您的设备向FCM发送上行消息,FCM随后将该上行消息发送到您的java服务器,然后在该java服务器内,您可以处理该上行消息以向目标设备发送下行消息。然后在设备端,您可以处理接收到的那些下游消息,以发出推送通知

以下是一些有用的链接:

如何发送上行消息:


如何接收和处理下游消息:


如何设置示例Java服务器:

你需要将Ejabberd和FCM混合在一起,所有大型聊天应用程序都是这样做的。对于最基本的部分,有3个组件:通过XMPP连接到FCM的应用程序服务器、Ejabberd和您的客户端应用程序

  • 当应用程序位于前台时,您可以使用Smack library直接连接到Ejabberd服务器、发送消息、更改用户状态等。在此期间,与Ejabberd的连接将保持。您在此期间不发送上游消息
  • 一旦用户离开你的应用,你就关闭连接。用户现在被认为是“离开”或“离线”
  • 从这一点开始,您的应用程序服务器与FCM通信,并使用Smack库向设备发送下游消息
  • 在客户端设备上:处理传入消息并显示通知。使用安卓N,用户可以直接从通知中回复。我假设在这种情况下,您将使用FCM向您的应用程序服务器发送一条上游消息,因为在此期间,您的Ejabberd服务器没有活动连接
  • 一旦用户点击通知,应用程序将返回前台,您将重新连接到Ejabberd,然后返回到步骤1

  • 这是实现所需的体系结构的基本描述。

    这是一个示例java项目,用于展示Firebase云消息传递(FCM)XMPP连接服务器。这个项目是一个非常简单的独立服务器,我是作为一个更大项目的基础开发的。它是我们必须在环境中实现的应用程序服务器。该服务器使用XMPP协议通过FCM CCS服务器向客户端应用程序发送数据

    我还在youtube上制作了一段视频,解释它的功能


    希望您觉得它有用。

    我还在Android中使用Smack v.4.1.8构建聊天应用程序,该版本是Smack的最新版本,我们的服务器使用ejabberd。我不会使用任何第三方(如GCM或Firebase)将下游消息从用户推送到用户消息。若我并没有错,你们将使用GCM或Firebase来推送用户对用户的消息,若有,就不要这样做

    为什么?? TCP协议是保持侦听一个调用侦听器,当连接建立并仍然连接时,您在应用程序中注册了该侦听器。Smack有一个名为“addAsyncStanzaListener()的侦听器”

    addAsyncStanzaListener用于侦听应用程序中的接收数据包。他们有

     public void processPacket(Stanza packet) 
    
    您可以调用它,并在一段时间内监听数据包

    我做了一项关于保持Smack稳定连接的研究。大多数安卓智能手机都有各自的配置和限制。我们无法测试所有设备。 以下是我保持连接稳定的建议:

  • 使用ForegroundService而不是BackgroundService,我提出这种方法是因为大多数Android设备对在后台运行的应用程序都有限制。当应用程序从任务管理器中滑动时,他们将杀死应用程序。(例如,华硕zenphone具有电源管理功能)
  • ForegroundService将阻止应用程序处于空闲状态
  • 注册重新连接管理器
  • 寄存器ping失败
  • 使用AlarmManager注册服务器ping
  • 就这样。如有任何疑问,请在下面发表评论:)

    致意
    R Aditya Gumay

    您的建议适用于tcp/ip连接永不中断。在移动3G/4G网络中,情况并非如此。因此,在真正的3G/4G网络中,移动客户端/应用程序可能处于僵尸状态(断开连接)。
    这就是为什么您需要Firebase/FCM来玩。

    非常感谢您的回答,但我仍然感到困惑。我已经有了一个连接到FCM的Java服务器(非常类似于该链接的代码),但是它在没有XMPP服务器的情况下工作,它只是使用FCM处理所有事情。我缺少什么?FCM有两个受支持的协议HTTP和XMPP。H