smpp客户端

这篇文章通过创建一个简单的SMPP客户端向移动用户发送短信来提供SMPP Java示例,使用该客户端我们可以简单地提交以将消息发送给单个移动用户,也可以一次将消息广播给多个移动用户。另外,我们将验证交货收据。 出于客户端的目的,我们将使用现有的Java SMPP客户端库– jSMPP

什么是SMPP

SMPP代表短消息对等。 它是一种开放的行业标准协议,旨在为短消息数据的传输提供灵活的数据通信接口。大多数时候,SMPP用于批量传送短消息,您可以一次将消息广播给数千个订户。不仅限于短消息,我们还可以携带语音邮件通知,小区广播,WAP消息(包括WAP Push消息)

SMPP操作

SMPP使用客户机/服务器操作模型。在向SMPP提交任何消息之前,我们发送一个bind命令。 在此示例中,我们将发送bind_transmitter,因为我们仅对向服务器提交消息感兴趣。 除了bind_transmitter以外,其他bind命令是bind_receiver,这意味着客户端将仅接收消息,bind_transceiver允许双向传输消息。

SMPP操作的完整细节不在本文讨论范围之内。 如果您想详细了解操作,请访问– SMPP Wiki

使用jSMPP

要开始使用SMPP客户端,我们将使用jSMPP。 要将jSMPP包含在您的项目中,请将以下maven依赖项添加到pom.xml中

pom.xml

<dependency><groupId>org.jsmpp</groupId><artifactId>jsmpp</artifactId><version>2.3.5</version>
</dependency>

SMPP多次提交示例

正如我们讨论的那样,SMPP可用于向单个或多个订户发送消息。以下是向多个移动订户发送消息的示例。第一步是使用主机名,用户名和密码向服务器发送绑定命令。 我们正在initSession()中执行此操作。 完成此操作后,将创建SMPP会话,然后我们可以使用此会话发送消息。

相应的提供程序将提供不同的参数,例如ip,主机,用户名,密码。

MultipleSubmitExample.java

public class MultipleSubmitExample {private static final Logger LOGGER = LoggerFactory.getLogger(MultipleSubmitExample.class);private static final TimeFormatter TIME_FORMATTER = new AbsoluteTimeFormatter();private final String smppIp = "127.0.0.1";private int port = 8086;private final String username = "localhost";private final String password = "password";private final String address = "AX-DEV";private static final String SERVICE_TYPE = "CMT";public void broadcastMessage(String message, List numbers) {LOGGER.info("Broadcasting sms");SubmitMultiResult result = null;Address[] addresses = prepareAddress(numbers);SMPPSession session = initSession();if(session != null) {try {result = session.submitMultiple(SERVICE_TYPE, TypeOfNumber.NATIONAL, NumberingPlanIndicator.UNKNOWN, address,addresses, new ESMClass(), (byte) 0, (byte) 1, TIME_FORMATTER.format(new Date()), null,new RegisteredDelivery(SMSCDeliveryReceipt.FAILURE), ReplaceIfPresentFlag.REPLACE,new GeneralDataCoding(Alphabet.ALPHA_DEFAULT, MessageClass.CLASS1, false), (byte) 0,message.getBytes());LOGGER.info("Messages submitted, result is {}", result);Thread.sleep(1000);} catch (PDUException e) {LOGGER.error("Invalid PDU parameter", e);} catch (ResponseTimeoutException e) {LOGGER.error("Response timeout", e);} catch (InvalidResponseException e) {LOGGER.error("Receive invalid response", e);} catch (NegativeResponseException e) {LOGGER.error("Receive negative response", e);} catch (IOException e) {LOGGER.error("I/O error occured", e);} catch (Exception e) {LOGGER.error("Exception occured submitting SMPP request", e);}}else {LOGGER.error("Session creation failed with SMPP broker.");}if(result != null && result.getUnsuccessDeliveries() != null && result.getUnsuccessDeliveries().length > 0) {LOGGER.error(DeliveryReceiptState.getDescription(result.getUnsuccessDeliveries()[0].getErrorStatusCode()).description() + " - " +result.getMessageId());}else {LOGGER.info("Pushed message to broker successfully");}if(session != null) {session.unbindAndClose();}}private Address[] prepareAddress(List numbers) {Address[] addresses = new Address[numbers.size()];for(int i = 0; i< numbers.size(); i++){addresses[i] = new Address(TypeOfNumber.NATIONAL, NumberingPlanIndicator.UNKNOWN, numbers.get(i));}return addresses;}private SMPPSession initSession() {SMPPSession session = new SMPPSession();try {session.setMessageReceiverListener(new MessageReceiverListenerImpl());String systemId = session.connectAndBind(smppIp, Integer.valueOf(port), new BindParameter(BindType.BIND_TX, username, password, "cp", TypeOfNumber.UNKNOWN, NumberingPlanIndicator.UNKNOWN, null));LOGGER.info("Connected with SMPP with system id {}", systemId);} catch (IOException e) {LOGGER.error("I/O error occured", e);session = null;}return session;}public static void main(String[] args) {MultipleSubmitExample multiSubmit = new MultipleSubmitExample();multiSubmit.broadcastMessage("Test message from devglan", Arrays.asList("9513059515", "8884377251"));}
}

在创建SMPP会话时,我们已经注册了消息接收方侦听器,该侦听器将用于获取消息的传递收据。 以下是示例。

MessageReceiverListenerImpl.java

public class MessageReceiverListenerImpl implements MessageReceiverListener {private static final Logger LOGGER = LoggerFactory.getLogger(MessageReceiverListenerImpl.class);private static final String DATASM_NOT_IMPLEMENTED = "data_sm not implemented";public void onAcceptDeliverSm(DeliverSm deliverSm) throws ProcessRequestException {if (MessageType.SMSC_DEL_RECEIPT.containedIn(deliverSm.getEsmClass())) {try {DeliveryReceipt delReceipt = deliverSm.getShortMessageAsDeliveryReceipt();long id = Long.parseLong(delReceipt.getId()) & 0xffffffff;String messageId = Long.toString(id, 16).toUpperCase();LOGGER.info("Receiving delivery receipt for message '{}' from {} to {}: {}",messageId, deliverSm.getSourceAddr(), deliverSm.getDestAddress(), delReceipt);} catch (InvalidDeliveryReceiptException e) {LOGGER.error("Failed getting delivery receipt", e);}}}public void onAcceptAlertNotification(AlertNotification alertNotification) {LOGGER.info("AlertNotification not implemented");}public DataSmResult onAcceptDataSm(DataSm dataSm, Session source)throws ProcessRequestException {LOGGER.info("DataSm not implemented");throw new ProcessRequestException(DATASM_NOT_IMPLEMENTED, SMPPConstant.STAT_ESME_RINVCMDID);}
}

SMPP交货收据

SMPP提供了许多标准的交货收据错误代码来标识交货收据。 我们几乎没有采取任何措施来识别实际的收货信息。有关完整的详尽清单,请遵循– smpperrorcodes

DeliveryReceiptState.java

package com.devglan.smpp;public enum DeliveryReceiptState {ESME_ROK(0, "Ok - Message Acceptable"),ESME_RINVMSGLEN(1, "Invalid Message Length"),ESME_RINVCMDLEN(2, "Invalid Command Length"),ESME_RINVCMDID(3, "Invalid Command ID"),ESME_RINVBNDSTS(4, "Invalid bind status"),ESME_RALYBND(5,  "Bind attempted when already bound"),ESME_RINVPRTFLG(6, "Invalid priority flag"),ESME_RINVREGDLVFLG(7, "Invalid registered-delivery flag"),ESME_RSYSERR(8,    "SMSC system error"),ESME_RINVSRCADR(9, "Invalid source address"),ESME_RINVDSTADR(11, "Invalid destination address"),ESME_RINVMSGID(12, "Invalid message-id"),NOT_FOUND(000, "Couldn't resolve.Ask admin to add.");private int value;private String description;DeliveryReceiptState(int value, String description) {this.value = value;this.description = description;}public static DeliveryReceiptState getDescription(int value) {for (DeliveryReceiptState item : values()) {if (item.value() == value) {return item;}}return NOT_FOUND;}public int value() {return value;}public String description() {return description;}}

SMPP单一提交示例

jSMPP为单个提交提供了commitShortMessage()。以下是实现。 源代码中提供了完整的实现。

String messageId = session.submitShortMessage(SERVICE_TYPE,TypeOfNumber.NATIONAL, NumberingPlanIndicator.UNKNOWN, address,TypeOfNumber.NATIONAL, NumberingPlanIndicator.UNKNOWN, number,new ESMClass(), (byte)0, (byte)1,  TIME_FORMATTER.format(new Date()), null,new RegisteredDelivery(SMSCDeliveryReceipt.FAILURE), (byte)0, new GeneralDataCoding(Alphabet.ALPHA_DEFAULT, MessageClass.CLASS1, false), (byte)0,message.getBytes());

结论

这是Java中SMPP客户端实现的简单示例。 在下一篇文章中,我们将讨论其模拟器。

翻译自: https://www.javacodegeeks.com/2018/03/smpp-java-exampleclient.html

smpp客户端

smpp客户端_SMPP Java示例(客户端)相关推荐

  1. Netty服务器部署在Android设备上,接收来自PC客户端的Java Socket客户端发送的JSON数据

    Netty服务器部署在Android设备上,接收来自PC客户端的Java Socket客户端发送的数据 一个简单的模型,在Android手机上部署一个Netty写的服务器,绑定端口9000,等待客户端 ...

  2. memcached客户端_Memcached Java客户端示例

    memcached客户端 Today we will look into Memcached Java client example. Earlier we learned about telnet ...

  3. SMPP Java示例(客户端)

    这篇文章通过创建一个简单的SMPP客户端向移动用户发送短信来提供SMPP Java示例,使用该客户端我们可以简单地提交以向单个移动用户发送消息,也可以一次将消息广播给多个移动用户.另外,我们将验证交货 ...

  4. 【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )

    文章目录 I 客户端代码示例 II 服务器端代码示例 III 运行结果 I 客户端代码示例 import java.io.IOException; import java.io.InputStream ...

  5. HDFS的API调用,创建Maven工程,创建一个非Maven工程,HDFS客户端操作数据代码示例,文件方式操作和流式操作

    1. HDFS的java操作 hdfs在生产应用中主要是客户端的开发,其核心步骤是从hdfs提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件 1.1 ...

  6. java https 验证客户端证书_Java HTTPS客户端证书认证

    小编典典 终于设法解决了所有问题,所以我会回答我自己的问题.这些是我用来解决特定问题的设置/文件: 该客户端的密钥库是一个PKCS#12格式文件包含 客户端的公共证书(在这种情况下,由自签名CA签名) ...

  7. java http 下载网页代码_Java下http下载文件客户端和上传文件客户端实例代码

    Java下http下载文件客户端和上传文件客户端实例代码 发布于 2021-1-14| 复制链接 摘记: 一.下载客户端代码 ```java package javadownload; import ...

  8. java获取客户端硬件信息_java如何获取远程计算机的系统信息,cpu使用情况,磁盘使用情况等等...

    展开全部 1.在远程server里搭建一个http服务e69da5e6ba903231313335323631343130323136353331333337396165,并支持某种服务端语言(如.n ...

  9. 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器客户端完整代码示例 | 运行服务器端与客户端效果及过程分析 )

    文章目录 一.服务器端完整代码 Server.groovy 二.客户端完整代码 Client.groovy 三.运行服务器端与客户端效果及过程分析 一.服务器端完整代码 Server.groovy 参 ...

最新文章

  1. 华为数据之道_华为构筑产业数字化的太极之道
  2. python编程例子-python网络编程实例简析
  3. 文字加减前后缀lisp_日本搞笑艺人催泪讲授汉字课堂告诉你文字背后的意义!...
  4. 使用Visual Paradigm画ER图/Visual ER图
  5. 驱动外挂的原理及检测手段(自瞄篇)
  6. SVN比较两个文件差异
  7. SQL的常见函数的使用方法和举例说明
  8. Idea scalac: Scala compiler JARs not found (module ‘XXXX‘): C:\Users\nanhu\.cache\co......
  9. Unity编辑器下Console面板查看完整打印日志
  10. 贝尔曼-福特算法(Bellman-Ford)
  11. 36岁,被单位解聘,我干起了深夜外卖
  12. PAT练习 蜜蜂寻路
  13. QrCode类生成二维码海报
  14. 使用windows自带的局域网连接传输文件
  15. python中ord函数
  16. 穿越晋商百年-体验非遗文化
  17. 代理模式——游戏代练
  18. 几天时间【免费】搭建了自己的个人博客,免租服务器,免买域名,真香警告。
  19. 无法打开源文件windows.h
  20. unity2D小游戏打地鼠

热门文章

  1. 「雅礼集训 2017 Day7」事情的相似度(后缀自动机+LCT+树状数组)
  2. 不止代码:迷宫问题(bfs)
  3. P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】
  4. P4196-[CQOI2006]凸多边形/[模板]半平面交【计算几何】
  5. P5431-[模板]乘法逆元2【递推】
  6. jzoj3914-人品问题【树形dp】
  7. 【2018.3.10】模拟赛之二-ssl2575 给出字符串【字符串】
  8. 6、mysql中字段
  9. SpringCloud Zuul(七)之POST Filter
  10. consul的安装搭建