smpp客户端_SMPP Java示例(客户端)

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客户端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式的环视深度剖析

文章目录一、环视基础二、顺序环视匹配过程&#xff08;一&#xff09;顺序肯定环视匹配过程&#xff08;二&#xff09;顺序否定环视匹配过程三、逆序环视匹配过程&#xff08;一&#xff09;逆序环视基础&#xff08;二&#xff09;逆序肯定环视匹配过程1. 逆序表达式的长度固…

深度学习pytorch--softmax回归(一)

softmax回归 前几节介绍的线性回归模型适用于输出为连续值的情景。在另一类情景中&#xff0c;模型输出可以是一个像图像类别这样的离散值。对于这样的离散值预测问题&#xff0c;我们可以使用诸如softmax回归在内的分类模型。和线性回归不同&#xff0c;softmax回归的输出单元…

python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...

接上篇文章《如何用python实现excel中的vlookup功能&#xff1f;》&#xff0c;上篇说到&#xff0c;最近我在做一个小项目&#xff0c;也是用python操作excel解决财务审计工作上的一些问题&#xff0c;以便提高工作效率及其准确性。最终目的&#xff0c;刀哥是想做应收账款账龄…

阿帕奇跨域_阿帕奇齿轮泵

阿帕奇跨域Apache Gearpump是一个实时大数据流引擎。 它于2014年中期在GitHub上作为一个开源项目在英特尔构想&#xff0c;并于2016年3月8日进入Apache孵化。Gearpump的名称是对工程术语“齿轮泵”的指称&#xff0c;它是一个超级简单的泵&#xff0c;由以下组成只有两个齿轮&a…

正则表达式之 NFA 引擎匹配原理详解

文章目录一、为什么要了解引擎匹配原理二、正则表达式引擎三、预备知识&#xff08;一&#xff09;字符串组成&#xff08;二&#xff09;占有字符和零宽度&#xff08;三&#xff09;控制权和传动四、正则表达式简单匹本过程&#xff08;一&#xff09;基础匹配过程&#xff0…

阿帕奇跨域_阿帕奇光束

阿帕奇跨域Apache Beam是一个开放源代码统一模型&#xff0c;用于定义批处理和流数据并行处理管道。 使用一种开源的Beam SDK&#xff0c;您可以构建一个定义管道的程序。 然后&#xff0c;该管道由Beam支持的分布式处理后端之一执行&#xff0c;这些后端包括Apache Apex &…

unity 启动相机_Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)...

最近做项目需要用到这个功能&#xff0c;就是在Unity中调用Android本地相册或直接打开摄像机拍照并且裁剪一部分用于用户头像&#xff0c;今天研究了一下&#xff0c;那么研究出成果了MOMO一定要分享给大家。Unity与Android的交互还有谁不会&#xff1f;&#xff1f; 如果有不会…

深度学习pytorch--MNIST数据集

图像分类数据集&#xff08;Fashion-MNIST&#xff09; 在介绍softmax回归的实现前我们先引入一个多类图像分类数据集。它将在后面的章节中被多次使用&#xff0c;以方便我们观察比较算法之间在模型精度和计算效率上的区别。图像分类数据集中最常用的是手写数字识别数据集MNIS…

html 元素的属性

全局属性 全局属性是可与所有 HTML 元素一起使用的属性。 事件属性 用来定义某个事件的操作的属性叫事件属性&#xff0c;例如&#xff0c;οnclick“script”&#xff0c;元素上发生鼠标点击时触发 click 事件&#xff0c;click 事件被触发就会执行对应的脚本代码。事件属性…

nosql和rdnms_用于SaaS和NoSQL的Jdbi

nosql和rdnms一个自然的接口&#xff0c;用于与CRM&#xff0c;ERP&#xff0c;会计&#xff0c;营销自动化&#xff0c;NoSQL&#xff0c;平面文件等基于Java的数据集成 Jdbi是用于JavaSQL便利库&#xff0c;它为JDBC提供更自然的Java数据库接口&#xff0c;该接口易于绑定到…

matlab 功率谱密度 汉宁窗_如何理解随机振动的功率谱密度?

一、随机信号和正太分布有什么关系&#xff1f; 二、时域、频域之间功率守恒&#xff1f; 三、自相关又是个什么玩意&#xff1f;作为一个工程师&#xff0c;很多人对随机振动看着熟悉&#xff0c;却又实际陌生。熟悉是因为几乎每个产品在出厂时都要求要做随机振动试验&#xf…

深度学习pytorch--softmax回归(二)

softmax回归的从零开始实现实验前思考获取和读取数据获取数据集查看数据集查看下载后的.pt文件查看mnist_train和mnist_test读取数据集查看数据迭代器内容初始化模型参数定义softmax函数定义模型定义损失函数计算分类准确率模型评价--准确率开始训练可视化总结完整代码实验前思…

HTML块级元素/块标签/块元素

文章目录块元素的特点块元素清单block level element. 块级元素想在同一行显示需浮动或者 display:inline。 块元素的特点 每个块级元素都是独自占一行&#xff0c;其后的元素也只能另起一行&#xff0c;并不能两个元素共用一行&#xff1b; 元素的高度、宽度、行高、顶边距、…

物联卡查询流量_电信物联卡官网是多少?如何快速查询流量信息?

高速率设备的使用场景需要用到5G&#xff0c;中速率LET-Cat1应用范围更广&#xff0c;而低速率则要靠窄带物联网NB-IOT去维护了。这三种网络制式全都与物联网息息相关&#xff0c;这就能知道为什么国家层面对物联网基础设施建设这么重视了。电信物联卡在智能化硬件中有优秀表现…

java8日期转时间戳_Java 8日期和时间

java8日期转时间戳如今&#xff0c;一些应用程序仍在使用java.util.Date和java.util.Calendar API&#xff0c;包括使我们的生活更轻松地使用这些类型的库&#xff0c;例如JodaTime。 但是&#xff0c;Java 8引入了新的API来处理日期和时间&#xff0c;这使我们可以对日期和时间…

HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素

文章目录行内元素的特点行内元素清单可变元素列表inline element. 也叫行级元素、内联元素。行内元素默认设置宽度是不起作用&#xff0c;需设置 display:inline-block 或者 block 才行。 行内元素的特点 可以和其他元素处于一行&#xff0c;不用必须另起一行&#xff1b; 元…

深度学习pytorch--softmax回归(三)

softmax回归的简洁实现获取和读取数据定义和初始化模型softmax和交叉熵损失函数定义优化算法模型评价训练模型小结完整代码前两篇链接: 深度学习pytorch–softmax回归(一) 深度学习pytorch–softmax回归(二) 本文使用框架来实现模型。 获取和读取数据 我们仍然使用Fashion-M…

正则表达式的分类

文章目录一、正则表达式引擎二、正则表达式分类三、正则表达式比较四、Linux/OS X 下常用命令与正则表达式的关系一、正则表达式引擎 正则引擎大体上可分为不同的两类&#xff1a;DFA 和 NFA&#xff0c;而 NFA 又基本上可以分为传统型 NFA 和 POSIX NFA。 DFA(Deterministic …

spock测试_使用Spock测试您的代码

spock测试Spock是针对Java和Groovy应用程序的测试和规范框架。 Spock是&#xff1a; 极富表现力 简化测试的“给定/何时/然后” 语法 与大多数IDE和CI服务器兼容。 听起来不错&#xff1f; 通过快速访问Spock Web控制台&#xff0c;您可以非常快速地开始使用Spock。 当您有…

深度学习pytorch--多层感知机(一)

多层感知机隐藏层激活函数ReLU函数sigmoid函数tanh函数多层感知机小结我们已经介绍了包括线性回归和softmax回归在内的单层神经网络。然而深度学习主要关注多层模型。在本节中&#xff0c;我们将以多层感知机&#xff08;multilayer perceptron&#xff0c;MLP&#xff09;为例…