WAVECOM 发送短信C#实现

本文介绍了一种使用 C# 和 MSCOMM 控件实现短信发送的方法,详细展示了如何将手机号和短信内容转换为 PDU 格式,并通过 WAVECOM 短信猫设备完成短信的发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目有一个功能要求发送短信,因为后台是ASP.NET的,所以就用C#写了一下,嘿嘿..项目要求只能发,不要收的,所以以下代码也只有发的啦,不好意思啊,用的是MSCOMM的控件,短信猫是WAVECOM的,大家参考一下:

  private string ConverPDU(string str) //手机号转PDU
  {
   int tl,ti;
   string ltem,rtem,ttem;
   ttem = "";
   tl = str.Length;
   if ((tl != 11) & (tl != 13))
     return "";
   if (tl == 11)
   {
    tl = tl + 2;
    str = "86" + str;
   }
   ti = 0;
   while (ti < tl)
   {
    ltem = str.Substring(ti,1);
    if ((ti+1) == tl)
     rtem ="F";
    else rtem = str.Substring(ti+1,1);
    ttem = ttem+rtem+ltem;
    ti=ti+2;
   }
      
    return ttem;
   }

  private string ConverUniCode(string str) //短信内容转PDU
  {
   Encoding encodingUTF = System.Text.Encoding.BigEndianUnicode;
   string s = null;
   byte [] encodedBytes = encodingUTF.GetBytes(str);
   for (int i =0;i < encodedBytes.Length;i++)
   {
    s += BitConverter.ToString(encodedBytes,i,1);
   }
   return s;
  }

  private bool Send(int Port,string Speed,string mobile,string msg) //发送短信
  {
   MSComm SMSComm = new MSCommLib.MSCommClass(); //微软的MSCOMM控件声明
   string prex;
   string pdu,pnum,pmsg,leng;
  
   string strIn = "";
   byte[] bytin;
   object objin;

   string outstr;
  

   int len;
   prex = "0011000DA1";
   pnum =  ConverPDU(mobile);
   pmsg =  ConverUniCode(msg);
   len = pmsg.Length;
   len =  len/2;
   leng = len.ToString("X");
   if (len < 16)
   {
    leng = "0"+ leng;
   }
   pdu = prex +pnum+"0008A7"+leng + pmsg;
  
   len = (pdu.Length/2)-1;
   try
   {
    SMSComm.CommPort = Convert.ToInt16(Port);
    if (SMSComm.PortOpen == true)
     SMSComm.PortOpen = false;

    SMSComm.Settings = Speed;
    SMSComm.Handshaking = MSCommLib.HandshakeConstants.comNone;
    SMSComm.InputLen = 0;
    SMSComm.InputMode = MSCommLib.InputModeConstants.comInputModeBinary;

    
    SMSComm.PortOpen = true;
    SMSComm.Output = "AT"+"/r/n";
    System.Threading.Thread.Sleep(1000);
    objin = SMSComm.Input;
    bytin = (byte[])objin;
    strIn= Encoding.ASCII.GetString(bytin);

    SMSComm.Output = "AT"+"/r/n";
    System.Threading.Thread.Sleep(1000);
    objin = SMSComm.Input;
    bytin = (byte[])objin;
    strIn= Encoding.ASCII.GetString(bytin);

    SMSComm.Output = "AT+CMGF=0"+"/r/n";
    System.Threading.Thread.Sleep(1000);
    objin = SMSComm.Input;
    bytin = (byte[])objin;
    strIn= Encoding.ASCII.GetString(bytin);

    SMSComm.Output = "AT+CNMI=2,1,0,1"+"/r/n";
    System.Threading.Thread.Sleep(1000);
    objin = SMSComm.Input;
    bytin = (byte[])objin;
    strIn= Encoding.ASCII.GetString(bytin);

    outstr = string.Format("AT+CMGS={0}/r",len);
    SMSComm.Output = outstr;
    System.Threading.Thread.Sleep(1000);
    objin = SMSComm.Input;
    bytin = (byte[])objin;
    strIn= Encoding.ASCII.GetString(bytin);
    SMSComm.InBufferCount = 0;
    SMSComm.OutBufferCount= 0;


    if(( strIn.Length > 0) && strIn.EndsWith("> "))
    {
     outstr = pdu.Trim()+"/x01a";
     SMSComm.Output = outstr.Trim();
     System.Threading.Thread.Sleep(5000);
     objin = SMSComm.Input;
     bytin = (byte[])objin;
     strIn= Encoding.ASCII.GetString(bytin);
     SMSComm.PortOpen = false;
     return true;
    }
    SMSComm.PortOpen = false;
    return false;
   }
   catch
   {
    SMSComm.PortOpen = false;
    return false;
   }
  }

 

 

本程序参考网上某个例程编写而成,已完成发送短信功能。GSM模块为wavecom moden。先点击获取SIM卡信息按钮获取短信中心号码,然后输入手机号,短信内容发送短信。希望对同样初次接触GSM模块的兄弟们有帮助。 以下是本程序开发纪录(包括程序都写得比较不规范,请见谅!) 7.14----------------------------------------------- 开始着手GSM模块的学习和编程。弄了一天的时间,以为是win7下的超级终端有错误,后来才发现是我把波特率弄错了,这个wave moden的默认波特率是115200,而我却设成了一般情况下的9600。这是一个很大的教训,欲速则不达。 7.15----------------------------------------------- 自己用C#编了个简单的GSM与上位机连通判断的模块,目标是从串口发送“AT”给GSM模块,GSM模块能够返回与超级终端上返回得到的信息一致(即AT\n OK)。不过没有完成预期的目标,查阅了一些资料发现有可能出现的错误是发送的AT指令编码没编好。 7.16----------------------------------------------- 实现了GSM模块与上位机的连通。比如,从C#界面发送“AT”,能够从串口读取到GSM模块返回的“AT\n OK”信息,其他AT指令亦能实现。 发现了一个小BUG,如果GSM模块上电后即在VS2008上调试,则程序能够顺利运行;但如果上电后在超级终端调试过后,再在VS2008上调试,则不能从C#的小程序上获取GSM模块返回的信息。 实现了GSM模块发送短信的功能。可以发送中文\英文短信。在此过程中出现了一个低级失误,没把生成的短信中心号码“+8613000……”前的“+”去掉,导致生成的PDU编码有误,发送失败。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值