查看: 13184|回复: 0
打印 上一主题 下一主题

完善C#实现的短信收发设备类库API

[复制链接]
跳转到指定楼层
楼主
发表于 2014-3-13 18:21:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前几篇文章写到完成了一个简单的类库,虽然可以完成可以完成短信收发设备短信的发送与接收,但是类库还不是很完善,现在奉上较为完善的版本。

完善后类库说明如下:
  • 属性
    序号
    属性名称
    数据类型
    说明
    1
    CommPort
    bool
    串口号(运行时只读)
    2
    BaudRate
    int
    设备与计算机的串口波特率
    设计时和运行时都可以读写
    3
    IsOpen
    bool
    设备是否已经打开(只读)
    True 已打开 False 未打开
    4
    AutoDelMsg
    bool
    设置是否在阅读短信后自动删除SIM卡内短信存档(建议在经常接收短信时设置为 true)
    设计和运行时都可以读写,true 自动删除 false 不自动删除
    默认为 false
  • 方法
    • 打开设备(Open)


      功能描述: 打开与设备的通讯端口,设备初始化

      参数: 无

      返回: 无 (打开失败将抛出异常)
    • 关闭设备(Close)

      功能描述: 关闭与设备的通讯端口,设备关闭

      参数: 无

      返回: 无(关闭失败将抛出异常)
    • 取得机器码(GetMachineNo)

      功能描述: 取得机器码

      参数: 无

      返回: string 机器码字符串(设备厂商)
    • 发送AT指令(SendAT)

      功能描述: 向端口发送 AT 指令

      参数: ATCmd string 您要发送的 AT 指令

      返回: string AT指令返回结果 (如为错误,引发异常)
    • 设置短信中心号码(SetMsgCenterNo)

      功能描述: 设置短信中心号码

      参数: sNewValue string 短信中心号码

      返回: 无 (失败将抛出异常)
    • 取得短信中心号码(GetMsgCenterNo)

      功能描述: 取得短信中心号码

      参数: 无

      返回: string 短信中心号码
    • 发送短消息(SendMsg)

      功能描述: 发送一条短信息

      参数: phone string 对方的手机号码

      msg string 短消息内容

      msgCenterNo string 短信中心号码(可选)

      msgType 枚举MgType 短信类型{AUSC2:USC2编码,A7Bit:7位编码} 可选(不选时USC2编码)

      返回: 无 (发送失败将抛出异常)
    • 取得未读信息列表(GetUnreadMsg)

      功能描述: 取得未读信息

      参数: 无

      返回: string[] 逗号分隔的未读信息列表字符串(中心号码,手机号码,发送时间,短信内容) (失败将抛出异常)
    • 读取设备新收到的短消息(ReadNewMsg)

      功能描述: 读取设备新收到的短消息

      参数: 无

      返回: string 信息字符串,同信息列表中格式(失败将抛出异常)
    • 读取短消息(ReadMsgByIndex)

      功能描述: 读取 SIM 卡中指定位置的短消息

      参数: index int 短信序号

      返回: string 信息字符串
    • 删除短消息(DelMsgByIndex)

      功能描述: 删除 SIM 卡中指定位置的短信

      参数: index int 要删除 SIM 卡中短信的位置

      返回: 无 (失败将抛出异常)
  • 事件

    1、 OnReceive 当短信到达时触发这个事件,请在此事件中调用ReadNewMsg方法


程序说明:
加入了7bit的编码,发送英文短信每条可以发送160个字符(原来程序中是按USC2编码发送的英文短信,最多只能发送70个字符)
有关编码的详细信息参考:短信收发设备诶软件的实现(C#)PDU格式短信解析

7bit的编码详细方案参考:短信收发设备软件的实现(C#)7bitPDU的编码

7bit编码发送短信函数:
  1.   public void SendMsg(string phone, string msg, MsgType msgType)
  2.    {
  3.        if (msgType == MsgType.AUSC2)
  4.        {
  5.            SendMsg(phone, msg);
  6.        }
  7.        else
  8.        {
  9.    
  10.           PDUEncoding pe = new PDUEncoding();
  11.           pe.ServiceCenterAddress = msgCenter;                    //短信中心号码 服务中心地址
  12.   
  13.           string temp = pe.PDU7BitEncoder(phone, msg);
  14.    
  15.           int len = (temp.Length - Convert.ToInt32(temp.Substring(0, 2), 16) * 2 - 2) / 2;  //计算长度
  16.           try
  17.           {
  18.               temp = SendAT("AT+CMGS=" + len.ToString() + "\r" + temp + (char)(26));  //26 Ctrl+Z ascii码
  19.           }
  20.           catch (Exception)
  21.           {
  22.               throw new Exception("短信发送失败");
  23.           }
  24.    
  25.           if (temp.Substring(temp.Length - 4, 3).Trim() == "OK")
  26.           {
  27.               return;
  28.           }
  29.    
  30.           throw new Exception("短信发送失败");
  31.       }
  32.   }
复制代码
和原来发送函数类似:仅仅改动的地方是调用的PDUEncoding的7bit编码。
另外,类还改动了GSMModem的字段,属性,方法;增加了有关API,便于短信收发设备软件的实现。


字段:添加了newMsgIndex和msgCenter,newMsgIndex用于保存一条刚收到的新信息的序号,msgCenter保存设置的短信中心号,发送短信使用
  1. private int newMsgIndex;            //新消息序号
  2.   
  3.   private string msgCenter = string.Empty;           //短信中心号码
复制代码


属性:添加AutoDelMsg属性,代表是否需要在读取信息后自动删除SIM卡中存档。

  1.   private bool autoDelMsg = false;
  2.    
  3.    /// <summary>
  4.    /// 对autoDelMsg访问
  5.    /// 设置是否在阅读短信后自动删除 SIM 卡内短信存档
  6.    /// 默认为 false
  7.   /// </summary>
  8.    public bool AutoDelMsg
  9.   {
  10.       get
  11.       {
  12.           return autoDelMsg;
  13.       }
  14.       set
  15.       {
  16.           autoDelMsg = value;
  17.       }
  18.   }
复制代码
AutoDelMsg为true时,将在读取短信的方法中调用DelMsgByIdex删除对应SIM卡中内容。

方法:添加 取得机器码(GetMachineNo)、设置短信中心号码(SetMsgCenterNo)、取得短信中心号码(GetMsgCenterNo)、取得未读信息列表(GetUnreadMsg)、读取设备新收到的短消息(ReadNewMsg)

取得机器码(GetMachineNo):
  1. public string GetMachineNo()
  2.    {
  3.        string result = SendAT("AT+CGMI");
  4.        if (result.Substring(result.Length - 4, 3).Trim() == "OK")
  5.        {
  6.            result = result.Substring(0, result.Length - 5).Trim();
  7.        }
  8.       else
  9.        {
  10.           throw new Exception("获取机器码失败");
  11.       }
  12.       return result;
  13.   }
复制代码


通过AT指令获取设备厂商名,若需要可以再添加其他内容。

设置短信中心号码(SetMsgCenterNo):

  1.   public void SetMsgCenterNo(string msgCenterNo)
  2.   {
  3.      msgCenter = msgCenterNo;
  4.   }
复制代码


仅设置msgCenter字段,发送短信时:编码部分代码改为

  1. PDUEncoding pe = new PDUEncoding();
  2.   pe.ServiceCenterAddress = msgCenter;                    //短信中心号码 服务中心地址
  3.   
  4.   string temp = pe.PDUUSC2Encoder(phone, msg);
复制代码


取得短信中心号码(GetMsgCenterNo):

  1. public string GetMsgCenterNo()
  2.    {
  3.        string tmp = string.Empty;
  4.        if (msgCenter != null && msgCenter.Length != 0)
  5.        {
  6.            return msgCenter;
  7.        }
  8.        else
  9.        {
  10.           tmp = SendAT("AT+CSCA?");
  11.           if (tmp.Substring(tmp.Length-4,3).Trim() == "OK")
  12.           {
  13.               return tmp.Split(‘\"‘)[1].Trim();
  14.           }
  15.           else
  16.           {
  17.              throw new Exception("获取短信中心失败");
  18.           }
  19.       }
  20.   }
复制代码
若字段msgCenter有值则直接返回,无则从SIM卡存档中读取。

取得未读信息列表(GetUnreadMsg):
  1.   public string[] GetUnreadMsg()
  2.    {
  3.        string[] result = new string[255];      //可存储255条 SIM卡不能存这么多
  4.        string[] temp = null;
  5.        string tmp = string.Empty;
  6.    
  7.        tmp = SendAT("AT+CMGL=0");                 //发送AT指令 读取未读信息
  8.        if (tmp.Substring(tmp.Length - 4, 3).Trim() == "OK")     //读取成功
  9.        {
  10.           temp = tmp.Split(‘\r‘);
  11.       }
  12.    
  13.       PDUEncoding pe=new PDUEncoding();          //解码类
  14.       int i = 0;                                    //计数
  15.       foreach (string str in temp)
  16.       {         //此条为PDU串
  17.           if (str != null && str.Length != 0 && str.Substring(0, 2).Trim() != "+C" && str.Substring(0, 2) != "OK")
  18.           {
  19.               result[i] = pe.PDUDecoder(str);             //解码
  20.               i++;
  21.           }
  22.       }
  23.    
  24.       return result;               // 返回 空则无新信息
  25.   }
复制代码
列出所有未读信息,返回string[]类型,无新信息则返回空。


读取设备新收到的短消息(ReadNewMsg):
  1.   public string ReadNewMsg()
  2.   {
  3.       return ReadMsgByIndex(newMsgIndex);
  4.   }
复制代码
新信息序号存在序号为newMsgIndex字段中,调用ReadMsgByIndex即可读取。

其他改动:有些方法的名称有少许改动,ReadMsgByIndex方法返回值类型和参数列表有些改变,算法没有变化,在此不做详细说明;详见附件项目文件

到此,上面所写的就是比较完善的API类库,需要项目文件可以下载: GSMMODEM(完善).rar (140.99 KB, 下载次数: 5558)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|未来时代科技 ( 粤ICP备12044031号-1

GMT+8, 2024-9-20 17:49 , Processed in 0.080212 second(s), 32 queries .

Powered by WLSD X3.1

© 2013-2014 WLSD Inc.

快速回复 返回顶部 返回列表
 
【电话】(15118131494)
【QQ】 未来时代科技01 售前咨询
【QQ】 未来时代科技02 售后技术
【旺旺】 请问有什么可以帮到您?不在线可留言.
【邮箱】
inextera@sina.com
【地址】 (深圳市龙岗坂田扬马小区)