使用SMPP在JAVA中发送短信文本

 yzkgt18688161 发布于 2022-12-13 15:53

我正在尝试使用JAVA发送短信.谷歌搜索后,我发现SMPP协议将用于它,并偶然发现下面的源代码.

public class SendSMS
{
public static void main(String[] args) throws Exception
{
    SendSMS obj = new SendSMS();
    SendSMS.sendTextMessage("");
}

private TimeFormatter tF = new AbsoluteTimeFormatter();

/*
 * This method is used to send SMS to for the given MSISDN
 */
public void sendTextMessage(String MSISDN)
{

    // bind param instance is created with parameters for binding with SMSC
    BindParameter bP = new BindParameter(
            BindType.BIND_TX, 
            "",
            "", 
            "", 
            TypeOfNumber.UNKNOWN,
            NumberingPlanIndicator.UNKNOWN,
            null);

    SMPPSession smppSession = null;

    try
    {
        // smpp session is created using the bindparam and the smsc ip address/port
        smppSession = new SMPPSession("", 7777, bP);
    }
    catch (IOException e1)
    {
        e1.printStackTrace();
    }

    // Sample TextMessage
    String message = "This is a Test Message";

    GeneralDataCoding dataCoding = new GeneralDataCoding(false, true,
            MessageClass.CLASS1, Alphabet.ALPHA_DEFAULT);

    ESMClass esmClass = new ESMClass();

    try
    {
        // submitShortMessage(..) method is parametrized with necessary
        // elements of SMPP submit_sm PDU to send a short message
        // the message length for short message is 140
        smppSession.submitShortMessage(
                "CMT",
                TypeOfNumber.NATIONAL,
                NumberingPlanIndicator.ISDN,
                "",
                TypeOfNumber.NATIONAL, 
                NumberingPlanIndicator.ISDN, 
                MSISDN,
                esmClass, 
                (byte) 0, 
                (byte) 0, 
                tF.format(new Date()),
                null,
                new RegisteredDelivery(SMSCDeliveryReceipt.DEFAULT),
                (byte) 0,
                dataCoding, 
                (byte) 0, 
                message.getBytes());
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

}

但我遇到的源代码问题是它需要特定的参数集,如user_name,pass_word,system_type,SMSC IP地址等,我不知道.我最近才知道SMPP协议,因此我不知道如何使这段代码能够实现我向手机发送短信的用法.那么有人可以帮助我让这些代码工作或引导我到一个我可以学习这样做的地方吗?

1 个回答
  • 我最近一直在研究SMPP项目.

    我用于SMPP协议的库是OpenSMPP.

    以下是我的类用于构建和发送SMPP数据的示例

    public class SmppTransport implements Transport {
    
    @Override
    public void send(String url, Map<String, String> map) throws IOException {
        int smscPort = Integer.parseInt(map.get("port"));
        String smscHost = map.get("send_url");
        String smscUsername = map.get("username");
        String smscPassword = map.get("password");
        String recipientPhoneNumber = map.get("phone_num");
        String messageText = map.get("text");
    
        try {
            SubmitSM request = new SubmitSM();
         // request.setSourceAddr(createAddress(senderPhoneNumber)); // you can skip this
            request.setDestAddr(createAddress(recipientPhoneNumber));
            request.setShortMessage(messageText);
         // request.setScheduleDeliveryTime(deliveryTime);           // you can skip this
            request.setReplaceIfPresentFlag((byte) 0);
            request.setEsmClass((byte) 0);
            request.setProtocolId((byte) 0);
            request.setPriorityFlag((byte) 0);
            request.setRegisteredDelivery((byte) 1); // we want delivery reports
            request.setDataCoding((byte) 0);
            request.setSmDefaultMsgId((byte) 0);
    
            Session session = getSession(smscHost, smscPort, smscUsername, smscPassword);
            SubmitSMResp response = session.submit(request);
        } catch (Throwable e) {
            // error
        }
    }
    
    private Session getSession(String smscHost, int smscPort, String smscUsername, String smscPassword) throws Exception{
        if(sessionMap.containsKey(smscUsername)) {
            return sessionMap.get(smscUsername);
        }
    
        BindRequest request = new BindTransmitter();
        request.setSystemId(smscUsername);
        request.setPassword(smscPassword);
     // request.setSystemType(systemType);
     // request.setAddressRange(addressRange);
        request.setInterfaceVersion((byte) 0x34); // SMPP protocol version
    
        TCPIPConnection connection = new TCPIPConnection(smscHost, smscPort);
     // connection.setReceiveTimeout(BIND_TIMEOUT);
        Session session = new Session(connection);
        sessionMap.put(smscUsername, session);
    
        BindResponse response = session.bind(request);
        return session;
    }
    
    private Address createAddress(String address) throws WrongLengthOfStringException {
        Address addressInst = new Address();
        addressInst.setTon((byte) 5); // national ton
        addressInst.setNpi((byte) 0); // numeric plan indicator
        addressInst.setAddress(address, Data.SM_ADDR_LEN);
        return addressInst;
    }
    
    }
    

    我的操作员给了我这个SMPP的参数.有许多配置选项,但这些是必不可少的

    #host = 192.168.10.10 // operator smpp server ip
    #port = 12345         // operator smpp server port
    #smsc-username = "my_user" 
    #smsc-password = "my_pass" 
    #system-type = "" 
    #source-addr-ton = 5
    #source-addr-npi = 0
    

    因此,如果您想在未注册GSM服务提供商的情况下测试代码,则可以在计算机上模拟SMPP服务器.SMPPSim是一个很棒的测试项目.下载并在您的计算机上运行.它可以通过多种方式配置,例如来自SMPP服务器的请求传送报告,设置短信故障率等等.我在linux上测试了SMPPSim.

    2022-12-13 15:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有