C# 通過短信貓(使用深圳市仕方通信的4G短信報警模塊)實現的一個短信網關,可實時收短信並根據短信內容調用指定的接口實現聯動其它系統或者寫入數據庫
實現步驟:
1、下載我的資源裏的相應類庫DLL。
2、下載Log4jnet.dll,方便日誌記錄。
先看一下效果:
3、直接看代碼,如下:
Program.cs
using GSMMODEM;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web.Script.Serialization;
using LOG;
using System.Text.RegularExpressions;
using System.Collections;
namespace GSM_LTE_MODEM
{
class Program
{
//delegate void SmsReceive;
static GsmModem gm;
static Dictionary<string, object> config;
static void Main(string[] args)
{
gm = new GsmModem();
listen();
//send("153****1260","TEST");
while (true)
{
Thread.Sleep(500);
}
}
#region 發送短信
static void send(string phone,string sms)
{
try
{
gm.SendMsg(phone, sms);
Console.WriteLine("發送成功");
}
catch
{
Console.WriteLine("發送失敗");
return;
}
}
#endregion
#region 監聽接收短信
static void listen()
{
try
{
config = load_config();
Log.info("配置加載成功");
}
catch
{
Log.info("配置加載失敗");
return;
}
gm.ComPort = "COM1";
gm.BaudRate = 115200;
gm.AutoDelMsg = true;
gm.Open();
gm.SmsRecieved += gm_SmsRecieved;
if (gm.IsOpen)
{
Log.info("串口連接成功");
}
else
{
Log.error("串口設備未連接");
}
}
#endregion
#region 新消息處理事件
static void gm_SmsRecieved(object sender, EventArgs e)
{
Log.info("有新的消息");
if (gm.IsOpen)
{
try
{
DecodedMessage dm = gm.ReadNewMsg();
Log.info(string.Format("手機號碼[{0}]\t短信內容[{1}]\t發送時間[{2}]" ,dm.PhoneNumber, dm.SmsContent, dm.SendTime.ToString()));
try
{
dispose(dm.PhoneNumber, dm.SmsContent);
Log.info("消息處理成功");
}
catch
{
Log.error("消息處理失敗");
}
}
catch
{
Log.error("消息讀取失敗");
return;
}
}
else
{
Log.error("串口關閉,讀取消息失敗");
}
}
#endregion
#region 新消息處理
static void dispose(string phone,string sms)
{
sms = sms.Trim().Replace("\0","");
phone = phone.Trim();
object[] obj = (object[])config["service"];
foreach (Dictionary<string, object> o in obj)
{
string pattern = o["regex"].ToString();
string url = o["url"].ToString();
if (Regex.IsMatch(sms, pattern))
{
sms = System.Web.HttpUtility.UrlEncode(sms, System.Text.Encoding.UTF8);
string req = string.Format("destnationNo={0}&mobile={1}&content={2}{3}", "15657191916_4g", phone, sms, o["requisition"].ToString());
try
{
string ret = HTTPRequest.post(url,req);
if (ret.Contains("fail"))
{
Log.error("調用接口" + url + ",失敗!");
}
else
{
Log.info("調用接口" + url + ",成功!");
}
}
catch (Exception e)
{
Log.error("調用接口" + url + ",失敗!");
}
}
}
}
#endregion
#region 加載配置
static Dictionary<String, object> load_config()
{
StreamReader sr = new StreamReader("config.ini");
string json = sr.ReadToEnd();
JavaScriptSerializer java = new JavaScriptSerializer();
Dictionary<String, object> o = (Dictionary<String, object>)java.DeserializeObject(json);
sr.Close();
return o;
}
#endregion
}
}
Log.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using log4net;
using System.Reflection;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace LOG
{
class Log
{
public static void info(string message){
//string filename = System.DateTime.Now.Year +"_"+ System.DateTime.Now.Month+"_"+ System.DateTime.Now.Day;
//string filepath = "logs"+filename+".txt";
//System.IO.StreamWriter write = new System.IO.StreamWriter(filepath, true);
//write.WriteLine(System.DateTime.Now.ToString() + ":"+message);
//write.Close();
ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//記錄錯誤日誌
//log.Error("error", new Exception("發生了一個異常"));
//記錄嚴重錯誤
//log.Fatal("fatal", new Exception("發生了一個致命錯誤"));
//記錄一般信息
log.Info(message);
//記錄調試信息
//log.Debug("debug");
//記錄警告信息
//log.Warn("warn");
}
public static void error(string message)
{
//string filename = System.DateTime.Now.Year +"_"+ System.DateTime.Now.Month+"_"+ System.DateTime.Now.Day;
//string filepath = "logs"+filename+".txt";
//System.IO.StreamWriter write = new System.IO.StreamWriter(filepath, true);
//write.WriteLine(System.DateTime.Now.ToString() + ":"+message);
//write.Close();
ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//記錄錯誤日誌
log.Error(message);
//記錄嚴重錯誤
//log.Fatal("fatal", new Exception("發生了一個致命錯誤"));
//記錄一般信息
//log.Info("info");
//記錄調試信息
//log.Debug("debug");
//記錄警告信息
//log.Warn("warn");
}
}
}
HTTPRequest.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace GSM_LTE_MODEM
{
class HTTPRequest
{
/// <summary>
/// 公共請求方法
/// </summary>
/// <param name="requestUrl">請求的URL</param>
/// <param name="requestStr">需要傳的參數</param>
/// <returns></returns>
public static string post(string requestUrl, string requestStr)
{
WebRequest request = WebRequest.Create(requestUrl);//創建請求
request.Method = "POST"; //請求方式
request.ContentType = "application/x-www-form-urlencoded"; //請求類型
//將參數轉換爲二進制流
byte[] requestBytes = Encoding.Default.GetBytes(requestStr);
request.ContentLength = requestBytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(requestBytes, 0, requestBytes.Length);
requestStream.Close();
string result = "";
try
{
WebResponse response = request.GetResponse(); //創建相應並接收相應
Stream ReceiveStream = response.GetResponseStream(); //創建接收流
StreamReader sr = new StreamReader(ReceiveStream, Encoding.UTF8);
result = sr.ReadToEnd();
sr.Close();
}
catch (Exception)
{
result = "fail";
}
return result;
}
public static string get(string url)
{
WebRequest request = WebRequest.Create(url);//創建請求
request.Method = "GET"; //請求方式
request.ContentType = "text/html;charset=UTF-8"; //請求類型
string result = "";
try
{
WebResponse response = request.GetResponse(); //創建相應並接收相應
Stream ReceiveStream = response.GetResponseStream(); //創建接收流
StreamReader sr = new StreamReader(ReceiveStream, Encoding.UTF8);
result = sr.ReadToEnd();
sr.Close();
}
catch (Exception)
{
result = "fail";
}
return result;
}
}
}
配置文件config.ini
{"id":1,"service":[{"regex":"\\w+","url":"http://*******:****/update","requisition":""}]}
程序配置文件App.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<log4net>
<!-- 將日誌輸出到控制檯 -->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level - %message%newline"/>
</layout>
</appender>
<!-- 按日期切分日誌文件,並將日期作爲日誌文件的名字 -->
<appender name="RollingFileAppenderNameByDate" type="log4net.Appender.RollingFileAppender">
<!-- 日誌文件存放位置,可以爲絕對路徑也可以爲相對路徑 -->
<file value="Logs/"/>
<!-- 將日誌信息追加到已有的日誌文件中-->
<appendToFile value="true"/>
<!-- 最小鎖定模式,以允許多個進程可以寫入同一個文件 -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<!-- 指定按日期切分日誌文件 -->
<rollingStyle value="Date"/>
<!-- 日誌文件的命名規則 -->
<datePattern value=""Logs_"yyyyMMdd".log""/>
<!-- 當將日期作爲日誌文件的名字時,必須將staticLogFileName的值設置爲false -->
<staticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level - %message%newline"/>
</layout>
</appender>
<root>
<!--控制級別,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定義級別爲INFO,則INFO級別向下的級別,比如DEBUG日誌將不會被記錄
如果沒有定義LEVEL的值,則缺省爲DEBUG-->
<level value="ALL"/>
<!--將日誌輸出到控制檯-->
<appender-ref ref="ConsoleAppender"/>
<!--將日誌寫到文件中
<appender-ref ref="FileAppender" />
按文件大小切分日誌文件
<appender-ref ref="RollingFileAppenderBySize" />
按日期切分日誌文件-->
<!--<appender-ref ref="RollingFileAppenderByDate" />
按日期切分日誌文件,並將日期作爲日誌文件的名字-->
<appender-ref ref="RollingFileAppenderNameByDate"/>
<!--既按大小又按日期切分日誌文件-->
<!--<appender-ref ref="RollingFileAppenderBySizeAndDate" />-->
<!--將日誌利用ADO.NET記錄到數據庫中
<appender-ref ref="AdoNetAppender_SQLServer" />-->
</root>
</log4net>
</configuration>