Java 如何在jsmpp中将消息分离到第三方绑定

Java 如何在jsmpp中将消息分离到第三方绑定,java,sms,smpp,jsmpp,Java,Sms,Smpp,Jsmpp,我正在使用jsmpp库开发一个sms网关 这是我的设想 我通过两个连接绑定到SMSC(电信公司),并通过SMSC分配给我的两个短码(例如30002和30003)接收消息 然后,第三方绑定者(参与批量短信推送的公司)通常应该直接绑定到SMSC通过连接到我的SMPP服务器(作为对他们排序的SMSC绑定到我的网关) 第三方活页夹将消息发送到SMPP服务器,我捕获这些消息,将它们排队并发送到主SMSC(电信公司) 然后,电信公司用交付报告和来自批量消息报告的消息以及我转发给第三方绑定器的其他数据进行响应

我正在使用jsmpp库开发一个sms网关

这是我的设想

我通过两个连接绑定到SMSC(电信公司),并通过SMSC分配给我的两个短码(例如30002和30003)接收消息

然后,第三方绑定者(参与批量短信推送的公司)通常应该直接绑定到SMSC通过连接到我的SMPP服务器(作为对他们排序的SMSC绑定到我的网关)

第三方活页夹将消息发送到SMPP服务器,我捕获这些消息,将它们排队并发送到主SMSC(电信公司)

然后,电信公司用交付报告和来自批量消息报告的消息以及我转发给第三方绑定器的其他数据进行响应

当我只有1个第三方活页夹时,此场景非常有效

但现在我们想处理一个更一般的情况,即我们有许多第三方活页夹

由于我只有2个可用的短代码可供SMSC转发消息给我,我如何知道哪个第三方绑定器拥有SMSC响应

我有一个讨厌且低效的选择,将回复转发给所有关联的第三方


除了上述选项之外,唯一的另一个选项是为每个第三方活页夹从SMSC获取不同的短代码,这对于我的场景来说并不划算。

首先,您可以很容易地将所有DLR转发给正确的第三方。为了做到这一点,您必须在您选择的数据库中存储一些额外的数据(如果您只有1个应用程序节点和低流量,即使SQLite也足够;否则,请考虑一些NoSQL解决方案):

  • 每次从电信SMSC收到submit\u sm\u resp数据包时,开始存储一对(实际上是键值)
    message\u id->third\u party\u id
  • 每次您从SMSC收到deliver\u sm数据包时,从数据包中检索
    消息\u id
    ,然后在数据库中查找此
    消息\u id
    ,以找到要转发给哪个第三方
  • 在成功转发该
    消息\u id
    的最终DLR后,考虑删除该
    消息\u id->第三方\u id

  • MO消息的情况更糟。为多个客户端(第三方)使用单一短代码的唯一可能(但非常糟糕)的方法是在数据上使用TTL和超时的脆弱组合。只有当您期望的每个MO都是对以前的MT消息的回复时,它才有意义

  • 使用
    TLV
    或额外的
    SMPP链接
    从接收器分离需要回复的传入MT。让我们把这些问题称为MTs
  • 处理
    问题
    如下:
  • 按如下方式处理MO消息(
    答案
    ):
  • UPD。文本精化 为了知道MO消息的正确第三方(不是交付报告),您需要一些关于消息收件人的附加信息。此信息可能来自第三方或订阅者(首先发起MO消息的订阅者)。我的图表正式描述了第三方向您提供此信息的情况

  • 第三方向您发送一条MT消息,他们希望收件人能够回答该消息
  • 您在数据库中记下,如果收件人在接下来的N分钟内向您发送MO消息,则应将此
    应答
    转发给上述第三方


  • 很抱歉,我的回答不是针对
    jsmpp
    的,但我对该库知之甚少,但是,我也相信,一旦您理解了算法,无论您使用何种工具,实现该算法都应该相当容易。

    请澄清,您是否需要转发源自移动的消息(如“订户已向第三方发送
    test123
    至30002”)或仅发送报告?此外,请说明您的第三方使用的数据包类型以及您在电信SMSC中使用的数据包类型(提交sm、数据sm等)我正在将生产任务单和生产任务单转发给第三方。第三方使用submit_sm将他们的消息推送给我,我使用jsmpp的提交方法将这些消息转发给SMSC。我使用onAcceptDeliverSm方法从SMSC获取生产任务单和生产任务单,并将它们转发给第三方。对于我转发给SMSC的给定消息,是messageId retursmsc发送的消息ID与消息到达目的地后smsc与deliver\u sm一起发送的消息ID相同吗?是的,是的。至少,我遇到的每个电信运营商都是这样。但是请注意,messageId和sequenceId不是一回事。如果消息ID匹配,则基本上解决了问题转发到SMSC的消息有问题。我正在尝试查看您的解决方案如何应用于MOs和其他此类消息。我将接受您的回答,感谢您的努力。非常感谢。但是您不认为我应该使用类似于地图的东西来存储id对吗?而不是数据库建议?地图听起来不错,但您必须存储它在某种数据库中。如果你把它留在内存中,一旦你的应用程序停止,它就会丢失(不管是因为什么原因:崩溃还是有意停止)。至于MOs,请随意询问我的解决方案中不明显的地方,我很乐意详细说明。