c#实现短期的收发

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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值