using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.EnterpriseServices;
namespace Client
{
[Synchronization(SynchronizationOption.Required)]
public class Snd2Rcv
{
public delegate void FlashUiMsg(string msg);
Object loglock = new Object();
// Object dblock = new object();
FormMain mainform = new FormMain();
private int SMSSIZE = 70;
public Snd2Rcv(FormMain parent)
{
mainform = parent;
}
public void FlashMainMsg(string msg)
{
try
{
if (mainform.InvokeRequired)
{
mainform.Invoke(new FlashUiMsg(mainform.SetUiMsg), msg);
}
}
catch (Exception ex)
{
WriteLogs(" Falsh Message Error" + ex.Message);
}
}
public void SendSms(object o)
{
string com = o.ToString();
RESTART:
using (SMS.ComPort cp = new SMS.ComPort(com))
{
try
{
#region init comport
try
{
cp.Init();
}
catch (Exception ex)
{
FlashMainMsg(" 初始化端口" + com.ToString() + "失败");
WriteLogs(" 初始化端口失败" + ex.Message + Environment.NewLine);
try
{
cp.Reset();
}
catch (Exception ex0)
{
WriteLogs("初始后重启失败" + ex0.Message + Environment.NewLine);
}
cp.Close();
cp.Dispose();
Thread.Sleep(3 * 60 * 1000);//停3分钟再初始化
goto RESTART;
}
#endregion
#region 开始发送短信
while (true)
{
Bussiness.BLL bll = new Bussiness.BLL();
if (!cp.IsOpen())
{
try
{
cp.Close();
Thread.Sleep(5 * 1000);
cp.Init();
try
{
cp.Reset();
}
catch (Exception ex0)
{
WriteLogs("初始后重启失败" + ex0.Message + Environment.NewLine);
}
goto RESTART;
}
catch (Exception ex)
{
FlashMainMsg(ex.Message);
Thread.Sleep(5 * 1000);
try
{
cp.Reset();
}
catch (Exception ex0)
{
WriteLogs("初始后重启失败" + ex0.Message + Environment.NewLine);
}
goto RESTART;
}
}
//
//*****************************************************************************************
//收短信
try
{
string strpudsms = cp.GetPDUSMS();
//WriteLogs(strpudsms + "****" + com);
List<SMS.SMessage> smss = SMS.SPDU.GetSMSFromCMGL(strpudsms);
if (smss.Count > 0)
{
WriteLogs(com + "收到短信: " + ":" + smss.Count.ToString() + "条");
foreach (SMS.SMessage msg in smss)
{
WriteLogs(" com" + com + " 发送手机号:" + msg.RemoteNo + " 时间:" + msg.RecvDatetime + " 消息:" + msg.Text);
try
{
Bussiness.RcvSms rcvsms = new Bussiness.RcvSms();
rcvsms.sms = msg.Text;
rcvsms.sndmobile = msg.RemoteNo;
rcvsms.rcvdate = DateTime.Now;
string rcvcom =System.Configuration.ConfigurationManager.AppSettings["clientreg"] +":"+ com;
rcvsms.rcvmobile = bll.GetMobileByCom(rcvcom);
bll.UpdateRcvLog(rcvsms);
}
catch(Exception ex)
{
WriteLogs("写收到短信到DB # ERROR :" + ex.Message);
}
cp.DeleteSMS(msg.Id);
FlashMainMsg(" 收到短信" + msg.RemoteNo
+ Environment.NewLine
+ "===================================="
);
}//foreach
}
}
catch (Exception ex)
{
WriteLogs(" 收短信错误 " + ex.Message + Environment.NewLine);
}
//收短信结束
//*****************************************************************************************
if (CheckTime() == false) //没有在时间区间内
{
//if (cp.IsOpen())
// cp.Close();
Thread.Sleep(3 * 60 * 1000);//休息三分钟
FlashMainMsg("不在时间内,休息中");
//cp.Reset();
continue;
}
//=============================================================================================
Bussiness.SendRule rule = new Bussiness.SendRule();
Bussiness.GetSndRecord_Result sndrcd = new Bussiness.GetSndRecord_Result();
SMSSIZE = 70;
int len = 0;
string content = "";
int cm = 0;
int ch = 0;
int cd = 0;
string rcvmobile = "";
string sndmobile = "";
try
{
// Monitor.Enter(dblock);
if (CheckTask(bll, com, ref sndrcd, ref rule) == false)
{
// Monitor.Exit(dblock);
continue;
}
len = sndrcd.smscontent.Count(); //短信长度
content = sndrcd.smscontent.Trim(); //短信内容
cm = (int)sndrcd.countm;//分钟刻度中余额
ch = (int)sndrcd.counth;//小时刻度中余额
cd = (int)sndrcd.countd;//天刻度中的余额
rcvmobile = sndrcd.rcvmobile;//接收号码
sndmobile = sndrcd.sndmobile;//中心号码即发送号码
}
catch (Exception ex)
{
WriteLogs(" 从数据库中取记录" + ex.Message);
// Monitor.Exit(dblock); 不能锁数据库
continue;
}
finally
{
// Monitor.Exit(dblock);
}
//***************开始发送
FlashMainMsg(" 开始发送短信[" + com.ToString() + "]");
string sendrlt = "";
int sendflag = 0;
try
{
string ret = "";
string pdu = "";
string sndinf = "***********************";
/*#############*/
//长短信
if (content.Length > SMSSIZE)
{
try
{
int SMSSIZE0 = 67;//非常重要
int count = (content.Length + SMSSIZE0 - 1) / SMSSIZE0;
int index = 0;
while (index < count)
{
string cc = "";
int startindex = 0;
int length = 0;
try
{
startindex = index * SMSSIZE0;
length=Math.Min(SMSSIZE0, content.Length - index * SMSSIZE0);
cc = content.Substring(startindex,length);
index++;
pdu = SMS.SPDU.GetToOther(out len, cc, rcvmobile, count, index);
}
catch( Exception exx)
{
this.WriteLogs(" 长短信装配时失败" + com.ToString() + exx.Message + "#" + content + "#startindex:" + startindex.ToString() + "#length:" + length.ToString() +"#smssize" + SMSSIZE0.ToString());
FlashMainMsg(" 长短信装配时失败" + com.ToString() + exx.Message + "#" + content + "#startindex:" + startindex.ToString() + "#length:" + length.ToString() + "#smssize" + SMSSIZE0.ToString());
break;
}
int ic = 0;
while (ic < 3) //三次发不成功,即不再发送
{
ret = cp.SendPDUSMS(pdu, len);
if (ret.IndexOf("+CMGS") >= 0 && ret.IndexOf("OK") >= 0)
{
break;
}
ic++;
}
if (ic == 3) //中间的某一条失败三次,即该条也不再发送
{
break;
}
}
sndinf += count.ToString() + "条";
}
catch (Exception exx)
{
this.WriteLogs(" 长短信失败" + com.ToString() + exx.Message +"#" + content);
FlashMainMsg(" 长短信失败" + com.ToString() + exx.Message + "#" + content);
}
}
else //普通短信
{
try
{
sndinf += "1条";
// pdu = SMS.SPDU.GetToOther(out len, content, "13990605643");
pdu = SMS.SPDU.GetToOther(out len, content, rcvmobile);
ret = cp.SendPDUSMS(pdu, len);
}
catch (Exception ex)
{
this.WriteLogs(" 普通短信失败" + com.ToString() + ex.Message);
FlashMainMsg(" 普通短信失败" + com.ToString() + ex.Message);
}
}
if (ret.IndexOf("+CMGS") >= 0 && ret.IndexOf("OK") >= 0)
{
sendrlt = "成功";
sendflag = 1;
sndinf += "成功";
}
else
{
sndinf += "失败" + ret;
sendrlt = ret;
//不必每条都初始化,异常后初始化
cp.Close();
cp.Init();
Thread.Sleep(5 * 1000);
}
FlashMainMsg(" 本次发送结束"
+ com.ToString() + "……"
+ sndinf);
}
catch (Exception ex)
{
sendrlt = ex.Message;
this.WriteLogs(" 端口发送失败,初始化" + com.ToString() + ex.Message);
FlashMainMsg(" 端口发送失败,初始化" + com.ToString() + ex.Message);
if (cp.IsOpen())
cp.Close();
try
{
cp.Reset();
}
catch (Exception ex0)
{
WriteLogs("初始后重启失败" + ex0.Message + Environment.NewLine);
}
Thread.Sleep(5 * 60 * 1000);//异常后初始化,休息五分钟
goto RESTART;
}
//***************发送结果写向服务器
bll = new Bussiness.BLL();
Bussiness.SendLogs log = new Bussiness.SendLogs();
log.msgid = (int)sndrcd.msgid;
log.planid = (int)sndrcd.ptid;
log.rcvmobile = rcvmobile;
log.sndmobile = sndmobile;
log.senddate = DateTime.Now;
log.flag = sendflag;
Bussiness.Result r = bll.InsertSendLog(log);
FlashMainMsg(" 写日志" + "[" + log.rcvmobile + "]" + r.Msg
+ Environment.NewLine
+ "===================================="
);
//****************结束
//cp.Close();
FlashMainMsg(" 处理完毕一个待发号" + com.ToString()
+ Environment.NewLine
+ "===================================="
);
}//while over
#endregion
}// USERING TRY
catch (Exception ex)
{
FlashMainMsg(ex.Message);
try
{
cp.Reset();
}
catch (Exception ex0)
{
WriteLogs("初始后重启失败" + ex0.Message + Environment.NewLine);
}
Thread.Sleep(5 * 1000);
goto RESTART;
}
}//usring
}
public void RcvSMS(object oc)
{
string com = oc.ToString();
using (SMS.ComPort comport = new SMS.ComPort(com.ToString()))
{
comport.Init();
Bussiness.BLL bll = new Bussiness.BLL();
while (true)
{
try
{
string strpudsms = comport.GetPDUSMS();
List<SMS.SMessage> smss = SMS.SPDU.GetSMSFromCMGL(strpudsms);
foreach (SMS.SMessage msg in smss)
{
//报到
string mobile = msg.RemoteNo;
string pcom = msg.Text;
if (pcom.Contains(":COM"))
bll.ReportMyCom2Mobile(mobile, pcom);
comport.DeleteSMS(msg.Id);
FlashMainMsg(" 处理完毕一个报到" + pcom + "[" + mobile + "]"
+ Environment.NewLine
+ "===================================="
);
}//foreach
comport.Init();
}
catch
{
}
finally
{
}
Thread.Sleep(3 * 1000);
}//while
}//using
}
public void WriteLogs(string msg)
{
try
{
Monitor.Enter(loglock);
string dir = AppDomain.CurrentDomain.BaseDirectory + "\\logs";
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
string file = dir + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".log";
StreamWriter sw = new StreamWriter(file, true, System.Text.Encoding.UTF8);
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + msg);
sw.Close();
sw = null;
}
catch (Exception ex)
{
string t = ex.Message;
}
finally
{
Monitor.Exit(loglock);
}
}
public bool CheckTime()
{
bool agreensend = true;
string timspan = System.Configuration.ConfigurationManager.AppSettings["sndtimespan"];
string htimespan = System.Configuration.ConfigurationManager.AppSettings["holidaysndtimespan"];
string holiday = System.Configuration.ConfigurationManager.AppSettings["holiday"];
if (timspan != null && timspan.Length > 0)
{
agreensend = false;
}
//节假日
if (holiday.Split(new char[] { ',', ';' }).Contains(DateTime.Now.ToString("yyyy-MM-dd")))
{
foreach (string sp in htimespan.Split(new char[] { ',', ';' }))
{
string strstart = DateTime.Now.ToString("yyyy-MM-dd") + " " + sp.Substring(0, sp.IndexOf("-"));
string strend = DateTime.Now.ToString("yyyy-MM-dd") + " " + sp.Substring(sp.IndexOf("-") + 1);
//介于区间内,可以发送
if (DateTime.Now > DateTime.Parse(strstart) && DateTime.Now < DateTime.Parse(strend))
{
agreensend = true;
break;
}
}
}
else //普通日期
{
foreach (string sp in timspan.Split(new char[] { ',', ';' }))
{
string strstart = DateTime.Now.ToString("yyyy-MM-dd") + " " + sp.Substring(0, sp.IndexOf("-"));
string strend = DateTime.Now.ToString("yyyy-MM-dd") + " " + sp.Substring(sp.IndexOf("-") + 1);
//介于区间内,可以发送
if (DateTime.Now > DateTime.Parse(strstart) && DateTime.Now < DateTime.Parse(strend))
{
agreensend = true;
break;
}
}
}
return agreensend;
}
/// <summary>
/// 检查规则
/// </summary>
/// <param name="bll"></param>
/// <param name="com"></param>
/// <param name="sndrcd"></param>
/// <param name="rule"></param>
/// <returns></returns>
private bool CheckTask(Bussiness.BLL bll, object com, ref Bussiness.GetSndRecord_Result sndrcd,
ref Bussiness.SendRule rule)
{
//***************向服务器索取待发记录
sndrcd = new Bussiness.GetSndRecord_Result();
rule = new Bussiness.SendRule();
//获取当前端口的可发记录情况
//如果当前端口没有绑定手机号,将异常退出
string thiscom = System.Configuration.ConfigurationManager.AppSettings["clientreg"] + ":" + com.ToString();
if (bll.GetSndRecord(thiscom, out sndrcd).Ret > 0)
{
if (sndrcd.rcvmobile == null)
{
FlashMainMsg(" 已没有可发号码,结束[" + com.ToString() + "]");
return false;
}
}
else
{
FlashMainMsg(" 当前端口没有被分发任务,休息……[" + com.ToString() + "]");
if (rule.minute > 0)
Thread.Sleep(60 * 1000 / rule.minute); //最小规则休息
else
Thread.Sleep(60 * 1000);
return false;
}
return true;
}
}
}