您的位置:首页 > 编程语言

代码共享:操作手机Modem收发短信基础类

2006-03-08 10:03 375 查看
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.IO ;
using System.Management;
using System.Runtime .InteropServices ;
using System.Text ;
using Microsoft.Win32;
using MSCommLib;

//**************************************************************************
//** Create By:
//** Create Date:
//** Description: 负责手机短信设备初始化,收发手机短信。
//** Modify List:
//**
//**************************************************************************
namespace MobileMessageManager
{
/// <summary>
/// MobileSMS 的摘要说明。
/// </summary>
public class MobileSMS
{
private MSCommLib.MSCommClass msCom=new MSCommLib.MSCommClass();
private string mstrMessage="";//保存接收到的短信
private string mstrBufferRead="";//保存从缓冲区读出的字符
private int mintComPort=1;
private string mstrCenterNo="";
private int miDelayTime=6;//连续发送的间隔时间
private string mstrSetting="9600,N,8,1";
private bool mblnRegister=true;//是否注册
private string strNowMessage;
/// <summary>
///
/// </summary>
public MobileSMS()
{
}
/// <summary>
/// 延迟发送时间
/// </summary>
public int DelayTime
{
set
{
miDelayTime=value;
}
get
{
return miDelayTime;
}
}

/// <summary>
/// 设备配置
/// </summary>
public string Settings
{
set
{
mstrSetting=value;
}
get
{
return mstrSetting;
}
}

/// <summary>
/// 收到的短信
/// </summary>
public string ReceiveMessage
{
get
{
return mstrMessage;
}
}

/// <summary>
/// 初始化端口
/// </summary>
/// <param name="iComPort">端口号</param>
/// <param name="strCenterNo">短信中心号码</param>
/// <returns>返回整形</returns>
public int InitSms(int iComPort,string strCenterNo)
{
mintComPort=iComPort;
mstrCenterNo=strCenterNo;
if(mstrCenterNo.Substring (0,2)!="86")
{
mstrCenterNo="86"+mstrCenterNo;
}
try
{
WaitMonment(2);
msCom.CommPort =short.Parse ( mintComPort.ToString ());
msCom.Settings = mstrSetting;

msCom.InputMode =MSCommLib.InputModeConstants.comInputModeText ;
msCom.InputLen =0;
msCom.InBufferSize =1024;
msCom.InBufferCount =0;
msCom.OutBufferCount =0;
msCom.RTSEnable =true;
msCom.PortOpen =true ;

msCom.Output ="AT+CMGF=0" + System.Convert .ToChar (13).ToString ()+System.Convert .ToChar (10).ToString ();
bool blnFlag=WaitMonment(5);
if(blnFlag==true)
{
mblnRegister=true;
return 0;
}
else
{
return -2;
}
}
catch(Exception tt)
{
if(tt.Message .IndexOf ("0x800A1F45")>=0)
{
//端口已打开
return 1;
}

if(tt.Message .IndexOf ("0x800A1F42")>=0)
{
//端口错误
return -1;
}
else
{
return -3;
}
}
}

/// <summary>
/// 将中心号码编码
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
private string GetCenterNo(string strValue)
{
string strCenterNo=strValue;
string strTemp="";
if(strValue=="")
{
return "";
}
if(strValue.Substring (0,1)=="+")
{
strCenterNo=strCenterNo.Substring (1,strCenterNo.Length -1);
}
if(System.Math .IEEERemainder(double.Parse (strCenterNo.Length.ToString () ),2)!=0)
{
strCenterNo=strCenterNo+"F";
}
for(int i=0;i<strCenterNo.Length;i=i+2)
{
strTemp=strTemp+strCenterNo.Substring (i+1,1)+strCenterNo.Substring (i,1);
}
strCenterNo="0891"+strTemp;
return strCenterNo;
}

/// <summary>
/// 将电话号码编码
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
private string GetPhoneNo3(string strValue)
{
string strTemp="";
if(strValue=="")
{
return "";
}
int iop=strValue.Trim().Length;
if(strValue.Substring (0,1)=="+")
{
strValue=strValue.Substring (1,strValue.Length -1);
}
//if(System.Math .IEEERemainder(double.Parse (strPhoneNo.Length.ToString () ),2)!=0)
//{
strValue=strValue+"F";
//}
for(int i=0;i<strValue.Length;i=i+2)
{
strTemp=strTemp+strValue.Substring (i+1,1)+strValue.Substring (i,1);
}
return strTemp;
}

/// <summary>
/// 将电话号码编码
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
private string GetPhoneNo(string strValue)
{
string strPhoneNo=strValue;
string strTemp="";
string strTempMsg="";
strTempMsg=strNowMessage ;
strNowMessage =strPhoneNo;
if(strValue=="")
{
return "";
}
if(strNowMessage.Substring (0,1)=="+")
{
strNowMessage=strPhoneNo.Substring (1,strPhoneNo.Length -1);
}

if(System.Math .IEEERemainder(double.Parse (strNowMessage.Length.ToString () ),2)!=0)
{
strNowMessage=strNowMessage+"F";
}

for(int i=0;i<strNowMessage.Length;i=i+2)
{
strTemp=strTemp+strNowMessage.Substring (i+1,1)+strNowMessage.Substring (i,1);
}
strNowMessage=strTemp;
strPhoneNo=strNowMessage ;
strNowMessage =strTempMsg;
return strPhoneNo;
}

/// <summary>
/// 奇偶换位
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
private string ChangePosition(string strValue)
{
string strPhoneNo=strValue;
string strTemp="";
if(strValue=="")
{
return "";
}
for(int i=0;i<strPhoneNo.Length;i=i+2)
{
strTemp=strTemp+strPhoneNo.Substring (i+1,1)+strPhoneNo.Substring (i,1);
}
strPhoneNo=strTemp;
return strPhoneNo;
}

/// <summary>
/// 将短信内容编码
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
private string GetMessage(string strValue)
{
string strTemp="";
Byte[] bt=new Byte [1024];
string strValue1=strValue;
System.Text .Encoding .Unicode .GetBytes (strValue1,0,strValue1.Length ,bt,0);
for(int i=0;i<bt.Length ;i=i+2)
{
if(bt[i]==0 && bt[i+1]==0)
{
i=bt.Length ;
}
else
{
strTemp=strTemp+bt[i+1].ToString ("X2")+bt[i].ToString ("X2");
}
}
int iLen=strValue.Length *2;
return iLen.ToString ("X2")+ strTemp;
}

/// <summary>
/// 将要发送的信息组合
/// </summary>
/// <param name="strPhoneNo"></param>
/// <param name="strMessage"></param>
/// <returns></returns>
private string GetSendMsg(string strPhoneNo,string strMessage)
{
string strCenterNo=mstrCenterNo;
int i=strMessage.Length *2+15;
strNowMessage ="";
strNowMessage=i.ToString ()+System.Convert .ToChar (13).ToString ();

//信息中心号码
strNowMessage=strNowMessage+GetCenterNo(strCenterNo);
//手机号码
strNowMessage=strNowMessage+ "11000D91" +GetPhoneNo(strPhoneNo)+"000800";
//短信内容
string strTemp=GetMessage(strMessage);
strNowMessage=strNowMessage+strTemp;
strNowMessage=strNowMessage+System.Convert .ToChar (26).ToString ()+System.Convert .ToChar (13).ToString ()+System.Convert .ToChar (10).ToString ();
return strNowMessage;
}

/// <summary>
/// 发送短信
/// </summary>
/// <param name="strPhoneNo"></param>
/// <param name="strMessage"></param>
/// <returns></returns>
public int SendMessage(string strPhoneNo,string strMessage)
{
if(mblnRegister==false)
{
return -6;
}
//判断是否是中文
bool blnChs=IsChs(strMessage);
if(blnChs==true)
{
if(strMessage.Length >70)
{
return -5;
}
return SendMessageChs(strPhoneNo,strMessage);
}
else
{
if(strMessage.Length >160)
{
return -5;
}
return SendMessageEn(strPhoneNo,strMessage);
}
}

/// <summary>
/// 返回TRUE是中文,否则纯英文
/// </summary>
/// <param name="strMessage"></param>
/// <returns></returns>
private bool IsChs(string strMessage)
{
byte [] bt=new Byte [1024];
System.Text.Encoding .Unicode .GetBytes (strMessage,0,strMessage.Length ,bt,0);
for(int i=0;i<bt.Length ;i=i+2)
{
if(bt[i+1]!=0)
{
return true;
}
}
return false;
}

/// <summary>
/// 发送纯英文短信息
/// </summary>
/// <param name="strPhoneNo"></param>
/// <param name="strMessage"></param>
/// <returns></returns>
private int SendMessageEn(string strPhoneNo,string strMessage)
{
try
{
string strMsg="";
DateTime dtOld=System.DateTime .Now ;
TimeSpan dtInter;
msCom.Output ="AT"+System.Convert .ToChar (13).ToString ();
//WaitMonment(1);
strMsg="AT+CSCA=" + "+"+ mstrCenterNo +System.Convert .ToChar (13).ToString ()+System.Convert .ToChar (10).ToString ();
msCom.Output =strMsg;
//WaitMonment(1);
msCom.Output ="AT+CMGF=1" + System.Convert .ToChar (13).ToString ();
//WaitMonment(1);
string strTemp=strNowMessage ;
strNowMessage =strPhoneNo;
strPhoneNo=strNowMessage ;
msCom.Output ="AT+CMGS="+ strPhoneNo+System.Convert .ToChar (13).ToString ();
int iLen=strPhoneNo.Length ;
iLen=strPhoneNo.Length ;
msCom.Output= strMessage+System.Convert .ToChar (26).ToString ()+System.Convert .ToChar (13).ToString ()+System.Convert .ToChar (10).ToString ();
bool blnFlag=WaitMonment(1);
//延迟时间
DateTime dtNow=System.DateTime .Now ;
DateTime dtOld1=System.DateTime .Now ;
dtInter=dtNow-dtOld1;
while(dtInter.TotalSeconds <miDelayTime)
{
dtNow=System.DateTime .Now ;
dtInter=dtNow-dtOld1;
}
if(blnFlag==true)
{
return 0;
}
else
{
//发送失败
return -1;
}
}
catch(Exception tt)
{
if(tt.Message .IndexOf ("0x800A1F52")>=0)
{
//端口未初始化
return -2;
}
else
{
return -3;
}
}
}

/// <summary>
/// 发送中文短信息
/// </summary>
/// <param name="strPhoneNo"></param>
/// <param name="strMessage"></param>
/// <returns></returns>
private int SendMessageChs(string strPhoneNo,string strMessage)
{
try
{
string strMsg="";
DateTime dtOld=System.DateTime .Now ;
TimeSpan dtInter;
strMsg=GetSendMsg("86"+strPhoneNo ,strMessage );
msCom.Output ="AT+CMGF=0" + System.Convert .ToChar (13).ToString ()+System.Convert .ToChar (10).ToString () ;
WaitMonment(5);
msCom.Output ="AT+CMGS=" + strMsg;
bool blnFlag=WaitMonment(5);
//延迟时间
DateTime dtNow=System.DateTime .Now ;
DateTime dtOld1=System.DateTime .Now ;
dtInter=dtNow-dtOld1;
while(dtInter.TotalSeconds <miDelayTime)
{
dtNow=System.DateTime .Now ;
dtInter=dtNow-dtOld1;
}
if(blnFlag==true)
{
return 0;
}
else
{
//发送失败
return -1;
}
}
catch(Exception tt)
{
if(tt.Message .IndexOf ("0x800A1F52")>=0)
{
//端口未初始化
return -2;
}
else
{
return -3;
}
}
}

/// <summary>
/// 取得未读信息
/// </summary>
/// <returns></returns>
public int ReceUnReadMsg()
{
if(mblnRegister==false)
{
return -6;
}
string strMsg="";
try
{
//msCom.OutBufferSize =0;
//msCom.Output ="AT+CMGL=0"+System.Convert .ToChar (13).ToString ();
msCom.Output ="AT+CMGL=4"+System.Convert .ToChar (13).ToString ();
bool blnFlag=WaitMonment(5);

if(blnFlag==false)
{
return -1;
}
strMsg=mstrBufferRead;
}
catch(Exception tt)
{
if(tt.Message .IndexOf ("0x800A1F52")>=0)
{
//端口未初始化
return -2;
}
else
{
return -3;
}
}
string[] str=strMsg.Split ('\n');
strMsg="";
string strDelete="";
strNowMessage ="";
try
{
for(int i=0 ;i<str.Length ;i++)
{
if(str[i].Trim () !="")
{
if(str[i].Substring (0,1)!="+" && str[i].Substring (0,1)!="O" && str[i].Substring (0,1)!=" " && str[i].Substring (0,1)!="A")
{
string strTemp=UnMessage(str[i]);

strNowMessage =strNowMessage + strTemp;
}
else
{
if(str[i].Substring (0,1)=="+")
{
int iMo=-1;
iMo=str[i].IndexOf (":");
int iEnd=-1;
iEnd=str[i].IndexOf (",");
string strTemp3=str[i].Substring (iMo+1,iEnd-iMo-1);
strTemp3=strTemp3.Trim ();
strDelete=strDelete+","+strTemp3;
}
}
}
}
mstrMessage=strNowMessage ;
}
catch
{
return -4;
}
//删除已接收信息
if(strDelete!="")
{
strDelete=strDelete.Substring (1,strDelete.Length -1);
string[] strD=strDelete.Split (',');
for(int k=0;k<strD.Length ;k++)
{
try
{
int iDel=Int32.Parse (strD[k]);
msCom.Output ="AT+CMGD=" + iDel.ToString () +System.Convert .ToChar (13).ToString ();
WaitMonment(2);
int i=msCom.InBufferCount ;
while(i>0)
{
string strTemp= (string)msCom.Input ;
//strMsg =strMsg+" "+System.Text .Encoding .ASCII .GetString (bt,0,bt.Length );
strMsg =strMsg+strTemp;
i=msCom.InBufferCount ;
}
}
catch
{
}
}
}

strNowMessage ="";
return 0;
}

/// <summary>
/// 关闭设备端口
/// </summary>
public void CloseSms()
{
try
{
msCom.PortOpen =false;
}
catch(Exception tt)
{
throw(tt);
}

}

/// <summary>
/// 取得第几条信息
/// </summary>
/// <param name="iIndex"></param>
/// <returns></returns>
public int ReceMsgOne(int iIndex)
{
if(mblnRegister==false)
{
return -6;
}
string strMsg="";
string strDelete="";
try
{
//msCom.OutBufferSize =0;
msCom.Output ="AT+CMGR=" +iIndex.ToString ()+System.Convert .ToChar (13).ToString ();
bool blnFlag=WaitMonment(5);
if(blnFlag==false)
{
return -1;
}
strMsg=mstrBufferRead;
}
catch(Exception tt)
{
if(tt.Message .IndexOf ("0x800A1F52")>=0)
{
//端口未初始化
return -2;
}
else
{
return -3;
}
}

string[] str=strMsg.Split ('\n');
strMsg="";
try
{
for(int i=0 ;i<str.Length ;i++)
{
if(str[i].Trim () !="")
{
if(str[i].Substring (0,1)!="+" && str[i].Substring (0,1)!="O" && str[i].Substring (0,1)!=" " && str[i].Substring (0,1)!="A")
{
string strTemp=UnMessage(str[i]);
strNowMessage =strNowMessage +strTemp;
}
else
{
if(str[i].Substring (0,1)=="+")
{
int iMo=-1;
iMo=str[i].IndexOf (":");
int iEnd=-1;
iEnd=str[i].IndexOf (",");
string strTemp3=str[i].Substring (iMo+1,iEnd-iMo-1);
strTemp3=strTemp3.Trim ();
strDelete=strDelete+","+strTemp3;
}
}
}
}
mstrMessage=strNowMessage ;
}
catch
{
return -4;
}
//删除已接收信息
if(strDelete!="")
{
strDelete=strDelete.Substring (1,strDelete.Length -1);
string[] strD=strDelete.Split (',');
for(int k=0;k<strD.Length ;k++)
{
try
{
int iDel=Int32.Parse (strD[k]);
msCom.Output ="AT+CMGD=" + iDel.ToString () +System.Convert .ToChar (13).ToString ();
WaitMonment(2);
int i=msCom.InBufferCount ;
while(i>0)
{
string strTemp= (string)msCom.Input ;
//strMsg =strMsg+" "+System.Text .Encoding .ASCII .GetString (bt,0,bt.Length );
strMsg =strMsg+strTemp;
i=msCom.InBufferCount ;
}
}
catch(Exception tt)
{
throw(tt);
}
}
}
return 1;
}

/// <summary>
/// 将收到的信息解码
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
private string UnMessage(string strValue)
{
string strTemp="";
string strMsg="";

int iStart=0;
int iTemp=0;
if(strValue=="") return"";
//取信息中心号码
iTemp=Int32.Parse (strValue.Substring (iStart,2));
iStart=iStart+2;
strTemp=strValue.Substring (iStart,iTemp*2);
iStart=iStart+iTemp*2+2;
strTemp=ChangePosition(strTemp);
//strMsg=strMsg+" "+strTemp;
//对方号码
strTemp=strValue.Substring (iStart,2);
iTemp=Int32.Parse (strTemp,System.Globalization .NumberStyles .HexNumber );
iStart=iStart+4;
double dblMod=System.Math .IEEERemainder(double.Parse (iTemp.ToString () ),2);
if(dblMod!=0)
{
iTemp=iTemp+1;
}
strTemp=strValue.Substring (iStart,iTemp);
iStart=iStart+iTemp+2;
strTemp=ChangePosition(strTemp);
strTemp=strTemp.Substring (2,strTemp.Length -2);
if(strTemp.Substring (strTemp.Length -1,1)=="F")
{
strTemp=strTemp.Substring (0,strTemp.Length -1);
}
strMsg="A"+strTemp.Length.ToString("000")+strTemp;
string strTDC=strValue.Substring (iStart,2);
iStart=iStart+2;
//发送时间
strTemp=strValue.Substring (iStart,12);
iStart=iStart+14;
strTemp=ChangePosition(strTemp);
strTemp="20"+strTemp.Substring (0,2)+ "-"+strTemp.Substring (2,2)+"-"+strTemp.Substring (4,2)+ " "+
strTemp.Substring (6,2)+":"+strTemp.Substring (8,2)+":"+strTemp.Substring (10,2);
strMsg=strMsg+"B"+strTemp.Length.ToString("000")+strTemp;
//接收内容
strTemp=strValue.Substring (iStart,2);
iTemp=Int32.Parse( strTemp,System.Globalization.NumberStyles.HexNumber);
iStart=iStart+2;
iTemp=iTemp*2;
if(iStart+iTemp>strValue.Length )
{
iTemp=strValue.Length-iStart;
int iii=(int)System.Math .IEEERemainder (iTemp,2);
if(iii!=0)
{
iTemp=iTemp-1;
}
}
strTemp=strValue.Substring (iStart,iTemp );
//信息编码方式00为文本,08为中文
if(strTDC=="08")
{
byte[] bt=new Byte [strTemp.Length/2];
for(int i=0;i<strTemp.Length ;i=i+2)
{
iTemp=Int32.Parse (strTemp.Substring (i,2),System.Globalization .NumberStyles .HexNumber );
bt[i/2]=Byte.Parse (iTemp.ToString ());
}
for(int k=0;k<strTemp.Length /2;k=k+2)
{
byte bTemp=new byte();
bTemp=bt[k];
bt[k]=bt[k+1];
bt[k+1]=bTemp;
}
strTemp=System.Text .Encoding .GetEncoding (1200).GetString (bt,0,bt.Length );
}
if(strTDC=="00")
{
strTemp=HexToAscii(strTemp);
}
strMsg=strMsg+"C"+strTemp.Length.ToString("000")+strTemp;
return strMsg;
}

/// <summary>
/// 将收到的编码方式为文本的信息解码
/// </summary>
/// <param name="strValue"></param>
/// <returns></returns>
private string HexToAscii(string strValue)
{
int [] iArr=new int [strValue.Length /2];
string [] strArr=new string [strValue.Length /2];
//转换成二进制
for(int i=0;i<strValue.Length ;i=i+2)
{
string strTemp1=strValue.Substring (i,2);
iArr[i/2]=Int32.Parse (strTemp1,System.Globalization .NumberStyles .HexNumber );
}
for(int k=0;k<iArr.Length ;k++)
{
strArr[k]=System.Convert.ToString (iArr[k],2).PadLeft (8,'0');
}
//==============================================
//移位规则:以七个八位为单位,分离成八个七位;第一个八位的头一位移到第二八位的末尾,第二个八位的头二位移到第三八位的末尾,依此类推
int iLen=0;
if(System.Math.IEEERemainder (strArr.Length ,7)==0)
{
iLen=strArr.Length /7;
}
else
{
iLen=strArr.Length /7+1;
}
string strDest="";

for(int j=0;j<iLen;j++)
{
for(int jj=0;jj<7;jj++)
{
if(j*7+jj<strArr.Length-1)
{
strDest=strDest+strArr[j*7+jj].Substring (jj+1,7);
if(jj<6)
{
strArr[j*7+jj+1]=strArr[j*7+jj+1]+strArr[j*7+jj].Substring (0,jj+1);
}
else
{
strDest=strDest+strArr[j*7+jj].Substring (0,jj+1);
}
}
else
{
if(j*7+jj==strArr.Length -1)
{
strDest=strDest+strArr[j*7+jj].Substring (jj+1,7);
strDest=strDest+strArr[j*7+jj].Substring (0,jj+1);
}
}
}
}
//===========================================================
//二进制转成十进制
if(System.Math.IEEERemainder (strDest.Length ,7)==0)
{
iLen=strDest.Length /7;
}
else
{
iLen=strDest.Length /7+1;
}

byte[] bt=new byte [iLen];
string strBin="";
for(int m=0;m<iLen;m++)
{
if(m<iLen-1)
{
strBin=strDest.Substring (m*7,7);
}
else
{
strBin=strDest.Substring (m*7,strDest.Length-m*7);
}
strBin=System.Convert.ToInt32(strBin,2).ToString();
bt[m]=Byte.Parse (strBin);
}
//转换成ANSI字符
//计算要转换的长度
int iLenMsg=0;
for(int n=0;n<bt.Length;n++)
{
if(bt
!=0)
{
iLenMsg++;
}
else
{
n=bt.Length;
}
}
return System.Text.Encoding .ASCII .GetString (bt,0,iLenMsg ) ;
}

/// <summary>
/// 延迟时间
/// </summary>
/// <param name="iSecond"></param>
/// <returns></returns>
private bool WaitMonment(int iSecond)
{
DateTime dtOld=System.DateTime .Now ;
DateTime dtNow=System.DateTime .Now ;
TimeSpan dtInter;
dtInter=dtNow-dtOld;
mstrBufferRead="";
string strTemp="";
int i=msCom.InBufferCount ;
if (i>0)
{
strTemp=(string)msCom.Input ;
if(strTemp.ToLower ().IndexOf ("ok")<0)
{
i=0;
}
else
{
mstrBufferRead=strTemp;
return true;
}
}
while(dtInter.TotalSeconds <iSecond && i<=0 )
{
dtNow=System.DateTime .Now ;
dtInter=dtNow-dtOld;
i=msCom.InBufferCount ;
if (i>0)
{
strTemp=strTemp+(string)msCom.Input ;
if(strTemp.ToLower ().IndexOf ("ok")<0)
{
i=0;
}
else
{
mstrBufferRead=strTemp;
return true;
}
}
}
mstrBufferRead=strTemp;
return false;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: