симкарта сообщения транс / приемник симулятор - PullRequest
1 голос
/ 04 мая 2019

У нас есть проект, согласно которому мы должны отправлять сообщения огромному количеству сим-карт (более 1 миллиона) и получать и обрабатывать ответы.

Для тестирования я использую Selenium SMPPSim для имитации отправки сообщения. это нормально работает для отправки сообщений. и с включенным сервером обратного вызова я могу получать сообщения, которые отправляю на другой порт.

Но у меня вопрос, как я могу отправить сообщение обратно на SMPP-сервер?

Я использую библиотеку EasySMPP для подключения к серверу smpp

Код моего SMPP-сервера:

private SMPPClient _client;
private readonly object _lockObject = new object();

public SMPPClient GetClient()
{
    if (_client != null)
    {
        return _client;
    }
    lock (_lockObject)
    {
        _client = new SMPPClient();
        var smsc = new SMSC
        {
            Host = "127.0.0.1",
            Port = 2775,
            SystemId = "smppclient1",
            Password = "password",
            SourceTon = 5,
            SourceNpi = 1,
            AddrTon = 1,
            AddrNpi = 1,
            SystemType = "8945",
        };
        _client.OnDeliverSm += Client_OnDeliverSm;
        Console.WriteLine("Client_OnDeliverSm added");
        _client.OnSubmitSmResp += Client_OnSubmitSmResp;
        Console.WriteLine("OnSubmitSmResp added");
        _client.AddSMSC(smsc);
        if (!_client.Connect())
            throw new Exception($"Can not connect to smpp link: {smsc.Host} : {smsc.Port}");
        return _client;
    }
}

public void SendByCampaignItemId()
{
    var smppClient = GetClient();
    lock (smppClient)
    {
        var msgId = smppClient.SubmitSM(1, 1, "339123456789", 1, 1, "339632587436",
        0x40, // EsmClass.UdhIndicator
        0x7f, // protocol identifier
        0, // priority flag level 0
           DateTime.MinValue,
           DateTime.MinValue,
        // DateTime.Now.AddMinutes(10),
        //DateTime.Now.AddHours(3),
        (byte)DeliveryReportType.AlwaysSendDeliveryReport,
        0x00, //replace if present
        0xf6, // data coding
        0, // default msg id
        new byte[] { 0x02,0x70,0x00,0x34,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF});
    }
}

private void Client_OnSubmitSmResp(SubmitSmRespEventArgs e)
{
    Console.WriteLine("Submit Received");
}

private void Client_OnDeliverSm(DeliverSmEventArgs e)
{
    Console.WriteLine("Deliver Received");
}

А вот мой код, который прослушивает порт 3333:

static void Main(string[] args)
{
    TcpListener server = null;
    try
    {
        Int32 port = 3333;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");
        server = new TcpListener(localAddr, port);
        server.Start();

        // Buffer for reading data
        Byte[] bytes = new Byte[256];
        String data = null;
        while (true)
        {
            Console.Write("Waiting for a connection... ");
            TcpClient client = server.AcceptTcpClient();
            Console.WriteLine("Connected!");
            data = null;
            NetworkStream stream = client.GetStream();
            int i;
            while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
            {
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                Console.WriteLine("Received: {0}", data);
                data = data.ToUpper();
                byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
                stream.Write(msg, 0, msg.Length);


                //WHAT SHOULD I DO HERE SO THAT I CAN SEND BACK A MESSAGE (DELIVER SM) TO SMPP SIM??!!!


                Console.WriteLine("Sent: {0}", data);
            }
            client.Close();
        }
    }
    catch (SocketException e)
    {
        Console.WriteLine("SocketException: {0}", e);
    }
    finally
    {
        server.Stop();
    }


    Console.WriteLine("\nHit enter to continue...");
    Console.Read();
}

И мой файл конфигурации SMPPSIM:

SMPP_PORT=2775
SMPP_CONNECTION_HANDLERS=10
CONNECTION_HANDLER_CLASS=com.seleniumsoftware.SMPPSim.StandardConnectionHandler
PROTOCOL_HANDLER_CLASS=com.seleniumsoftware.SMPPSim.StandardProtocolHandler
LIFE_CYCLE_MANAGER=com.seleniumsoftware.SMPPSim.LifeCycleManager
MESSAGE_STATE_CHECK_FREQUENCY=5000
MAX_TIME_ENROUTE=10000
DELAY_DELIVERY_RECEIPTS_BY=0
PERCENTAGE_THAT_TRANSITION=75
PERCENTAGE_DELIVERED=90
PERCENTAGE_UNDELIVERABLE=6
PERCENTAGE_ACCEPTED=2
PERCENTAGE_REJECTED=2
DISCARD_FROM_QUEUE_AFTER=60000
HTTP_PORT=88
HTTP_THREADS=1
DOCROOT=www
AUTHORISED_FILES=/css/style.css,/index.htm,/inject_mo.htm,/favicon.ico,/images/logo.gif,/images/dots.gif,/user-guide.htm,/images/homepage.gif,/images/inject_mo.gif
INJECT_MO_PAGE=/inject_mo.htm
SYSTEM_IDS=smppclient1,smppclient2
PASSWORDS=password,password
OUTBIND_ENABLED=false
OUTBIND_ESME_IP_ADDRESS=127.0.0.1
OUTBIND_ESME_PORT=2776
OUTBIND_ESME_SYSTEMID=smppclient1
OUTBIND_ESME_PASSWORD=password
DELIVERY_MESSAGES_PER_MINUTE=0
DELIVER_MESSAGES_FILE=deliver_messages.csv
LOOPBACK=TRUE
ESME_TO_ESME=false
OUTBOUND_QUEUE_MAX_SIZE=1000
INBOUND_QUEUE_MAX_SIZE=1000
DELAYED_INBOUND_QUEUE_PROCESSING_PERIOD=60
DELAYED_INBOUND_QUEUE_MAX_ATTEMPTS=100
DECODE_PDUS_IN_LOG=true
CAPTURE_SME_BINARY=false
CAPTURE_SME_BINARY_TO_FILE=sme_binary.capture
CAPTURE_SMPPSIM_BINARY=false
CAPTURE_SMPPSIM_BINARY_TO_FILE=smppsim_binary.capture
CAPTURE_SME_DECODED=false
CAPTURE_SME_DECODED_TO_FILE=sme_decoded.capture
CAPTURE_SMPPSIM_DECODED=false
CAPTURE_SMPPSIM_DECODED_TO_FILE=smppsim_decoded.capture
CALLBACK=true
CALLBACK_ID=SIM1
CALLBACK_TARGET_HOST=localhost
CALLBACK_PORT=3333
DELIVER_SM_INCLUDES_USSD_SERVICE_OP=false
DELIVERY_RECEIPT_OPTIONAL_PARAMS=true
DELIVERY_RECEIPT_TLV=1403/0A/34343132333435363738
SMSCID=SMPPSim
SIMULATE_VARIABLE_SUBMIT_SM_RESPONSE_TIMES=false

И еще один вопрос:

Если SMPPSim не подходит для моей работы, что еще я могу использовать?

ОБНОВЛЕНИЕ 1:

Я выгляжу немного больше и думаю, что найду более простой вопрос. Предположим, что я должен SMPPSims. Как я могу отправить сообщение с SMPPSim на другой?

...