天天看點

利用短信貓接收短信控制台程式

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO.Ports;

using System.Threading;

namespace SYGSM

{

    class GsmClass

    {

        /// <summary>

        /// GetMessage函數用于讀取SIM卡中的短信

        /// </summary>

        /// <param name="wz">短信位置</param>

        public static string[] GetMessage(string comn,int wz,bool delyn)

        {

            //定義短信端口操作類

            SerialPort serialPort = new SerialPort("COM" + comn.ToString(), 9600, Parity.None, 8, StopBits.One);

            serialPort.WriteTimeout = 2000;

            try

            {

                //設定讀緩沖區大小

                serialPort.ReadBufferSize = 900000;

                if (serialPort.IsOpen == false)

                    serialPort.Open();

                //向序列槽發出指令,清空以前的操作

                serialPort.WriteLine("ATZ/r");

                //延時1秒等待,序列槽操作完成

                Thread.Sleep(1000);

                //發出讀取指定位置的短信的指令

                serialPort.ReadExisting();

                serialPort.WriteLine("AT+CMGR=" + wz.ToString() + "/r");

                Thread.Sleep(2000);

                //取得傳回值(包含短信内容的字元串)

                string x3 = serialPort.ReadExisting();

                //向序列槽發出指令,删除已經被讀取的短信

                if (delyn)

                {

                    //延時2秒等待,序列槽操作完成

                    Thread.Sleep(200);

                    serialPort.WriteLine("AT+CMGD=" + wz.ToString() + "/r/n");

                }

                Thread.Sleep(200);

                //關閉端口

                serialPort.Close();

                //分析字元串,得到短信内容中的需要的資料

                string[] tmps = x3.Split('/n');

                string mess = "";

                for (int j = 3; j < tmps.Length -3 ; j++)

                    mess +=(mess==""?"":"/n/r")+tmps[j];

                 //tmps[2]短信資訊

                tmps[2] = tmps[2].Substring(tmps[2].IndexOf(':') + 1).Trim();

                string[] dxxxlist = GetSplitEx(tmps[2], ',', '"');

                if (dxxxlist.Length < 4) return new string[3] { "", "", "" };

                List<string> ls = new List<string>();

                ls.Add(dxxxlist[1]);

                ls.Add(dxxxlist[3]);

                ls.Add(mess);

                return ls.ToArray();

            }

            catch (Exception e1)

                Console.WriteLine(e1.Message);

                return new string[3]{"","",""};

            finally

                //保證操作完成以後關閉端口,避免占用

                if (serialPort.IsOpen)

                    serialPort.Close();

        }

        public static string[] GetSplitEx(string str,char splitchar,char signchar)

            List<string> ls = new List<string>();

            if (str==null||str.Length==0) return new string[1]{""};

            while (true)

                int startwz = 0; //開始找找分隔符位置

                bool splityn = false;//是否找到分隔符

                bool signyn = false; //是否以格式符開始

                int wz = 0;//分隔符位置

                string dxxx = "";//本次内容

                signyn = (str.IndexOf(signchar)==0);//是否以格式符開始

                startwz = (signyn ? (str.IndexOf(signchar, 1) < 0 ? 0 : str.IndexOf(signchar, 1)) : 0);

                splityn = (str.IndexOf(splitchar, startwz) >= 0);

                wz = (splityn?str.IndexOf(splitchar, startwz):str.Length);

                dxxx = str.Substring(0, wz);

                ls.Add(((signyn && dxxx[dxxx.Length - 1] == signchar) ? dxxx.Substring(1, dxxx.Length - 2) : dxxx));

                //Console.WriteLine(ls[ls.Count - 1]);

                if (!splityn) break;

                str = str.Substring(wz + 1);

            return ls.ToArray();

        static void Main(string[] args)

            //

            string[] mess = GsmClass.GetMessage("3", 1, false);

            Console.WriteLine("發 送 者:" + mess[0]);

            Console.WriteLine("發送時間:" + mess[1]);

            Console.WriteLine("短信内容:" + mess[2]);

            Console.ReadLine();

    }

}