📄 form1.cs
字号:
Invoke (new MethodInvoker(SetConnected));
}
else
{
Invoke (new MethodInvoker(SetDisConnected));
}
}
}
private void SMSRun()
{
//设置收发的界面
SetRun();
//创建一个发的线程
Thread tSend = new Thread(new ThreadStart(DoSend));
tSend.IsBackground = true;
tSend.Start();
//创建一个收的线程
Thread tRecv = new Thread(new ThreadStart(DoRecv));
tRecv.IsBackground = true;
tRecv.Start();
}
private void DoRecv()
{
if ( !GetRetryCount())
return;
try
{
while( !Stopped)
{
Hashtable smsHash = ListSMSFromDevice();
if ( smsHash==null || smsHash.Count==0)
{
Thread.Sleep(readInterval);
continue;
}
else
{
foreach(SMSRecvInfo item in smsHash.Values)
{
WriteSMSToDb(item);
}
}
}
}
catch
{
Stopped = true;
}
}
private void DoSend()
{
if ( !GetRetryCount())
return;
try
{
while( !Stopped)
{
SortedList sl = GetSendSMSList();
if ( sl == null || sl.Count ==0 )
{
//取一次数据库,看看没有要发送的dd
Thread.Sleep(sendInterval);
continue;
}
foreach(SMSInfo item in sl.Values)
{
if ( CheckCellNumber(item.CellNumber))
{
if ( SendSMS(item) )
{
item.Status = (int)SMSStatus.SendOK;
}
else
{
item.RetryCount++;
item.Priority--;
if ( item.Priority <= -3)
item.Status = (int)SMSStatus.Abandon;
}
}
else
{
item.Status = (int)SMSStatus.Abandon;
}
SetSMSdbStatus(item);
}
}
}
catch
{
Stopped = true;
}
}
private Hashtable ListSMSFromDevice()
{
try
{
Monitor.Enter(comLock);
string readBuffer="";
bool isSucc = false;
byte[] buf =Encoding.ASCII.GetBytes("AT+CMGL=0\r"); //AT+CMGL=0未读的短消息,读过以后就变成已读,所以测试的时候直接用=1,已读的部分
ss_port.Write(buf);
newLine = GetNewLine();
ShowRecvLog(newLine + "开始读消息");
ShowRecvBuffer(newLine);
readBuffer = "";
for ( int i=0; i< retryCount; i++)
{
Thread.Sleep(retryTimeOut);
readBuffer += Encoding.ASCII.GetString(ss_port.Read(128));
if( readBuffer.IndexOf("OK")!=-1)
{
isSucc = true;
break;
}
else if ( readBuffer.IndexOf("ERROR")!=-1)
{
break;
}
else
{
ShowRecvLog(". ");
}
}
if ( isSucc )
{
ShowRecvLog("OK");
}
else
{
ShowRecvLog("Error");
}
ShowRecvBuffer(readBuffer);
if ( !isSucc )
return null;
Regex readReg= new Regex("(?:CMGL: (?<index>\\d+),\\d+,,\\d+\r\n(?<sms>\\S+)\r\n)");
MatchCollection mc = readReg.Matches(readBuffer);
Match match = readReg.Match(readBuffer);
Hashtable ht = new Hashtable(10);
foreach (Match m in mc)
{
try
{
SMSRecvInfo recvInfo =Popcorn.DecodingMsg(m.Groups["sms"].Value.ToString());
recvInfo.index = m.Groups["index"].Value.ToString();
ht.Add(recvInfo.index, recvInfo);
}
catch
{
}
}
ShowRecvLog(">收到 " + ht.Count + " 条消息");
if ( ht.Count == 0)
{
return null;
}
foreach(string index in ht.Keys)
{
buf =Encoding.ASCII.GetBytes("AT+CMGD=" + index + "\r");
ss_port.Write(buf);
newLine = GetNewLine();
ShowRecvLog(newLine + "开始删除消息");
ShowRecvBuffer(newLine);
readBuffer = "";
for ( int i=0; i< retryCount; i++)
{
Thread.Sleep(retryTimeOut);
readBuffer += Encoding.ASCII.GetString(ss_port.Read(128));
if( readBuffer.IndexOf("OK")!=-1)
{
isSucc = true;
break;
}
else if ( readBuffer.IndexOf("ERROR")!=-1)
{
break;
}
else
{
ShowRecvLog(". ");
}
}
if ( isSucc )
{
ShowRecvLog("OK");
}
else
{
ShowRecvLog("Error");
}
ShowRecvBuffer(readBuffer);
}
return ht;
}
catch
{
return null;
}
finally
{
Monitor.Exit(comLock);
}
}
private bool SendSMS(SMSInfo oInfo)
{
try
{
Monitor.Enter(comLock);
string readBuffer="";
bool isSucc = false;
//string decodedSMS = sms.smsDecodedsms(CenterNumber.Text,targetNumber.Text,smsContent.Text);
string decodedSMS = sms.smsDecodedsms(lblCenterNo.Text, oInfo.CellNumber, oInfo.SMSContent);
byte[] buf =Encoding.ASCII.GetBytes(String.Format("AT+CMGS={0}\r",sms.nLength));
ss_port.Write(buf);
newLine = GetNewLine();
ShowSendLog(newLine + "准备发送");
ShowSendBuffer(newLine);
readBuffer = "";
for ( int i=0; i< retryCount; i++)
{
Thread.Sleep(retryTimeOut);
readBuffer += Encoding.ASCII.GetString(ss_port.Read(128));
if( readBuffer.Length > 0 && readBuffer.EndsWith("> "))
{
isSucc = true;
break;
}
else
{
ShowSendLog(". ");
}
}
ShowSendBuffer(readBuffer);
if ( isSucc )
{
ShowSendLog("OK");
}
else
{
ShowSendLog("Error");
}
if ( !isSucc )
return false;
isSucc = false;
byte[] sendbyte = Encoding.ASCII.GetBytes(String.Format("{0}\x01a",decodedSMS));
ss_port.Write(sendbyte);
newLine = GetNewLine();
ShowSendLog(newLine + "发送到" + oInfo.CellNumber + " <" + oInfo.SMSContent + " >");
ShowSendBuffer(newLine);
readBuffer = "";
for ( int i=0; i< retryCount; i++)
{
Thread.Sleep(retryTimeOut);
readBuffer += Encoding.ASCII.GetString(ss_port.Read(128));
if( readBuffer.IndexOf("CMGS:")!=-1 && readBuffer.IndexOf("OK")!= -1)
{
isSucc = true;
break;
}
else if( readBuffer.IndexOf("ERROR")!=-1)
{
isSucc = false;
break;
}
else
{
ShowSendLog(". ");
}
}
ShowSendBuffer(readBuffer);
if ( isSucc )
{
ShowSendLog("OK");
}
else
{
ShowSendLog("Error");
}
return true;
}
catch
{
return false;
}
finally
{
Monitor.Exit(comLock);
}
}
#endregion
#region 状态变化对按钮控件的控制
private void SetConnected()
{
btnConnect.Enabled = false;
btnDisConnect.Enabled = true;
btnStart.Enabled = true;
}
private void SetDisConnected()
{
btnConnect.Enabled = true;
btnDisConnect.Enabled = false;
btnStart.Enabled = false;
lblCenterNo.Text = "";
ConnectState.Text = "";
}
private void SetRun()
{
btnDisConnect.Enabled = false;
btnStart.Enabled = false;
btnStop.Enabled = true;
Stopped = false;
}
private void SetStop()
{
btnStart.Enabled = true;
btnStop.Enabled = false;
btnDisConnect.Enabled = true;
Stopped = true;
}
#endregion
private void btnConnect_Click(object sender, System.EventArgs e)
{
StartConnect();
}
private void Form1_Closed(object sender, System.EventArgs e)
{
if (ss_port.Opened)
{
ss_port.Close();
}
}
private void btnStop_Click(object sender, System.EventArgs e)
{
SetStop();
}
private void btnDisConnect_Click(object sender, System.EventArgs e)
{
SetDisConnected();
newLine = GetNewLine();
ShowSendLog(newLine +"断开连接");
try
{
ss_port.Close();
ShowSendLog("OK");
}
catch
{
ShowSendLog("Error");
}
}
private void btnStart_Click(object sender, System.EventArgs e)
{
SMSRun();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -