Exemple #1
0
        private void btnSendSession_Click(object sender, EventArgs e)
        {
            if (lvSessions.SelectedItems.Count == 0)
            {
                return;
            }

            SimSession    objSession = (SimSession)lvSessions.SelectedItems[0].Tag;
            frmSmsMessage frm        = new frmSmsMessage(objSession, null, frmSmsMessage.EFrmType.SEND, m_objSimModel.MultipartMode, m_objSimModel.UseGsmEncoding);

            if (frm.ShowDialog() == DialogResult.OK)
            {
                SimMessage objMessage = frm.Message;
                objMessage.SessionId = objSession.Id;
                objMessage.SystemId  = objSession.SystemId;

                SimCommand objCommand = new SimCommand();
                objCommand.CommandId = SimCommand.ECommandId.SENDMESSAGE;
                objCommand.Message   = new SimMessage(objMessage);
                objCommand.SessionId = objSession.Id;

                // Sending a new message is a kind of 'fire and forget', this
                // is because the message will be added to the back of the queue
                // in the worker thread. Actually waiting for the message to be
                // submitted to the session for delivery may take a while when
                // doing stress tests.
                m_objSimWorker.PushWorker(objCommand);
            }
        }
Exemple #2
0
        public SimMessage(SimMessage objOther)
        {
            m_nUserTag               = objOther.m_nUserTag;
            m_strToAddress           = objOther.m_strToAddress;
            m_strFromAddress         = objOther.m_strFromAddress;
            m_strBody                = objOther.m_strBody;
            m_bRequestDeliveryReport = objOther.m_bRequestDeliveryReport;
            m_nToAddressTon          = objOther.m_nToAddressTon;
            m_nToAddressNpi          = objOther.m_nToAddressNpi;
            m_nFromAddressTon        = objOther.m_nFromAddressTon;
            m_nFromAddressNpi        = objOther.m_nFromAddressNpi;
            m_strReference           = objOther.m_strReference;
            m_nDataCoding            = objOther.m_nDataCoding;
            m_nBodyFormat            = objOther.m_nBodyFormat;
            m_bHasUdh                = objOther.m_bHasUdh;
            m_bIsDeliveryReport      = objOther.m_bIsDeliveryReport;
            m_nCommandStatus         = objOther.m_nCommandStatus;
            m_nSequenceNumber        = objOther.m_nSequenceNumber;
            m_nTotalParts            = objOther.m_nTotalParts;
            m_nPartNumber            = objOther.m_nPartNumber;
            m_nMultipartReference    = objOther.m_nMultipartReference;
            m_nLanguageShift         = objOther.m_nLanguageShift;

            m_nSessionId  = objOther.m_nSessionId;
            m_strSystemId = objOther.m_strSystemId;
            m_strStatus   = objOther.m_strStatus;

            m_eDirection = objOther.m_eDirection;

            foreach (SimTlv objTlv in objOther.m_lsTlvs)
            {
                m_lsTlvs.Add(new SimTlv(objTlv));
            }
        }
Exemple #3
0
        private void AddToMessages(SimMessage objMessage)
        {
            string strReference = objMessage.Reference;

            if (objMessage.Direction == SimMessage.EMsgDir.OUT)
            {
                strReference = "n/a";
            }

            // Add new item to the top of the listview
            ListViewItem objLvi = null;

            lvMessages.Items.Insert(0, objLvi = new ListViewItem(new string[]
            {
                objMessage.Direction.ToString(), objMessage.SystemId, objMessage.ToAddress, strReference,
                objMessage.Status, objMessage.Body
            }));
            objLvi.Name = objMessage.UserTag.ToString();
            objLvi.Tag  = objMessage;

            while (lvMessages.Items.Count > m_nKeepMaxMessages)
            {
                lvMessages.Items.RemoveAt(lvMessages.Items.Count - 1);
            }
        }
Exemple #4
0
        public frmSmsMessage(SimSession objSession, SimMessage objMessage, EFrmType eType, int nMultipartMode, int nUseGsmEncoding)
        {
            InitializeComponent();

            m_objConstants             = new AxSms.Constants();
            m_objSmsAsm                = new AxSms.Smpp();
            m_objSmsAsm.MultipartMode  = nMultipartMode;
            m_objSmsAsm.UseGsmEncoding = nUseGsmEncoding;
            m_eFrmType = eType;

            switch (m_eFrmType)
            {
            case EFrmType.CREATE:
                Text         = "Create new SMS message";
                btnSend.Text = "Ok";
                break;

            case EFrmType.EDIT:
                Text         = "Edit SMS message";
                btnSend.Text = "Ok";
                break;

            case EFrmType.VIEW:
                Text            = "View SMS message";
                btnCancel.Text  = "Close";
                btnSend.Visible = false;
                break;

            case EFrmType.SEND:
                Text         = "Send SMS message";
                btnSend.Text = "Send";
                break;
            }

            if (objSession != null)
            {
                if (objSession.Ip.Contains("."))
                {   // IPv4 notation
                    lblIp.Text = string.Format("{0}:{1}", objSession.Ip, objSession.Port);
                }
                else
                {   // IPv6 notiation
                    lblIp.Text = string.Format("[{0}]:{1}", objSession.Ip, objSession.Port);
                }
                lblSystemId.Text = objSession.SystemId;
            }

            if (objMessage == null)
            {
                m_objMessage = new SimMessage();
            }
            else
            {
                m_objMessage = objMessage;
            }
        }
Exemple #5
0
        private void AddToAutoMessage(SimMessage objMessage)
        {
            ListViewItem objLvi = null;

            lvAutoMessage.Items.Add(objLvi = new ListViewItem(new string[]
            {
                objMessage.FromAddress, objMessage.ToAddress, objMessage.Body
            }));
            objLvi.Tag = objMessage;
        }
Exemple #6
0
        SimMessage bw_CreateDlr(SimMessage objIn, int nVersion, int nStatusCode, string strStatusText, AxSms.Constants objSmsConst)
        {
            SimMessage objDlr = new SimMessage();

            // Swap adress
            objDlr.FromAddress    = objIn.ToAddress;
            objDlr.FromAddressNpi = objIn.ToAddressNpi;
            objDlr.FromAddressTon = objIn.FromAddressTon;
            objDlr.ToAddress      = "";
            objDlr.ToAddressNpi   = 0;
            objDlr.ToAddressTon   = objSmsConst.TON_ALPHANUMERIC;

            // Set session information
            objDlr.SessionId = objIn.SessionId;
            objDlr.SystemId  = objIn.SystemId;

            // Add TLV's, only for 3.4 or 5.0 clients.
            if (nVersion != objSmsConst.SMPP_VERSION_33)
            {
                objDlr.Tlvs.Clear();
                AxSms.Tlv objAxTlv = new AxSms.Tlv();

                SimTlv objTlv = new SimTlv();
                objTlv.Tag           = objSmsConst.SMPP_TLV_MESSAGE_STATE;
                objAxTlv.ValueAsInt8 = nStatusCode;

                objTlv.TlvType    = SimTlv.TlvTypes.HEX;
                objTlv.TypedValue = objAxTlv.ValueAsHexString;
                objTlv.HexValue   = objTlv.TypedValue;
                objDlr.Tlvs.Add(objTlv);

                objTlv                 = new SimTlv();
                objTlv.Tag             = objSmsConst.SMPP_TLV_RECEIPTED_MESSAGE_ID;
                objAxTlv.ValueAsString = objIn.Reference;

                objTlv.TlvType    = SimTlv.TlvTypes.HEX;
                objTlv.TypedValue = objAxTlv.ValueAsHexString;
                objTlv.HexValue   = objTlv.TypedValue;
                objDlr.Tlvs.Add(objTlv);
            }

            // NOTE: submit date and done date are the same!

            string strExcerpt       = objIn.Body.Substring(0, Math.Min(objIn.Body.Length, 60));
            int    iNumSmsDelivered = nStatusCode == objSmsConst.SMPP_MESSAGESTATE_DELIVERED ? 1: 0;
            string strBody          = string.Format("id:{0} sub:001 dlvrd:{1:D3} submit date:{2:yyMMddHHmmss} done date:{2:yyMMddHHmmss} stat:{3} err:000 text:{4}",
                                                    objIn.Reference, iNumSmsDelivered, DateTime.Now, strStatusText, strExcerpt);

            // Complete delivery report formatting
            objDlr.IsDeliveryReport = true;
            objDlr.Body             = strBody.Substring(0, Math.Min(strBody.Length, 160));

            return(objDlr);
        }
Exemple #7
0
        private void lvMessages_DoubleClick(object sender, EventArgs e)
        {
            if (lvMessages.SelectedItems.Count <= 0)
            {
                return;
            }
            SimMessage objMessage = (SimMessage)lvMessages.SelectedItems[0].Tag;

            // See if I can find an active session for this message as well.
            // It's no problem if it's no longer there.
            SimSession objSession = null;

            ListViewItem[] lvs = lvSessions.Items.Find(objMessage.SessionId.ToString(), false);
            if (lvs.Length > 0)
            {
                objSession = (SimSession)lvs[0].Tag;
            }

            frmSmsMessage frm = new frmSmsMessage(objSession, objMessage, frmSmsMessage.EFrmType.VIEW, m_objSimModel.MultipartMode, m_objSimModel.UseGsmEncoding);

            // if it's a multipart message, try to find the rest of the parts as well
            if (objMessage.TotalParts > 1)
            {
                var lsParts = new List <SimMessage>();
                foreach (ListViewItem lvi in lvMessages.Items)
                {
                    SimMessage objPart = (SimMessage)lvi.Tag;
                    if (objPart.TotalParts > 1 &&
                        objPart.MultipartReference == objMessage.MultipartReference &&
                        objPart.Direction == objMessage.Direction)
                    {
                        lsParts.Add(objPart);
                        if (lsParts.Count == objMessage.TotalParts)
                        {
                            break;
                        }
                    }
                }
                frm.Parts = lsParts;
            }

            frm.ShowDialog();
        }
Exemple #8
0
        private void btnEditAutoMessage_Click(object sender, EventArgs e)
        {
            if (lvAutoMessage.SelectedItems.Count <= 0)
            {
                return;
            }

            SimMessage    objMessage = (SimMessage)lvAutoMessage.SelectedItems[0].Tag;
            frmSmsMessage frm        = new frmSmsMessage(null, objMessage, frmSmsMessage.EFrmType.EDIT, m_objSimModel.MultipartMode, m_objSimModel.UseGsmEncoding);

            if (frm.ShowDialog() == DialogResult.OK)
            {
                ListViewItem lvi = lvAutoMessage.SelectedItems[0];
                lvi.SubItems[AUTOMESSAGE_FROMADDRESS].Text = objMessage.FromAddress;
                lvi.SubItems[AUTOMESSAGE_TOADDRESS].Text   = objMessage.ToAddress;
                lvi.SubItems[AUTOMESSAGE_BODY].Text        = objMessage.Body;
            }
            PushAutoMessages();
        }
Exemple #9
0
        void bw_AddOutgoing(SimMessage objMessage, Queue <SimMessage> qOut, List <SimMessage> lsGenerated, bool bCouldBeMultipart)
        {
            var lsParts = new List <SimMessage>();

            if (bCouldBeMultipart)
            {
                AxSms.Message objRoot = objMessage.CreateAxSms();
                if (m_objSplitSms.CountParts(objRoot) > 1)
                {
                    AxSms.Message objPart = m_objSplitSms.GetFirstPart(objRoot);
                    while (m_objSplitSms.LastError == 0)
                    {
                        lsParts.Add(new SimMessage(objPart));
                        objPart = m_objSplitSms.GetNextPart();
                    }
                }
            }

            if (lsParts.Count == 0)
            {
                lsParts.Add(objMessage);
            }

            if (qOut.Count > MAX_OUTGOING)
            {
                foreach (SimMessage objPart in lsParts)
                {
                    objPart.Status = "SIMQFULL";
                    lsGenerated.Add(objPart);
                }
            }
            else
            {
                foreach (SimMessage objPart in lsParts)
                {
                    objPart.Status  = "QUEUED";
                    objPart.UserTag = m_objSimModel.GetAndIncLastUserTag();
                    lsGenerated.Add(objPart);
                    qOut.Enqueue(objPart);
                }
            }
        }
Exemple #10
0
        private void bw_DoWork(BackgroundWorker objWorker, Logger objLogger, AxSms.SmppServer objServer)
        {
            if (m_objSimModel.IsServerLogEnabled)
            {
                objServer.LogFile = m_objSimModel.ServerLog;
            }

            AxSms.Constants objSmsConsts = new AxSms.Constants();

            objServer.LastReference = m_objSimModel.LastReference;
            objServer.Start(m_objSimModel.Port, m_objSimModel.IpVersion, m_objSimModel.Certificate);

            SimCommand objCommand = new SimCommand();

            objCommand.CommandId            = SimCommand.ECommandId.RESPONSECODE;
            objCommand.LastError            = objServer.LastError;
            objCommand.LastErrorDescription = objServer.GetErrorDescription(objServer.LastError);
            m_objSimModel.IsServerStarted   = objServer.LastError == 0;
            PushGui(objCommand);

            if (objServer.LastError != 0)
            {
                objLogger.WriteLine("SmppServer, failed: [{0}:{1}]", objCommand.LastError, objCommand.LastErrorDescription);
                return;
            }
            else
            {
                objLogger.WriteLine("SmppServer started");
            }

            // Initialize Smpp instance to do SMS splitting
            // This is very convenient because we don't need to use the orginal SmppSession object
            m_objSplitSms = new AxSms.Smpp();
            m_objSplitSms.MultipartMode  = m_objSimModel.MultipartMode;
            m_objSplitSms.UseGsmEncoding = m_objSimModel.UseGsmEncoding;

            // Replies
            long          nLastReloadReplies = GetTickCount();
            bool          bEcho         = m_objSimModel.Echo;
            SimErrorRates objErrorRates = m_objSimModel.GetErrorRates();

            // Auto messages
            long nLastReloadAutoMsg = GetTickCount();
            var  lsAutoMessages     = new List <SimMessage>();

            lsAutoMessages = m_objSimModel.GetAutoMessages();
            int    nGeneratePerMinute = m_objSimModel.GeneratePerMinute;
            bool   bRandomOrder       = m_objSimModel.RandomOrder;
            int    nAutoMsgIndex      = 0;
            Random objRandom          = new Random();

            var dctWrkSessions = new Dictionary <int, WrkSession>();

            while (!objWorker.CancellationPending)
            {
                var lsMessagesUpdated   = new List <SimMessage>();
                var lsMessagesGenerated = new List <SimMessage>();
                var lsMessagesReceived  = new List <SimMessage>();

                // Check if the GUI has some requests
                while ((objCommand = PollGui()) != null)
                {
                    WrkSession objWrkSession = null;
                    dctWrkSessions.TryGetValue(objCommand.SessionId, out objWrkSession);
                    switch (objCommand.CommandId)
                    {
                    case SimCommand.ECommandId.DROPSESSION:
                        if (objWrkSession != null)
                        {
                            objWrkSession.bDrop = true;
                        }
                        break;

                    case SimCommand.ECommandId.SENDMESSAGE:
                        if (objWrkSession != null)
                        {
                            bw_AddOutgoing(objCommand.Message, objWrkSession.qOutMessages, lsMessagesGenerated, true);
                        }
                        break;
                    }
                }

                // Quit if the server stopped for some reason
                if (!objServer.IsStarted)
                {
                    m_objSimModel.IsServerStarted = false;
                    break;
                }

                // Reset statistics count
                int nRecvPerSecond = 0, nSentPerSecond = 0;
                // Handle connected sessions
                var lsSessions               = new List <SimSession>();
                AxSms.SmppSession objSession = objServer.GetFirstSession();
                while (objServer.LastError == 0)
                {   // Creating objSimSession object early and only access it's properties since
                    // accessing ActiveX properties (and methods) seems to be expensive in C#
                    SimSession objSimSession = new SimSession(objSession);
                    lsSessions.Add(objSimSession);

                    // Get the current worker session
                    WrkSession objWrkSession = null;
                    if (!dctWrkSessions.ContainsKey(objSession.Id))
                    {
                        dctWrkSessions[objSession.Id] = objWrkSession = new WrkSession(objSimSession, GetTickCount());
                    }
                    else
                    {
                        objWrkSession = dctWrkSessions[objSession.Id];
                    }

                    // Handle session bind requests
                    if (objSimSession.ConnectionState == objSmsConsts.SMPP_SESSIONSTATE_BINDING)
                    {
                        // Respond to a bind required. If authentication is required test sysid
                        int iResponse = 0;
                        if (m_objSimModel.IsAuthRequired &&
                            (objSimSession.SystemId != m_objSimModel.SystemId ||
                             objSimSession.Password != m_objSimModel.Password))
                        {
                            iResponse = objSmsConsts.SMPP_ESME_RINVPASWD;
                        }
                        objSession.RespondToBind(iResponse);

                        // Generate a logfile path and set it
                        if (m_objSimModel.IsSessionLogEnabled)
                        {
                            string strLogIp;
                            if (objSimSession.Ip.Contains("."))
                            {   // IPv4; np
                                strLogIp = objSimSession.Ip;
                            }
                            else
                            {   // IPv6, can't have ':''s in a filename !
                                strLogIp = string.Format("[{0}]", objSimSession.Ip).Replace(':', '_');
                            }

                            string strLogPath = string.Format("{0}{1}_{2}.log",
                                                              m_objSimModel.SessionLog, strLogIp, objSimSession.Port);
                            objSession.LogPduDetails = m_objSimModel.IsPduLogEnabled;
                            objSession.LogFile       = strLogPath;
                        }

                        // Apply server settings
                        objSession.PduTimeout      = m_objSimModel.PduTimeout;
                        objSession.EnquireInterval = m_objSimModel.EnquireInterval;
                        objSession.UseGsmEncoding  = m_objSimModel.UseGsmEncoding;
                        objSession.DeliverMode     = m_objSimModel.DeliverMode;
                    }

                    // Generate auto-messages.
                    int iNumMessages = objWrkSession.CalculateMessagesToSend(GetTickCount(), nGeneratePerMinute);
                    if (lsAutoMessages.Count > 0)
                    {
                        for (int i = 0; i < iNumMessages; i++)
                        {   // Determine the message index of the auto-message to sent
                            if (bRandomOrder)
                            {
                                nAutoMsgIndex = objRandom.Next(lsAutoMessages.Count);
                            }
                            else
                            {
                                if (nAutoMsgIndex < lsAutoMessages.Count - 1)
                                {
                                    nAutoMsgIndex++;
                                }
                                else
                                {
                                    nAutoMsgIndex = 0;
                                }
                            }

                            // If there's room in the output queue, add it to the output queue
                            // othewise, reject the message, queue full..
                            SimMessage objMessage = new SimMessage(lsAutoMessages[nAutoMsgIndex]);
                            objMessage.SessionId = objSimSession.Id;
                            objMessage.SystemId  = objSimSession.SystemId;
                            bw_AddOutgoing(objMessage, objWrkSession.qOutMessages, lsMessagesGenerated, true);
                        }
                    }

                    // Sent SMS messages in sent queue
                    int nOut = objSession.CountSmsDeliverySpace();
                    while (objWrkSession.qOutMessages.Count > 0 && nOut > 0)
                    {
                        SimMessage    objSimMessage = objWrkSession.qOutMessages.Dequeue();
                        AxSms.Message objMessage    = objSimMessage.CreateAxSms();

                        // reject multipart messages because they should all have been splitup before beeing
                        // added to the output queue.
                        objSession.DeliverSms(objMessage, objSmsConsts.MULTIPART_REJECT);
                        if (objSession.LastError != 0)
                        {
                            objSimMessage.Status = string.Format("SUBMITERROR({0})", objSession.LastError);
                        }
                        else
                        {
                            objSimMessage.Status = "DELIVERED";
                        }

                        lsMessagesUpdated.Add(objSimMessage);
                    }

                    // Fetch updates for messages that have been sent
                    AxSms.Message objResponse = objSession.ReceiveDeliverResponse();
                    while (objSession.LastError == 0)
                    {
                        SimMessage objSimMessage = new SimMessage(objResponse);
                        objSimMessage.SystemId  = objSimSession.SystemId;
                        objSimMessage.SessionId = objSimSession.Id;
                        objSimMessage.Status    = objSmsConsts.SmppEsmeToString(objSimMessage.CommandStatus).Replace("SMPP_ESME_", "");
                        lsMessagesUpdated.Add(objSimMessage);
                        objResponse = objSession.ReceiveDeliverResponse();
                    }

                    // Fetch received messages
                    AxSms.Message objReceived = objSession.ReceiveSubmitSms();
                    while (objSession.LastError == 0)
                    {
                        SimMessage objSimMessage = new SimMessage(objReceived);
                        objSimMessage.SystemId  = objSimSession.SystemId;
                        objSimMessage.SessionId = objSimSession.Id;

                        // Determine command status
                        int nCommandStatus     = 0;
                        int nRandCmdStatus     = objRandom.Next(100);
                        int nRandCmdStatusOffs = 0;
                        foreach (SimMessageErrorRate objErrr in objErrorRates.MessageErrorRates)
                        {
                            nRandCmdStatusOffs += objErrr.Occurance;
                            if (nRandCmdStatus <= nRandCmdStatusOffs)
                            {
                                nCommandStatus = objErrr.StatusCode;
                                break;
                            }
                        }

                        // Respond to SMS message
                        objReceived.SmppCommandStatus = objSimMessage.CommandStatus = nCommandStatus;
                        objSession.RespondToSubmitSms(objReceived);

                        // Set message status text and add it to the 'received' list
                        // generate a usertag for received messages as well. The GUI relies on every message to have a unique ID
                        objSimMessage.Status  = objSmsConsts.SmppEsmeToString(objSimMessage.CommandStatus).Replace("SMPP_ESME_", "");
                        objSimMessage.UserTag = m_objSimModel.GetAndIncLastUserTag();
                        lsMessagesReceived.Add(objSimMessage);

                        // Determine command status
                        if (objSimMessage.RequestDeliveryReport && nCommandStatus == 0)
                        {
                            int    nRandDlrStatus     = objRandom.Next(100);
                            int    nRandDlrStatusOffs = 0;
                            int    nStatusCode        = objSmsConsts.SMPP_MESSAGESTATE_DELIVERED;
                            string strStatusText      = "DELIVRD";
                            foreach (SimDeliveryErrorRate objErrr in objErrorRates.DeliveryErrorRates)
                            {
                                nRandDlrStatusOffs += objErrr.Occurance;
                                if (nRandDlrStatus <= nRandDlrStatusOffs)
                                {
                                    nStatusCode   = objErrr.Code;
                                    strStatusText = objErrr.Text;
                                    break;
                                }
                            }
                            SimMessage objDlr = bw_CreateDlr(objSimMessage, objSimSession.Version, nStatusCode, strStatusText, objSmsConsts);
                            bw_AddOutgoing(objDlr, objWrkSession.qOutMessages, lsMessagesGenerated, false);
                        }

                        if (bEcho)
                        {
                            SimMessage objEcho = new SimMessage(objSimMessage);
                            objEcho.FromAddress    = objSimMessage.ToAddress;
                            objEcho.FromAddressNpi = objSimMessage.ToAddressNpi;
                            objEcho.FromAddressTon = objSimMessage.ToAddressTon;
                            objEcho.ToAddress      = objSimMessage.FromAddress;
                            objEcho.ToAddressNpi   = objSimMessage.FromAddressNpi;
                            objEcho.ToAddressTon   = objSimMessage.FromAddressTon;
                            bw_AddOutgoing(objEcho, objWrkSession.qOutMessages, lsMessagesGenerated, false);
                        }

                        objReceived = objSession.ReceiveSubmitSms();
                    }

                    // Don't support SMS queries
                    objReceived = objSession.ReceiveQuerySms();
                    while (objSession.LastError == 0)
                    {   // Just immediately respond with an error.
                        objReceived.SmppCommandStatus = objSmsConsts.SMPP_ESME_RINVCMDID;
                        objSession.RespondToQuerySms(objReceived);
                        objReceived = objSession.ReceiveQuerySms();
                    }

                    if (objWrkSession.bDrop)
                    {
                        objSession.Disconnect();
                    }

                    // Update statistics
                    nRecvPerSecond += objSession.SmsReceivedPerSecond;
                    nSentPerSecond += objSession.SmsSentPerSecond;

                    objSession = objServer.GetNextSession();
                }

                // Make a list of disconnected sessions
                var lsDisconnected = new List <SimSession>();
                objSession = objServer.GetClosedSession();
                while (objServer.LastError == 0)
                {
                    SimSession objSimSession = new SimSession(objSession);
                    lsDisconnected.Add(objSimSession);
                    dctWrkSessions.Remove(objSimSession.Id);
                    objSession = objServer.GetClosedSession();
                }

                // Set global stats
                m_objSimModel.RecvPerSecond = nRecvPerSecond;
                m_objSimModel.SentPerSecond = nSentPerSecond;
                m_objSimModel.LastReference = objServer.LastReference;

                // See if there's a need to sent the delta messages to the GUI
                if (lsMessagesUpdated.Count > 0 ||
                    lsMessagesReceived.Count > 0 ||
                    lsMessagesGenerated.Count > 0)
                {
                    objCommand                   = new SimCommand();
                    objCommand.CommandId         = SimCommand.ECommandId.MESSAGESDELTA;
                    objCommand.MessagesUpdated   = lsMessagesUpdated;
                    objCommand.MessagesReceived  = lsMessagesReceived;
                    objCommand.MessagesGenerated = lsMessagesGenerated;
                    PushGui(objCommand);
                }

                if (lsDisconnected.Count > 0)
                {
                    objCommand           = new SimCommand();
                    objCommand.CommandId = SimCommand.ECommandId.DROPSESSION;
                    objCommand.Sessions  = lsDisconnected;
                    PushGui(objCommand);
                }

                // Don't continuously refresh the auto-messages. They are not updated that often and
                // a small lag here is not very noticable.
                if (GetTickCount() - nLastReloadAutoMsg > AUTOMESSAGE_RELOAD_TOMS)
                {
                    nLastReloadAutoMsg = GetTickCount();
                    lsAutoMessages     = m_objSimModel.GetAutoMessages();
                    nGeneratePerMinute = m_objSimModel.GeneratePerMinute;
                    bRandomOrder       = m_objSimModel.RandomOrder;
                }

                // Don't continuously refresh reply settings, but do refresh them a bit
                // more often than the autoreply settings because its very visible.
                if (GetTickCount() - nLastReloadReplies > REPLIES_RELOAD_TOMS)
                {
                    nLastReloadReplies = GetTickCount();
                    bEcho         = m_objSimModel.Echo;
                    objErrorRates = m_objSimModel.GetErrorRates();
                }

                m_objSimModel.SetSessions(lsSessions);

                Thread.Sleep(100);
            }
        }
Exemple #11
0
        private void frmMain_Load(object sender, EventArgs e)
        {
            var objSettings = Settings.Default;

            // force save settings right away
            objSettings.LastReference = objSettings.LastReference;
            objSettings.Save();

            m_Logger = new Logger(objSettings.ViewLogFile);
            m_Logger.WriteLine("Startup SMPP Simulator");

            m_objSimWorker    = new SimWorker();
            m_objSimModel     = m_objSimWorker.SimModel;
            m_objSmsConstants = new AxSms.Constants();

            // IP Version combo box
            var dctIpVersion = new Dictionary <string, int>();

            dctIpVersion.Add("IPv6/IPv4", m_objSmsConstants.SMPP_IPVERSION_BOTH);
            dctIpVersion.Add("IPv6", m_objSmsConstants.SMPP_IPVERSION_6);
            dctIpVersion.Add("IPv4", m_objSmsConstants.SMPP_IPVERSION_4);

            cbxIpVersion.DisplayMember = "Key";
            cbxIpVersion.ValueMember   = "Value";
            cbxIpVersion.DataSource    = new BindingSource(dctIpVersion, null);

            // Make sure to update all the SESSION_ constants when changing stuff here !!!!
            lvSessions.Columns.Add("Client IP", (int)(lvSessions.Width * .25), HorizontalAlignment.Left);
            lvSessions.Columns.Add("Client Port", (int)(lvSessions.Width * .25), HorizontalAlignment.Left);
            lvSessions.Columns.Add("SystemID", (int)(lvSessions.Width * .24), HorizontalAlignment.Left);
            lvSessions.Columns.Add("Connection State", (int)(lvSessions.Width * .25), HorizontalAlignment.Left);
            lvSessions.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);

            // Make sure to update all the MESSAGE_ constants when changing stuff here !!!!
            lvMessages.Columns.Add("Dir.", (int)(lvMessages.Width * .1), HorizontalAlignment.Left);
            lvMessages.Columns.Add("SystemID", (int)(lvMessages.Width * .20), HorizontalAlignment.Left);
            lvMessages.Columns.Add("ToAddress", (int)(lvMessages.Width * .15), HorizontalAlignment.Left);
            lvMessages.Columns.Add("Reference", (int)(lvMessages.Width * .15), HorizontalAlignment.Left);
            lvMessages.Columns.Add("State", (int)(lvMessages.Width * .15), HorizontalAlignment.Left);
            lvMessages.Columns.Add("Body", -2, HorizontalAlignment.Left);

            // Make sure to update all the AUTOMESSAGE_ constants when changing stuff here !!!!
            lvAutoMessage.Columns.Add("FromAddress", (int)(lvAutoMessage.Width * .20), HorizontalAlignment.Left);
            lvAutoMessage.Columns.Add("ToAddress", (int)(lvAutoMessage.Width * .20), HorizontalAlignment.Left);
            lvAutoMessage.Columns.Add("Body", (int)(lvAutoMessage.Width * .59), HorizontalAlignment.Left);

            // Set the hyperlinks in the GUI
            llblAxLink.Text = "Try other SMS software products by Auron Software.";
            llblAxLink.Links.Add(llblAxLink.Text.IndexOf("SMS software products"), "SMS software products".Length, "https://www.auronsoftware.com/products/");
            llblAxLink.LinkClicked += new LinkLabelLinkClickedEventHandler(llblAxLink_LinkClicked);

            llblFooterText.Text  = "Auron SMPP Simulator is freeware. It uses Auron SMS Component.\r\n";
            llblFooterText.Text += "For more information on Auron SMS products, click here.";
            llblFooterText.Links.Add(llblFooterText.Text.IndexOf("click here"), "click here".Length, "https://www.auronsoftware.com/products/");
            llblFooterText.LinkClicked += new LinkLabelLinkClickedEventHandler(llblAxLink_LinkClicked);

            // Initialize model
            m_objSimModel.LastReference       = objSettings.LastReference + SimConstants.ADDREFERENCES_ONAPPSTART;
            m_objSimModel.Port                = objSettings.Port;
            m_objSimModel.IpVersion           = objSettings.IpVersion;
            m_objSimModel.IsAuthRequired      = objSettings.AuthRequired;
            m_objSimModel.SystemId            = objSettings.SystemId;
            m_objSimModel.Password            = objSettings.Password;
            m_objSimModel.IsPduLogEnabled     = objSettings.PduLogEnabled;
            m_objSimModel.IsServerLogEnabled  = objSettings.ServerLogEnabled;
            m_objSimModel.IsSessionLogEnabled = objSettings.SessionLogEnabled;
            m_objSimModel.ServerLog           = objSettings.ServerLog;
            m_objSimModel.SessionLog          = objSettings.SessionLog;
            m_objSimModel.GeneratePerMinute   = objSettings.GeneratePerMinute;
            m_objSimModel.RandomOrder         = objSettings.RandomOrder;
            m_objSimModel.Echo                = objSettings.Echo;
            m_objSimModel.PduTimeout          = objSettings.PduTimeout;
            m_objSimModel.EnquireInterval     = objSettings.EnquireInterval;
            m_objSimModel.UseGsmEncoding      = objSettings.UseGsmEncoding;
            m_objSimModel.MultipartMode       = objSettings.MultipartMode;
            m_objSimModel.DeliverMode         = objSettings.DeliverMode;
            m_objSimModel.CertificateStore    = objSettings.CertificateStore;

            m_nKeepMaxMessages    = objSettings.KeepMessages;
            m_strAutoMessagesFile = objSettings.AutoMessageFile;

            // pre-load auto messages
            if (LoadAutoMessages(m_strAutoMessagesFile) != 0)
            {
                SimMessage objMessage = null;
                AddToAutoMessage(new SimMessage("+123123123", SimConstants.DEFAULT_FROMADDRESS, "Hello, World!"));
                AddToAutoMessage(objMessage = new SimMessage("+321321321", SimConstants.DEFAULT_FROMADDRESS, "مرحبا، العالم"));
                objMessage.DataCoding       = m_objSmsConstants.DATACODING_UNICODE;
                AddToAutoMessage(objMessage = new SimMessage("+231231231", SimConstants.DEFAULT_FROMADDRESS, "नमस्ते दुनिया"));
                objMessage.DataCoding       = m_objSmsConstants.DATACODING_DEFAULT;
                objMessage.LanguageShift    = m_objSmsConstants.LANGUAGE_SINGLESHIFT_HINDI;
                AddToAutoMessage(objMessage = new SimMessage("+123123123", SimConstants.DEFAULT_FROMADDRESS, "48656c6c6f2c20576f726c6421"));
                objMessage.BodyFormat       = m_objSmsConstants.BODYFORMAT_HEX;
            }
            PushAutoMessages();

            // Push error rates to model.
            SimErrorRates objErrorRates    = new SimErrorRates();
            string        strMessageRates  = objSettings.MessageErrorRates;
            string        strDeliveryRates = objSettings.DeliveryErrorRates;

            string[] aMessageRates = strMessageRates.Split(';');
            try
            {
                foreach (string strMessageRate in aMessageRates)
                {
                    SimMessageErrorRate objErrr      = new SimMessageErrorRate();
                    string[]            aMessageRate = strMessageRate.Split(',');
                    objErrr.StatusCode = int.Parse(aMessageRate[0]);
                    objErrr.Occurance  = int.Parse(aMessageRate[1]);
                    objErrorRates.MessageErrorRates.Add(objErrr);
                }
            }
            catch (Exception x)
            {
                m_Logger.WriteLine("Error while parsing message rates: {0}", x.ToString());
            }

            string[] aDeliveryRates = strDeliveryRates.Split(';');
            try
            {
                foreach (string strDeliveryRate in aDeliveryRates)
                {
                    SimDeliveryErrorRate objErrr       = new SimDeliveryErrorRate();
                    string[]             aDeliveryRate = strDeliveryRate.Split(',');
                    objErrr.Code      = int.Parse(aDeliveryRate[0]);
                    objErrr.Text      = aDeliveryRate[1];
                    objErrr.Occurance = int.Parse(aDeliveryRate[2]);
                    objErrorRates.DeliveryErrorRates.Add(objErrr);
                }
            }
            catch (Exception x)
            {
                m_Logger.WriteLine("Error while parsing delivery rates: {0}", x.ToString());
            }

            m_objSimModel.SetErrorRates(objErrorRates);

            // Set other control values
            txtServerLog.Text          = m_objSimModel.ServerLog;
            txtSessionLog.Text         = m_objSimModel.SessionLog;
            cbEnableServerLog.Checked  = m_objSimModel.IsServerLogEnabled;
            cbEnableSessionLog.Checked = m_objSimModel.IsSessionLogEnabled;
            cbEnablePduLog.Checked     = m_objSimModel.IsPduLogEnabled;
            cbAuthentication.Checked   = m_objSimModel.IsAuthRequired;
            txtSystemId.Text           = m_objSimModel.SystemId;
            txtPassword.Text           = m_objSimModel.Password;
            txtMaxSendPerMinute.Text   = m_objSimModel.GeneratePerMinute.ToString();
            cbRandom.Checked           = m_objSimModel.RandomOrder;
            cbEcho.Checked             = m_objSimModel.Echo;

            ReloadCertificates();

            objSettings.Save();
            UpdateControls();
        }
Exemple #12
0
        private void btnSaveAutoMessage_Click(object sender, EventArgs e)
        {
            SaveFileDialog dlg = new SaveFileDialog();

            dlg.Filter = "XML Files|*.xml";
            if (dlg.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            XmlWriter objXmlWriter = null;

            try
            { // Save to an XML file
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;

                objXmlWriter = XmlWriter.Create(dlg.FileName, settings);
                objXmlWriter.WriteStartDocument();
                objXmlWriter.WriteStartElement(SimConstants.XML_AUTOMESSAGE_ROOT_NODE);
                foreach (ListViewItem objLvi in lvAutoMessage.Items)
                {
                    SimMessage objMessage = (SimMessage)objLvi.Tag;
                    objXmlWriter.WriteStartElement(SimConstants.XML_AUTOMESSAGE_ELEMENT_NODE);
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TOADDRESS, objMessage.ToAddress);
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TONPI, objMessage.ToAddressNpi.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TOTON, objMessage.ToAddressTon.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_FROMADDRESS, objMessage.FromAddress);
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_FROMNPI, objMessage.FromAddressNpi.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_FROMTON, objMessage.FromAddressTon.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_BODY, objMessage.Body);
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_HASUDH, objMessage.HasUdh.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_ISDLR, objMessage.IsDeliveryReport.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_BODYFORMAT, objMessage.BodyFormat.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_DATACODING, objMessage.DataCoding.ToString());
                    objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_LANGUAGESHIFT, objMessage.LanguageShift.ToString());
                    foreach (SimTlv objTlv in objMessage.Tlvs)
                    {
                        objXmlWriter.WriteStartElement(SimConstants.XML_AUTOMESSAGE_ELEMENT_TLV);
                        objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TAG, objTlv.Tag.ToString());
                        objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TYPE, objTlv.TlvType.ToString());
                        objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_HEXVALUE, objTlv.HexValue);
                        objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TYPEDVALUE, objTlv.TypedValue);
                        objXmlWriter.WriteEndElement();
                    }
                    objXmlWriter.WriteEndElement();
                }
                objXmlWriter.WriteEndElement();
                objXmlWriter.WriteEndDocument();
            }
            catch
            {
                m_Logger.WriteLine("SaveAutoMessages failed, exception: {0}", e.ToString());
                MessageBox.Show("Error while saving XML file.", Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            if (objXmlWriter != null)
            {
                objXmlWriter.Close();
            }
        }
Exemple #13
0
        private int LoadAutoMessages(string strFile)
        {
            XmlTextReader objXml = null;

            try
            {
                var lsAutoMsg = new List <SimMessage>();
                objXml = new XmlTextReader(strFile);
                SimMessage objMessage = null;
                while (objXml.Read())
                {
                    if (objXml.NodeType == XmlNodeType.Element &&
                        objXml.Name == SimConstants.XML_AUTOMESSAGE_ELEMENT_NODE)
                    {
                        objMessage = new SimMessage(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TOADDRESS],
                                                    objXml[SimConstants.XML_AUTOMESSAGE_FIELD_FROMADDRESS], objXml[SimConstants.XML_AUTOMESSAGE_FIELD_BODY]);
                        objMessage.ToAddressNpi     = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TONPI]);
                        objMessage.ToAddressTon     = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TOTON]);
                        objMessage.FromAddressNpi   = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_FROMNPI]);
                        objMessage.FromAddressTon   = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_FROMTON]);
                        objMessage.HasUdh           = bool.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_HASUDH]);
                        objMessage.IsDeliveryReport = bool.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_ISDLR]);
                        objMessage.DataCoding       = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_DATACODING]);
                        objMessage.BodyFormat       = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_BODYFORMAT]);
                        objMessage.LanguageShift    = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_LANGUAGESHIFT]);
                        lsAutoMsg.Add(objMessage);
                    }
                    else if (objXml.NodeType == XmlNodeType.Element &&
                             objXml.Name == SimConstants.XML_AUTOMESSAGE_ELEMENT_TLV)
                    {
                        SimTlv objTlv = new SimTlv();
                        objTlv.Tag        = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TAG]);
                        objTlv.TlvType    = (SimTlv.TlvTypes)Enum.Parse(typeof(SimTlv.TlvTypes), objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TYPE]);
                        objTlv.HexValue   = objXml[SimConstants.XML_AUTOMESSAGE_FIELD_HEXVALUE];
                        objTlv.TypedValue = objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TYPEDVALUE];
                        if (objMessage != null)
                        {
                            objMessage.Tlvs.Add(objTlv);
                        }
                    }
                }

                lvAutoMessage.Items.Clear();
                foreach (SimMessage objSms in lsAutoMsg)
                {
                    AddToAutoMessage(objSms);
                }
                PushAutoMessages();
            }
            catch (Exception e)
            { // Error while reading the XML file
                m_Logger.WriteLine("LoadAutoMessages failed, exception: {0}", e.ToString());
                return(1);
            }

            if (objXml != null)
            {
                objXml.Close();
            }

            return(0);
        }
Exemple #14
0
        private void tmrServer_Tick(object sender, EventArgs e)
        {
            ////////////////////////////////////////////////////////////////////////////////
            // Update server status
            ////////////////////////////////////////////////////////////////////////////////
            if (!m_objSimModel.IsServerStarted)
            {
                tmrServer.Stop();
                UpdateControls();
                return;
            }

            ////////////////////////////////////////////////////////////////////////////////
            // Update session information
            ////////////////////////////////////////////////////////////////////////////////
            var lsSessions = m_objSimModel.GetSessions();

            foreach (SimSession objSession in lsSessions)
            {
                ListViewItem[] lvs = lvSessions.Items.Find(objSession.Id.ToString(), false);
                if (lvs.Length == 0)
                { // Add new session information
                    ListViewItem lvi = new ListViewItem(new String[]
                    {
                        objSession.Ip, objSession.Port.ToString(), objSession.SystemId,
                        getSessionStateString(objSession.ConnectionState)
                    });
                    lvi.Tag  = objSession;
                    lvi.Name = objSession.Id.ToString();
                    lvSessions.Items.Add(lvi);
                }
                else
                { // Update session information
                    ListViewItem lvi = lvs[0];
                    lvi.SubItems[LVI_SESSION_SYSTEMID].Text        = objSession.SystemId;
                    lvi.SubItems[LVI_SESSION_CONNECTIONSTATE].Text =
                        getSessionStateString(objSession.ConnectionState);
                }
            }

            ////////////////////////////////////////////////////////////////////////////////
            // Handle worker messages
            ////////////////////////////////////////////////////////////////////////////////

            SimCommand objCommand = null;

            while ((objCommand = m_objSimWorker.PollWorker()) != null)
            {
                if (objCommand.CommandId == SimCommand.ECommandId.DROPSESSION)
                {
                    foreach (SimSession objSession in objCommand.Sessions)
                    {
                        lvSessions.Items.RemoveByKey(objSession.Id.ToString());
                    }
                }
                else if (objCommand.CommandId == SimCommand.ECommandId.MESSAGESDELTA)
                {
                    // These are new SMS messages that have been gerenated inside the worker thread
                    m_nTotalMessages += objCommand.MessagesGenerated.Count;
                    foreach (SimMessage objSms in objCommand.MessagesGenerated)
                    {
                        SimMessage objMessage = new SimMessage(objSms);
                        objMessage.Direction = SimMessage.EMsgDir.OUT;
                        AddToMessages(objMessage);
                    }

                    // These are SMS messages that are received in the worker thread
                    m_nTotalMessages += objCommand.MessagesReceived.Count;
                    foreach (SimMessage objSms in objCommand.MessagesReceived)
                    {
                        SimMessage objMessage = new SimMessage(objSms);
                        objMessage.Direction = SimMessage.EMsgDir.IN;
                        AddToMessages(objMessage);
                    }

                    // These are updates for SMS messages we already know about
                    foreach (SimMessage objSms in objCommand.MessagesUpdated)
                    {
                        ListViewItem[] lvs = lvMessages.Items.Find(objSms.UserTag.ToString(), false);
                        if (lvs.Length == 0)
                        {
                            continue;
                        }

                        ListViewItem objLvi = lvs[0];
                        objLvi.SubItems[LVI_MESSAGE_STATE].Text = objSms.Status;
                        if (objSms.Reference != null)
                        {
                            objLvi.SubItems[LVI_MESSAGE_REFERENCE].Text = objSms.Reference;
                        }

                        SimMessage objOther = (SimMessage)objLvi.Tag;
                        objOther.Reference = objSms.Reference;
                    }
                }
            }

            ////////////////////////////////////////////////////////////////////////////////
            // Update settings
            ////////////////////////////////////////////////////////////////////////////////

            m_objSimModel.SystemId       = txtSystemId.Text;
            m_objSimModel.Password       = txtPassword.Text;
            m_objSimModel.IsAuthRequired = cbAuthentication.Checked;

            m_objSimModel.GeneratePerMinute = int.Parse(txtMaxSendPerMinute.Text);
            m_objSimModel.RandomOrder       = cbRandom.Checked;

            m_objSimModel.Echo = cbEcho.Checked;

            m_nKeepMaxMessages = int.Parse(txtKeepNumberMessages.Text);

            int nReceived = m_objSimModel.RecvPerSecond;
            int nSent     = m_objSimModel.SentPerSecond;

            UpdateLables(nReceived, nSent);
        }