public static async Task <int> RunTest(SmppClient client, int messagesNumber) { List <Task> tasks = new List <Task>(); Stopwatch watch = Stopwatch.StartNew(); for (int i = 0; i < messagesNumber; i++) { tasks.Add(client.Submit( SMS.ForSubmit() .From("111") .To("222") .Coding(DataCodings.UCS2) .Text("test"))); } await Task.WhenAll(tasks); watch.Stop(); return(Convert.ToInt32(messagesNumber / watch.Elapsed.TotalSeconds)); }
public static async Task SendSms(string phoneNumber, string smsText) { string filePath = ConfigurationManager.AppSettings.Get("SMPPLogPath"); LogManager.SetLoggerFactory(name => new FileLogger(filePath, LogLevel.All)); using (SmppClient client = new SmppClient()) { try { if (await client.Connect(new DnsEndPoint("smpp.server", 7777, AddressFamily.InterNetwork))) { BindResp bindResp = await client.Bind("username", "password"); if (bindResp.Header.Status == CommandStatus.ESME_ROK) { var submitResp = await client.Submit( SMS.ForSubmit() .From("short code") .To(phoneNumber) .Coding(DataCodings.UCS2) .Text(smsText)); if (submitResp.All(x => x.Header.Status == CommandStatus.ESME_ROK)) { client.Logger.Info("Message has been sent."); } } await client.Disconnect(); } } catch (Exception ex) { client.Logger.Error("Failed send message", ex); } } }
private void client_evDeliverSm(object sender, DeliverSm data) { try { //Check if we received Delivery Receipt if (data.MessageType == MessageTypes.SMSCDeliveryReceipt) { //Get MessageId of delivered message string messageId = data.Receipt.MessageId; MessageState deliveryStatus = data.Receipt.State; _log.Info("Delivery Receipt received: {0}", data.Receipt.ToString()); } else { // Receive incoming message and try to concatenate all parts if (data.Concatenation != null) { _messageComposer.AddMessage(data); _log.Info("DeliverSm part received: Sequence: {0}, SourceAddress: {1}, Concatenation ( {2} )" + " Coding: {3}, Text: {4}", data.Header.Sequence, data.SourceAddress, data.Concatenation, data.DataCoding, _client.EncodingMapper.GetMessageText(data)); } else { _log.Info("DeliverSm received : Sequence: {0}, SourceAddress: {1}, Coding: {2}, Text: {3}", data.Header.Sequence, data.SourceAddress, data.DataCoding, _client.EncodingMapper.GetMessageText(data)); } // Check if an ESME acknowledgement is required if (data.Acknowledgement != SMEAcknowledgement.NotRequested) { // You have to clarify with SMSC support what kind of information they request in ESME acknowledgement. string messageText = data.GetMessageText(_client.EncodingMapper); var smBuilder = SMS.ForSubmit() .From(data.DestinationAddress) .To(data.SourceAddress) .Coding(data.DataCoding) .ConcatenationInUDH(_client.SequenceGenerator.NextReferenceNumber()) .Set(m => m.MessageType = MessageTypes.SMEDeliveryAcknowledgement) .Text(new Receipt { DoneDate = DateTime.Now, State = MessageState.Delivered, // MessageId = data.Response.MessageId, ErrorCode = "0", SubmitDate = DateTime.Now, Text = messageText.Substring(0, Math.Min(20, messageText.Length)) }.ToString() ); _client.Submit(smBuilder).ConfigureAwait(false); } } } catch (Exception ex) { data.Response.Header.Status = CommandStatus.ESME_RX_T_APPN; _log.Error(ex, "Failed to process DeliverSm"); } }
/// <summary> Called to send the message </summary> /// <param name="phoneNumber"></param> /// <param name="serviceType"></param> /// <param name="destinationTon"></param> /// <param name="destinationNpi"></param> /// <param name="submitDataCoding"></param> /// <param name="encodeDataCoding"></param> /// <param name="message"></param> /// <param name="submitSm"></param> /// <param name="submitSmResp"></param> /// <returns> 0 - Successful / 1 - Failed / 2 - Not Connected </returns> public int SendMessage(string phoneNumber, string serviceType, Ton destinationTon, Npi destinationNpi, DataCodings submitDataCoding, DataCodings encodeDataCoding, string message, out SubmitSm submitSm, out SubmitSmResp submitSmResp) { int retVal = 1; submitSm = null; submitSmResp = null; try { if (Client.Status != ConnectionStatus.Bound) { WriteLog("ESMEConnection : SendMessage : Warning : Not Connected To The SMPP Server"); return(2); } // The message to send string sendMessage = null; // Do we need to cut the message down if (encodeDataCoding == DataCodings.UCS2) { // UCS2 only supports 140 bytes if (message.Length > 70) { WriteLog(LogEventNotificationTypes.Email, "ESMEConnection : SendMessage : WARNING : Truncating UCS2 message to 70 characters."); // The default is Unicode so truncate the message sendMessage = message.Substring(0, 70); } } else { if (message.Length > 160) { WriteLog(LogEventNotificationTypes.Email, "ESMEConnection : SendMessage : WARNING : Truncating Default message to 160 characters."); sendMessage = message.Substring(0, 160); } } // Prepare the message, I have made sure there is only ever one message // with the trunacting above submitSm = Client.PrepareSubmit( SubmitMode.ShortMessage, serviceType, (byte)Ton.NetworkSpecific, (byte)Npi.Unknown, ShortLongCode, (byte)destinationTon, (byte)destinationNpi, phoneNumber, submitDataCoding, encodeDataCoding, (sendMessage == null) ? message : sendMessage); // Send the message submitSmResp = Client.Submit(submitSm); // Log the send call WriteLog("ESMEConnection : SendMessage : Send : Sequence[{0}] Phone[{1}] Status[{2}]", submitSmResp.Sequence, phoneNumber, submitSmResp.Status); // Was it successful if (submitSmResp.Status != CommandStatus.ESME_ROK) { WriteLog("ESMEConnection : SendMessage : ERROR : Failed For Unknown Reason"); retVal = 1; } // Success retVal = 0; } catch (Exception exception) { WriteLog(LogEventNotificationTypes.Email, "ESMEConnection : SendMessage : ERROR : {0}", exception.ToString()); retVal = 1; } return(retVal); }