How to Send Sms Through C# Code Using System.Io.Ports Using Gsm Modem

Sending an SMS through a GSM modem using asp.net C#

          public static bool SendSMSMobile(string MobNo, string MessageBody)
if (PortNo.Trim().Length >}0)
string[] pNo = new string[0];
bool IsSend = false;
try
{
MobNo = MobNo.Replace("(", "");
string MobNoPortNo = MobNo.Replace(")", "");"";
MobNo = MobNo.Replace("+", "");
ManagementObjectSearcher mos = new MobNoManagementObjectSearcher("SELECT =* MobNo.Replace("-",FROM ""Win32_POTSModem");
MobNo =foreach MobNo.Replace(",", "");

ManagementObject mo ifin (MobNomos.SubstringGet(0, 1) == "0" && MobNo.Length > 5)
{
MobNostring COMPort = MobNomo["AttachedTo"].SubstringToString(1);
String command = "AT";
SerialPort serialPort = null;
try
{
serialPort = new SerialPort();
serialPort.PortName = COMPort;
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.ReadTimeout = 300;
serialPort.WriteTimeout = 300;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.Open();
if (serialPort.IsOpen == true)
{
PortNo = COMPort;
Array.Resize(ref pNo, MobNopNo.Length -+ 1);
pNo[pNo.Length - 1] = PortNo;
}
if (MobNo }
catch { }
finally { serialPort.TrimClose(); serialPort.LengthDispose(); >=}
10 && }

if (PortNo.Trim().Length > 0)
{
int MsgLengthMobNo = ConvertMobNo.ToInt32Replace(MessageBody.Length"(", "");
int QMobNo = MsgLength /MobNo.Replace(")", 160;"");
int RMobNo = MsgLengthMobNo.Replace("+", %"");
160; MobNo = MobNo.Replace("-", "");
MobNo = MobNo.Replace(",", "");

if (RMobNo.Substring(0, 1) == "0" && MobNo.Length > 05)
{
QMobNo = QMobNo.Substring(1, +MobNo.Length 1;- 1);
}
forif (int iMobNo.Trim().Length =>= 0;10 i&& <PortNo.Length Q;> i++0)
{
int StartIndexMsgLength = iConvert.ToInt32(MessageBody.Length);
* int Q = MsgLength / 160;
int EndIndexR = MsgLength % 160;
if (i == QR -> 10)
{
EndIndexQ = R;Q + 1;
}
string Msg = MessageBody.Substring(StartIndex, EndIndex);
SerialPort sp = new SerialPort();

for (int qi = 0; qi < pNo.Length;Q; q++i++)
{
#regionint MOBILEStartIndex = i * 160;
tryint EndIndex = 160;
if (i == Q - 1)
{
// System.Windows.Forms.MessageBox.Show(pNo[q].ToString());
char[] arr = new char[1];
arr[0] = (char)26;
sp.PortName = pNo[q].ToString();
sp.BaudRate = 96000;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Handshake = Handshake.XOnXOff;
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.NewLine = Environment.NewLine;
sp.Open();
int mSpeed = 1;
sp.Write("AT+CMGF=1" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
sp.Write("AT+CSCS=GSM" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
sp.Write("AT+CMGS=" + (char)34 + "+91" + MobNo
+ (char)34 + Environment.NewLine);
System.Threading.Thread.Sleep(200);
sp.Write(Msg + (char)26);
System.Threading.Thread.Sleep(mSpeed);
IsSendEndIndex = true;R;
}
catchstring Msg = MessageBody.Substring(StartIndex, EndIndex);
SerialPort sp = new SerialPort();

for (int q = 0; q < pNo.Length; q++)
{
#region MOBILE
try
{
// System.Windows.Forms.MessageBox.Show(pNo[q].ToString());
char[] arr = new char[1];
arr[0] = (char)26;
sp.PortName = pNo[q].ToString();
sp.BaudRate = 96000;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Handshake = Handshake.XOnXOff;
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.NewLine = Environment.NewLine;
sp.Open();
int mSpeed = 1;
sp.Write("AT+CMGF=1" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
sp.Write("AT+CSCS=GSM" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
sp.Write("AT+CMGS=" + (char)34 + "+91" + MobNo
+ (char)34 + Environment.NewLine);
System.Threading.Thread.Sleep(200);
sp.Write(Msg + (char)26);
System.Threading.Thread.Sleep(mSpeed);
IsSend = true;
}
catch
{
IsSend = false;
}
finally
{
sp.Close();
sp.Dispose();
}
}
#endregion

}
#endregion

}
}
}
}
catch
catch
{
IsSend = false;
}
return IsSend;
}
return IsSend;
}

How to C# send AT command to GSM modem and get response

if ECHO is off on your modem, you won't get any response to your AT commands.

Ensure echo is enabled by sending ATE1 first

Thread.Sleep(1000);
_serialPort.WriteLine("ATE1" + "\r");

Thread.Sleep(1000);
_serialPort.WriteLine("AT" + "\r");

Receive SMS through GSM modem

Sorry for waiting for my reply, been busy lately.
In short this is my code for getting message from GSM USB dongle. I hope that it will be useful to someone...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace SMSget
{
public partial class SMSLogPanel : UserControl
{
SerialPort sp;
int datab = 0;
bool dtr = false;
bool encod;
Handshake h;
Parity p;
int wtimeout = 0;
StopBits s;

#region default constructor
public SMSLogPanel()
{
InitializeComponent();
this.sp = serialPort1 = new SerialPort();
this.datab = serialPort1.DataBits = 8;
this.dtr = serialPort1.DtrEnable = true;
this.encod = serialPort1.Encoding.Equals("iso-8859-1");
this.h = serialPort1.Handshake = Handshake.RequestToSend;
this.p = serialPort1.Parity = Parity.None;
this.wtimeout = serialPort1.WriteTimeout = 300;
this.s = serialPort1.StopBits = StopBits.One;
checkLink();
}
#endregion
#region checking communication and setting user controls...
private void checkLink()
{
GetValues value = new GetValues();
string com = value.getPort();
int baud = value.getBaud();
int timeot = value.getTimeout();
serialPort1.PortName = com;
serialPort1.BaudRate = baud;
serialPort1.ReadTimeout = timeot;

serialPort1.Open();
if (serialPort1.IsOpen)
{
label1.Visible = true;
}
else
{
MessageBox.Show("Komunikacija sa modemom se ne može uspostaviti, molimo postavite novu konfiguraciju...!");
this.Controls.Clear();
SMSConfigPanel cfg = new SMSConfigPanel();
cfg.Show();
this.Controls.Add(cfg);
}
serialPort1.Close();
}
#endregion
#region panel load method
private void SMSLogPanel_Load(object sender, EventArgs e)
{
setGSM();
}
#endregion
#region execute serialport handler
public void getMessage()
{
if (serialPort1.IsOpen)
{
serialPort1.DataReceived += new SerialDataReceivedEventHandler(getResponse);
}
else
{
MessageBox.Show("Nije moguće zaprimiti poruku, komunikacijski port nije otvoren...1");
return;
}
}
#endregion
#region get response from modem
public void getResponse(object sender, SerialDataReceivedEventArgs e)
{
SerialPort serPort = (SerialPort)sender;
string input = serPort.ReadExisting();

if (input.Contains("+CMT:"))
{

if (input.Contains("AT+CMGF=1"))
{
string[] message = input.Split(Environment.NewLine.ToCharArray()).Skip(7).ToArray();
textBox1.Text = string.Join(Environment.NewLine, message);
}
this.Invoke((MethodInvoker)delegate
{
textBox1.Text = input;
});
}
else
{
return;
}
}
#endregion
#region initialize GSM
private void setGSM()
{
serialPort1.Open();

if (!serialPort1.IsOpen)
{
MessageBox.Show("Problem u komunikaciji sa modemom, port nije otvoren...!");
}
serialPort1.Write("AT+CMGF=1" + (char)(13));
serialPort1.Write("AT+CNMI=1,2,0,0,0" + (char)(13));
}
#endregion
#region setiranje timer-a...
private void timer1_Tick_1(object sender, EventArgs e)
{
timer1.Stop();
getMessage();
timer1.Start();
}
#endregion
}

}

This was only code for testing so it works but there is lot to fix and improve. Basically it will be a nice start for all that are searching something like this...

cheers.

SMS connecting to a phone from C# and getting a response

This is my code that works (tested) with U9 Telia cellular modem:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Configuration;

using UsbEject.Library;
using Utils;

namespace Hardware
{
public class TeliaModem : IDisposable
{
public delegate void NewSmsHandler(InboundSMS sms);
public event NewSmsHandler OnNewSMS;

#region private data
System.IO.Ports.SerialPort modemPort;

Timeouter _lastModemKeepAlive;

private delegate void DataReceivedDelegate();
private DataReceivedDelegate dataReceivedDelegate;

Queue<OutboundSMS> _outSmses = new Queue<OutboundSMS>();

enum ModemState
{
Error = -1, NotInitialized, PowerUp, Initializing, Idle,
SendingSMS, KeepAliveAwaitingResponse
};

Timeouter ModemStateTimeouter = new Timeouter(timeout_s: 10, autoReset: false);
ModemState _modemState = ModemState.NotInitialized;
ModemState CurrentModemState
{
get
{
return _modemState;
}
set
{
_modemState = value;
ModemStateTimeouter.Reset();
NihLog.Write(NihLog.Level.Debug, "State changed to: " + value.ToString());
}
}

private System.Windows.Forms.Control _mainThreadOwnder;
#endregion

public TeliaModem(System.Windows.Forms.Control mainThreadOwnder)
{
_mainThreadOwnder = mainThreadOwnder;

dataReceivedDelegate = new DataReceivedDelegate(OnDataReceived);
}

public void SendSMS(string phone, string text)
{
_outSmses.Enqueue(new OutboundSMS(phone, text));
HeartBeat();
}

private void SendSmsNow()
{
OutboundSMS sms = _outSmses.Peek();
sms.Attempt++;
if (sms.Attempt > sms.MaxTries)
{
NihLog.Write(NihLog.Level.Error, "Failure to send after " + sms.MaxTries + " tries");
_outSmses.Dequeue();
return;
}

NihLog.Write(NihLog.Level.Info, "Sending SMS: " + sms.ToString());
WriteToModem("AT+CMGS=\"" + sms.Destination + "\"\r");
System.Threading.Thread.Sleep(500);
WriteToModem(sms.Text);

byte[] buffer = new byte[1];
buffer[0] = 26; // ^Z
modemPort.Write(buffer, offset:0, count:1);

CurrentModemState = ModemState.SendingSMS;
}

public void Dispose()
{
UninitModem();
}

public void HeartBeat()
{
if (CurrentModemState == ModemState.NotInitialized)
{
TryInitModem();
return;
}

if (IsTransitionalState(CurrentModemState) && ModemStateTimeouter.IsTimedOut())
{
NihLog.Write(NihLog.Level.Error, "Modem error. Timed out during " + CurrentModemState);
CurrentModemState = ModemState.Error;
return;
}

if (CurrentModemState == ModemState.Idle && _lastModemKeepAlive.IsTimedOut())
{
// Send keepalive
WriteToModem("AT\r");
CurrentModemState = ModemState.KeepAliveAwaitingResponse;
return;
}

if (CurrentModemState == ModemState.Error)
{
NihLog.Write(NihLog.Level.Debug, "Reenumerating modem...");
UninitModem();
return;
}

if (_outSmses.Count != 0 && CurrentModemState == ModemState.Idle)
{
SendSmsNow();
return;
}
}

private string pendingData;
private void OnDataReceived()
{
// Called in the main thread

string nowWhat = modemPort.ReadExisting();
pendingData += nowWhat;
string[] lines = pendingData.Split(new string[] { "\r\n" }, StringSplitOptions.None);
if (lines.Length == 0)
{
pendingData = string.Empty;
return;
}
else
{
pendingData = lines[lines.Length - 1];
}

// This happens in main thread.
for (int i = 0; i < lines.Length - 1; i++)
{
string line = lines[i];

if (line.Length >= 5 && line.Substring(0, 5) == "+CMT:")
{
// s+= read one more line
if (i == lines.Length - 1) // no next line
{
pendingData = line + "\r\n" + pendingData; // unread the line
continue;
}
string line2 = lines[++i];
NihLog.Write(NihLog.Level.Debug, "RX " + line);
NihLog.Write(NihLog.Level.Debug, "RX " + line2);
InboundSMS sms = new InboundSMS();
sms.ParseCMT(line, line2);
if(OnNewSMS != null)
OnNewSMS(sms);
}
else // Not a composite
NihLog.Write(NihLog.Level.Debug, "RX " + line);

if (line == "OK")
{
OnModemResponse(true);
}
else if (line == "ERROR")
{
OnModemResponse(false);
NihLog.Write(NihLog.Level.Error, "Modem error");
}
}
}

private void ProcessSmsResult(bool ok)
{
if (!ok)
{
OutboundSMS sms = _outSmses.Peek();
if (sms.Attempt < sms.MaxTries)
{
NihLog.Write(NihLog.Level.Info, "Retrying sms...");
return;
}

NihLog.Write(NihLog.Level.Error, "Failed to send SMS: " + sms.ToString());
}

_outSmses.Dequeue();
}

private void OnModemResponse(bool ok)
{
if (CurrentModemState == ModemState.SendingSMS)
ProcessSmsResult(ok);

if (!ok)
{
NihLog.Write(NihLog.Level.Error, "Error during state " + CurrentModemState.ToString());
CurrentModemState = ModemState.Error;
return;
}

switch (CurrentModemState)
{
case ModemState.NotInitialized:
return;

case ModemState.PowerUp:
WriteToModem("ATE0;+CMGF=1;+CSCS=\"IRA\";+CNMI=1,2\r");
CurrentModemState = ModemState.Initializing;
break;

case ModemState.Initializing:
case ModemState.SendingSMS:
case ModemState.KeepAliveAwaitingResponse:
CurrentModemState = ModemState.Idle;
break;
}
}

private void CloseU9TelitNativeApp()
{
bool doneSomething;

do
{
doneSomething = false;

Process[] processes = Process.GetProcessesByName("wirelesscard");
foreach (Process p in processes)
{
p.CloseMainWindow();
doneSomething = true;
NihLog.Write(NihLog.Level.Info, "Killed native U9 app");
System.Threading.Thread.Sleep(1000); // Will not wait if no native app is started
}
} while (doneSomething);
}

void WriteToModem(string s)
{
modemPort.Write(s);
NihLog.Write(NihLog.Level.Debug, "TX " + s);
}

void UninitModem()
{
if (modemPort != null)
modemPort.Dispose();
modemPort = null;
CurrentModemState = ModemState.NotInitialized;
}

private bool IsTransitionalState(ModemState ms)
{
return ms == ModemState.Initializing
|| ms == ModemState.SendingSMS
|| ms == ModemState.PowerUp
|| ms == ModemState.KeepAliveAwaitingResponse;
}

Timeouter _initFailureTimeout =
new Timeouter(timeout_s: 10, autoReset:false, timedOut:true);

void TryInitModem()
{
// Try pistoning the modem with higher frequency. This does no harm (such as redundant logging)
PrepareU9Modem(); // Will do nothing if modem is okay

if (!_initFailureTimeout.IsTimedOut())
return; // Don't try too frequently

if (modemPort != null)
return;

const string modemPortName = "Basecom HS-USB NMEA 9000";
const int speed = 115200;

string portName = Hardware.Misc.SerialPortFromFriendlyName(modemPortName);
if (portName == null)
{
NihLog.Write(NihLog.Level.Error, "Modem not found (yet). ");
_initFailureTimeout.Reset();
return;
}

NihLog.Write(NihLog.Level.Info, string.Format("Found modem port \"{0}\" at {1}", modemPortName, portName));
modemPort = new System.IO.Ports.SerialPort(portName, speed);
modemPort.ReadTimeout = 3000;
modemPort.NewLine = "\r\n";

modemPort.Open();

modemPort.DiscardInBuffer();
modemPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(delegate { _mainThreadOwnder.Invoke(dataReceivedDelegate); }); // called in different thread!

_lastModemKeepAlive = new Timeouter(60, true);

WriteToModem("AT+CFUN=1\r");
CurrentModemState = ModemState.PowerUp;
}

void CheatU9Telit()
{
// U9 telit appears as USB CDrom on the bus, until disk eject is sent.
// Then, it reappears as normal stuff.

VolumeDeviceClass volumeDeviceClass = new VolumeDeviceClass();
foreach (Volume device in volumeDeviceClass.Devices)
{
if (device.FriendlyName == "PCL HSUPA Modem USB Device")
{
NihLog.Write(NihLog.Level.Info, "Trying to initialize: " + device.FriendlyName);
device.EjectCDRomNoUI();
}
}
}

void PrepareU9Modem()
{
CloseU9TelitNativeApp(); // Closes the autorun native app
CheatU9Telit();
}
}

public class OutboundSMS
{
public string Destination;
public string Text;
public int MaxTries;
public int Attempt = 0;

public OutboundSMS(string dest, string txt)
{
Destination = dest;
Text = txt;
MaxTries = 3;
}

override public string ToString()
{
if(Attempt > 1)
return string.Format("\"{0}\" to {1}, attempt {2}",
Text, Destination, Attempt);
else
return string.Format("\"{0}\" to {1}",
Text, Destination);
}
}

public class InboundSMS
{
public string SourcePhone;
public DateTime ReceiveTime;
public string Text;

public void ParseCMT(string line1, string line2)
{
string[] fields = line1.Split(new char[] { ',', ' ', '/', ':', '"' });
if (fields.Length < 12)
throw new ApplicationException("CMT message too short. Expected 2 fields");

SourcePhone = fields[3];
ReceiveTime = DateTime.Parse("20" + fields[7] + "-" + fields[8] + "-" + fields[9] + " " + fields[10] + ":" + fields[11] + ":" + fields[12].Substring(0, 2)); //test carefully
Text = line2;
}
};
}

Usage example in a winforms application:

Hardware.TeliaModem _modem;

public Form1()
{
InitializeComponent();

_modem = new Hardware.TeliaModem(this);

_modem.OnNewSMS += new Hardware.TeliaModem.NewSmsHandler(ProcessNewSMS);

_timer.Interval = 1000; // milliseconds
_timer.Tick += new EventHandler(OnTimerTick);
_timer.Start();
}

To send an SMS:

        _modem.SendSMS(sms.SourcePhone, "Aircon is now " + BoolToString.ON_OFF(_aircon.On));

On timer event, once every second:

private void OnTimerTick(object o, EventArgs e)
{
_modem.HeartBeat();
}

This is registered as Winforms timer handler, so that modem will not have a thread.

Some utility classes used:

namespace Utils
{
public class StopWatch
{
protected DateTime _resetTime;

public StopWatch() { Reset(); }
public void Reset() { _resetTime = DateTime.Now; }
public double TotalSeconds { get { return (DateTime.Now - _resetTime).TotalSeconds; } }
public TimeSpan Time { get { return DateTime.Now - _resetTime; } }
};

public class Timeouter : StopWatch
{
private bool _autoReset;
private double _timeout_s;

public Timeouter(double timeout_s, bool autoReset, bool timedOut = false)
{
_timeout_s = timeout_s;
_autoReset = autoReset;

if (timedOut)
_resetTime -= TimeSpan.FromSeconds(_timeout_s + 1); // This is surely timed out, as requested
}

public bool IsTimedOut()
{
if (_timeout_s == double.PositiveInfinity)
return false;

bool timedout = this.TotalSeconds >= _timeout_s;

if (timedout && _autoReset)
Reset();

return timedout;
}

public void Reset(double timeout_s) { _timeout_s = timeout_s; Reset(); }
public double TimeLeft { get { return _timeout_s - TotalSeconds; } }
}
}

I implemented this in order to turn on air conditioner with SMS (yeah, I live in a hot country). It works. Please feel free to use any of this code.

Enjoy.



Related Topics



Leave a reply



Submit