4

JAVA を使用して SMS を送信しようとしています。グーグルで調べたところ、SMPPプロトコルが使用されることがわかり、以下のソースコードに出くわしました。

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

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, 
            "<user_name>",
            "<pass_word>", 
            "<SYSTEM_TYPE>", 
            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("<SMSC_IP_ADDRESS>", 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,
                "<MSISDN>",
                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 プロトコルについて知ったのはつい最近のことなので、このコードを使用して携帯電話に SMS を送信するというユースケースを実現する方法を知りません。誰かがこのコードを機能させるのを手伝ってくれますか、またはこれを行うことについて学ぶことができる場所に私を案内してくれますか?

4

4 に答える 4

6

最近、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 サーバーからの配信レポートの要求、SMS 失敗率の設定など、複数の方法で構成できます。Linux で SMPPSim をテストしました。

于 2014-11-04T08:03:24.777 に答える
1

ここでこのシミュレーターを使用してください。サービスプロバイダーとして機能します。アプリケーションをビルドしてテストした後、サービスプロバイダーから提供された構成パラメーター (ユーザー名、パスワード、IP、ポートなど) を変更する必要があります。

このシミュレーターに接続するためのすべての構成は、conf ファイルで見つけることができます。

于 2014-11-04T08:06:14.217 に答える
0

SMPP は、モバイル ネットワーク オペレータ/キャリアとコンテンツ プロバイダ間のプロトコルです。指定したフィールド (ユーザー名、パスワード、SMSC IP) は、オペレーターから提供されます。残念ながら、コンテンツ プロバイダー会社で働いているか、オペレーターと契約を結んでいない限り、これらの詳細を取得することはまずありません。

シミュレーターを使用すると、SMPP コードをテストできますが、実際にコンテンツを携帯電話に配信することはできません。

Java アプリから SMS を送信したい場合の私の最善のアドバイスは、Twilio のような SMS API を使用することです。

于 2014-11-04T08:14:41.633 に答える