SMS Client - Server Software is used for sending, reading, deleting messages. It uses GSM modem for sending SMS. It listens for incoming messages to arrive, processes the read message and takes action accordingly. This SMS software requires GSMComm Library which you can also download.
Note - As of today (03/15/2015), I am deprecating this article in favor of a reliable way of managing SMS without the need for thirdparty libraries like GSMComm. Please feel free to have a look into the below article.
SMS client and server is an application software which is used for sending and receiving messages(SMS). It listens for incoming messages to arrive, processes the message if it's in a valid format. Note the processing of arrived messages depends on the application which will be discussed later. I am going to explain the following things:
I have used the GSMComm
Library for Sending and Receiving SMS. You require a GSM modem or phone for sending an SMS.
CommSetting
class is used for storing comm port settings:
C#
public
class
CommSetting {public
static
int
Comm_Port=0
;public
static
Int64
Comm_BaudRate=0
;public
static
Int64
Comm_TimeOut=0
;public
static
GsmCommMain comm;public
CommSetting() { } }
Comm
is an object of type GsmCommMain
which is required for sending and receiving messages. We have to set the Comm
port, Baud rate and time out for our comm
object of type GsmCommMain
. Then try to open with the above settings. We can test the Comm port settings by clicking on the Test button after selecting the Comm port, baud rate and Time out. Sometimes if the comm port is unable to open, you will get a message "No phone connected". This is mainly due to Baud rate settings. Change the baud rate and check again by clicking the Test button until you get a message "Successfully connected to the phone."
Before creating a GSMComm
object with settings, we need to validate the port number, baud rate and Timeout.
The EnterNewSettings()
does validation, returns true
if valid, and will invoke SetData(port,baud,timeout)
for comm setting.
The following block of code will try to connect. If any problem occurs "Phone not connected" message appears and you can either retry by clicking on the Retry button or else Cancel.
C#
GsmCommMain comm =new
GsmCommMain(port, baudRate, timeout);try
{ comm.Open();while
(!comm.IsConnected()) { Cursor.Current = Cursors.Default;if
(MessageBox.Show(this
,"
No phone connected."
,"
Connection setup"
, MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel) { comm.Close();return
; } Cursor.Current = Cursors.WaitCursor; } comm.Close(); }catch
(Exception ex) { MessageBox.Show(this
,"
Connection error: "
+ ex.Message,"
Connection setup"
, MessageBoxButtons.OK, MessageBoxIcon.Warning);return
; } MessageBox.Show(this
,"
Successfully connected to the phone."
,"
Connection setup"
, MessageBoxButtons.OK, MessageBoxIcon.Information);
We are going to register the following events for GSMComm
object comm
.
PhoneConnected
comm_PhoneConnected
which will invoke OnPhoneConnectionChange(bool connected)
with the help of Delegate ConnectedHandler
.MessageReceived
MessageReceivedEventHandler
. When the incoming message arrives, the comm_MessageReceived
method will be invoked which in turn calls the MessageReceived()
method in order to process the unread message. GSMComm
object comm
has a method ReadMessages
which will be used for reading messages. It accepts the following parameters phone status (All
, ReceivedRead
, ReceivedUnread
, StoredSent
, and StoredUnsent
) and storage type: SIM memory or Phone memory.C#
private
void
MessageReceived() { Cursor.Current = Cursors.WaitCursor;string
storage = GetMessageStorage(); DecodedShortMessage[] messages = CommSetting.comm.ReadMessages (PhoneMessageStatus.ReceivedUnread, storage);foreach
(DecodedShortMessage messagein
messages) { Output(string
.Format("
Message status = {0}, Location = {1}/{2}"
, StatusToString(message.Status), message.Storage, message.Index)); ShowMessage(message.Data); Output("
"
); } Output(string
.Format("
{0,9} messages read."
, messages.Length.ToString())); Output("
"
); }
The above code will read all unread messages from SIM memory. The method ShowMessage
is used for displaying the read message. The message may be a status report, stored message sent/un sent, or a received message.
You can send an SMS by keying in the destination phone number and text message.
If you want to send a message in your native language (Unicode), you need to check in Send as Unicode(UCS2). GSMComm
object comm
has a SendMessage
method which will be used for sending SMS to any phone. Create a PDU for sending messages. We can create a PDU in straight forward version as:
C#
SmsSubmitPdu pdu =new
SmsSubmitPdu (txt_message.Text,txt_destination_numbers.Text,"
"
);
An extended version of PDU is used when you are sending a message in Unicode.
C#
try
{ SmsSubmitPdu pdu;bool
alert = chkAlert.Checked;bool
unicode = chkUnicode.Checked;if
(!alert && !unicode) { pdu =new
SmsSubmitPdu (txt_message.Text, txt_destination_numbers.Text,"
"
); }else
{byte
dcs;if
(!alert && unicode) dcs = DataCodingScheme.NoClass_16Bit;else
if
(alert && !unicode) dcs = DataCodingScheme.Class0_7Bit;else
if
(alert && unicode) dcs = DataCodingScheme.Class0_16Bit;else
dcs = DataCodingScheme.NoClass_7Bit; pdu =new
SmsSubmitPdu (txt_message.Text, txt_destination_numbers.Text,"
"
, dcs); }int
times = chkMultipleTimes.Checked ?int
.Parse(txtSendTimes.Text) :1
;for
(int
i=0
;i<times;i++) { CommSetting.comm.SendMessage(pdu); Output("
Message {0} of {1} sent."
, i+1, times); Output("
"
); } }catch
(Exception ex) { MessageBox.Show(ex.Message); } Cursor.Current = Cursors.Default;
You can read all messages from the phone memory of SIM memory. Just click on "Read All Messages" button. The message details such as sender, date-time, text message will be displayed on the Data Grid. Create a new row for each read message, add to Data table and assign the Data table to datagrid's source
C#
private
void
BindGrid(SmsPdu pdu) { DataRow dr=dt.NewRow(); SmsDeliverPdu data = (SmsDeliverPdu)pdu; dr[0]=data.OriginatingAddress.ToString(); dr[1]=data.SCTimestamp.ToString(); dr[2]=data.UserDataText; dt.Rows.Add(dr); dataGrid1.DataSource=dt; }
The above code will read all unread messages from SIM memory. The method ShowMessage
is used for displaying the read message. The message may be a status report, stored message sent/un sent, or a received message. The only change in processing Received message and Read message is the first parameter.
C#
DecodedShortMessage[] messages = CommSetting.comm.ReadMessages(PhoneMessageStatus.ReceivedUnread, storage);
C#
DecodedShortMessage[] messages = CommSetting.comm.ReadMessages(PhoneMessageStatus.All, storage);
All messages which are sent by the users will be stored in SIM memory and we are going to display them in the Data grid. We can delete a single message by specifying the message index number. We can delete all messages from SIM memory by clicking on "Delete All" button. Messages are deleted based on the index. Every message will be stored in memory with a unique index.
The following code will delete a message based on index:
C#
CommSetting.comm.DeleteMessage(index, storage);
To delete all messages from memory( SIM/Phone)
C#
CommSetting.comm.DeleteMessages(DeleteScope.All, storage);
The DeleteScope
is an Enum
which contains:
All
Read
ReadAndSent
ReadSentAndUnsent
Here are some interesting applications where you can use and modify this software.
The customer has agreed for pre paid electricity recharges with the help of recharge coupons. The coupon is made available at shops. The customer will first buy the coupons from shops; every coupon consists of Coupon PIN which will be masked, the customer needs to scratch to view the PIN number. The customer will send an SMS to the SMS Server with a specified message format for recharging.
Message Format for Recharging:
RECHARGE <Coupon No> <Customer ID>
On the Server, the Database consists of Customer information along with his telephone number, there will a field named Amount
which will be used and updated when the customer recharged with some amount. This application becomes somewhat complex, an automatic meter reading software along with hardware needs to be integrated with this. Automatic meter reading systems will read all meter readings and calculate the amount to be deducted for the customer.
You can implement as astrology software. The user will send an SMS with his zodiac sign. The SMS server will maintain an Astrology Database with zodiac sign and a text description which contains a message for the day. The Database is required to be updated daily for all zodiac signs.
Message Format which will be used by the user to get message of the day:
Zodiac Sign
We can implement a remote controlling system, for example you need to:
You can send an SMS. The SMS server will listen and then process the message. Based on the message format sent by the user we can take action.
Example if message format is:
SHUTDOWN
Send to SMS phone number.
This project wouldn't be completed unless I thank the GSMComm
Lib developer "Stefan Mayr". I customized my application using this Library. You can download the sample project, library from the web link which I provided under the Reference section.
With high quality products and considerate service, we will work together with you to enhance your business and improve the efficiency. Please don't hesitate to contact us to get more details of gsm modems.