⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 usb-com for sms 自己开发的类 可以借鉴下
💻 CS
📖 第 1 页 / 共 3 页
字号:
					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 + -