Exemple #1
0
 public void PushGui(SimCommand objCmd)
 {
     lock (this)
     {
         m_qToGui.Enqueue(objCmd);
     }
 }
Exemple #2
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 #3
0
 public void PushWorker(SimCommand objCmd)
 {
     lock (this)
     {
         m_qToWorker.Enqueue(objCmd);
     }
 }
Exemple #4
0
        private void btnDropSession_Click(object sender, EventArgs e)
        {
            if (lvSessions.SelectedItems.Count == 0)
            {
                return;
            }
            SimSession objSession = (SimSession)lvSessions.SelectedItems[0].Tag;

            SimCommand objCommand = new SimCommand();

            objCommand.CommandId = SimCommand.ECommandId.DROPSESSION;
            objCommand.SessionId = objSession.Id;

            m_objSimWorker.PushWorker(objCommand);
        }
Exemple #5
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 #6
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);
        }
Exemple #7
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            // This can take a second
            WaitCursor wait = new WaitCursor();

            // Set global atom to put the SMS Component into 'freeware mode'.
            // The atom will be cleared by the SMS Component on detection.
            GlobalAddAtom(SimConstants.ATOM_FREEWAREMODE);
            if (txtPort.Text == string.Empty)
            {
                MessageBox.Show("Please enter a port number", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // Set global settings
            m_objSimModel.Port                = int.Parse(txtPort.Text);
            m_objSimModel.IpVersion           = (int)cbxIpVersion.SelectedValue;
            m_objSimModel.ServerLog           = txtServerLog.Text;
            m_objSimModel.SessionLog          = txtSessionLog.Text;
            m_objSimModel.IsPduLogEnabled     = cbEnablePduLog.Checked;
            m_objSimModel.IsServerLogEnabled  = cbEnableServerLog.Checked;
            m_objSimModel.IsSessionLogEnabled = cbEnableSessionLog.Checked;
            m_objSimModel.Certificate         = (string)cbxCertificate.SelectedValue;
            SaveSettings();

            // flush worker command queue
            SimCommand objCommand = null;

            while ((objCommand = m_objSimWorker.PollWorker()) != null)
            {
            }

            m_objSimWorker.StartServer();

            // Wait a second for the server to start
            long lEndTo = GetTickCount() + 2000;

            objCommand = null;
            while ((objCommand = m_objSimWorker.PollWorker()) == null &&
                   GetTickCount() < lEndTo)
            {
                Thread.Sleep(10);
            }

            // Display error
            if (objCommand != null && objCommand.LastError != 0)
            {
                string strMsg = string.Format("Error while starting SMPP server: {0}", objCommand.LastErrorDescription);
                MessageBox.Show(strMsg, Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            else if (objCommand == null)
            { // This is kindof a weird situation; try to clean everything up nicely..
                MessageBox.Show("Error while starting SMPP server: startup timed out.",
                                Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                btnStop.PerformClick();
                return;
            }

            tmrServer.Start();
            UpdateControls();
        }
 public SimCommand(SimCommand objOther)
 {
 }