serialPort对GSMMODEM的应用 (转载)
思路:首先在global.asax文件中初始化一个serialPort对象,初始化后用来监听串口。然后把这个serialPort对象传递到
page页面中利用同一个串口号来发送短信。
global.asax文件:
<%@ Application Language="C#" %>
<%@ Import Namespace="System" %>
<script runat="server">
public static System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort();
public StringBuilder builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。
string strTemp = "";
private long received_count = 0;//接收计数
private long portCount = 0;//发送计数
ComPort cp;//存放可以使用的端口
void Application_Start(object sender, EventArgs e)
{
//Context.Response.Write("<script language='javascript'>alert(/"短信猫异常/");<script>");
// 在应用程序启动时运行的代码
ComInitial();
Application["serialPort"] = sp;
}
private void ComInitial()
{
sp.BaudRate = 9600;
//初始化下拉串口名称列表框
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
Array.Sort(ports);
//初始化SerialPort对象
sp.NewLine = "/r/n";
sp.RtsEnable = true;//根据实际情况吧。
sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(SP_DataReceived);//每次接收到数据就触发comm_DataReceived,类似于委托连
cp=new ComPort();
for (int i = 1; i < ports.Length; i++)
{
sp.PortName=ports[i];
bool bl = Open();
if (Open())
{
cp.comPort.Add(ports[i]);
}
}
//如果串口没有短信猫
Application["portSum"] = cp.comPort.Count;
//打开串口
}
private bool Open()
{
try
{
if (!sp.IsOpen)
{
sp.Open();
SendCommand("at+cmgf=1");//初始化为text接收模式
}
return true;
}
catch (Exception ex)
{
//捕获到异常信息,创建一个新的comm对象,之前的不能用了。
sp = new System.IO.Ports.SerialPort();
return false;
}
}
private void SP_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{ //BytesToRead接收缓冲区中数据的字节数
System.Threading.Thread.Sleep(500);
int n = sp.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
builder.Remove(0, builder.Length);//清除字符串构造器的内容
comTag = false; //这个只是在初始化串口时有用
do //读取数据完全为止
{
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
received_count += n;//增加接收计数
sp.Read(buf, 0, n);//读取缓冲数据
builder.Append(Encoding.ASCII.GetString(buf));
n = sp.BytesToRead;
} while (n > 0);
//考虑三种可能 1、短信提示 2、text或pdu模式的返回值 3、读短信的内容
string AAA = builder.ToString();
int tt = (builder.ToString().Trim().IndexOf("+CMGR"));
if (builder.ToString().Trim().IndexOf("+CMTI:") == 0) //1、开始收到短信来到提示
{
//得到短信的序列号
strTemp = builder.ToString().Trim(); ;//换行+CMTI: "SM",1
int strStart = strTemp.IndexOf(",") + 1;
int strEnd = strTemp.Length;
strTemp = strTemp.Substring(strStart, strEnd - strStart);
//每次读取都要进行初始化text模式,以防发送模块改变为pdu模式
SendCommand("at+cmgf=1");//初始化为text接收模式
SendCommand("at+cmgr=" + int.Parse(strTemp));
}
//at+cmgf=1的返回信息会和读取的信息连一块,r/nOK/r/n/r/n+CMGR: /"REC UNREAD/....."ok+回撤换行为6
else if ((builder.ToString().Trim().IndexOf("+CMGR") == 6))//这是收到at+cmgr=1的回复
{
MsgDecode(builder.ToString());
SendCommand("at+cmgd=1,2");
}
else if ((builder.ToString().Trim().IndexOf("OK") == 0)) //初始化串口时判断是否是modem
{
comTag = true;
builder.Remove(0, builder.Length);//清除字符串构造器的内容
}
else //3、其他情况返回的是ok,error,或者">"符号等
{
builder.Remove(0, builder.Length);//清除字符串构造器的内容
}
}
public void SendCommand(string commandString)
{
string callText = commandString;
if (!callText.EndsWith("/x001a") && !(callText.EndsWith("/r") | callText.EndsWith("/r/n")))
{
callText = callText + "/r";
}
byte[] callCommand = Encoding.UTF8.GetBytes(callText);
sp.Write(callCommand, 0, callCommand.Length);
}
</script>
home.apsx页面:
using System;
using System.IO.Ports;
using System.Threading;
public partial class Home : System.Web.UI.Page
{
SerialPort spSend = new SerialPort();
protected void Page_Load(object sender, EventArgs e)
{
((iMaster)Page.Master).SetMenuStyle(1, 1);
}
protected void Button1_Click(object sender, EventArgs e)//发送
{
int tep = Convert.ToInt32(Application["portSum"]);
if (tep == 0)//串口没有硬件(短信猫)
{
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "onekey", "alert('短信猫连接异常')", true);
}
object tmp = Application["serialPort"];
spSend = (SerialPort)tmp;
PduModel("13811992610", "这就是测试");
}
public void PduModel(string mobileNumbers, string mobileMessage)
{
//GSM MODEL API的发送接口
//InitialModem();
PDUdecoding pduDec = new PDUdecoding();
string strSendMsg = pduDec.smsDecodedsms("13800791500", mobileNumbers, mobileMessage);
try
{
spSend.Write("AT+CMGF=0/r");//PDU mode to send a Short Message
Thread.Sleep(500);
spSend.Write("AT+CMGS=" + pduDec.nLength + "/r");
Thread.Sleep(1500);
// byte[] end = { 0x1a };//{ 0x1a x01a };
//0x1a就是Ctrl + Z
//byte[] end = Encoding.ASCII.GetBytes(string.Format("{0}/x01A", strSendMsg));
spSend.Write(strSendMsg + ((char)26).ToString() + "/r");
}
catch (Exception)
{
}
}
}
浙公网安备 33010602011771号