C#利用短信猫收发短信息的方法

来源:互联网 发布:名器哪款接近真人知乎 编辑:程序博客网 时间:2024/04/29 03:55

在购买短信猫时会附带包括SDK的开发包,其中提供了操作短信猫的函数(封装在dllforvc.dll动态库中)。下面介绍操作短信猫的主要函数。
(1)GSMModemGetSnInfoNew函数
该函数获取短信猫注册需要的信息,代码如下:
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemGetSnInfoNew",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemGetSnInfoNew(string device, string baudrate);
参数说明如下。
l     device:通信端口,为null时系统会自动检测。
l     baudrate:通讯波特率,为null时系统会自动检测。
(2)GSMModemGetDevice函数
该函数获取当前的通讯端口,代码如下:
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemGetDevice",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemGetDevice();
(3)GSMModemGetBaudrate函数
该函数获取当前的通讯波特率,代码如下:
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemGetBaudrate",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemGetBaudrate();
(4)GSMModemInitNew函数
该函数用于初始化短信猫。语法如下:
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemInitNew",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern bool GSMModemInitNew(
        string device,
        string baudrate,
        string initstring,
        string charset,
        bool swHandshake,
        string sn);
参数说明如下。
l     device:标识通信端口,如果为NULL,系统会自动检测。
l     baudrate:标识通讯波特率,如果为NULL,系统会自动检测。
l     initstring:标识初始化命令,为NULL即可。
l     charset:标识通讯字符集,为NULL即可。
l     swHandshake:标识是否进行软件握手,为False即可。
l     sn:标识短信猫的授权号,需要根据实际情况填写。
(5)GSMModemSMSsend函数
该函数用于发送手机短信。语法如下:
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemSMSsend",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern bool GSMModemSMSsend(
        string serviceCenterAddress,
        int encodeval,
        string text,
        int textlen,
        string phonenumber,
        bool requestStatusReport);
参数说明如下。
l     serviceCenterAddress:标识短信中心号码,为NULL即可。
l     encodeval:标识短信息编码格式,如果为8,表示中文短信编码。
l     text:标识短信内容。
l     textlen:标识短信内容的长度。
l     phonenumber:标识接收短信的电话号码。
l     requestStatusReport:标识状态报告。
(6)GSMModemSMSReadAll函数
该函数取得所有短信息,包括SIM卡和手机中的短信息。返回的短信内容格式为电话号码1|短信内容1||电话号码2|短信内容2||:
    //接收短信息返回字符串格式为:手机号码|短信内容||手机号码|短信内容||
    //RD_opt为1表示接收短信息后不做任何处理,为0表示接收后删除信息
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemSMSReadAll",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemSMSReadAll(int RD_opt);
参数说明如下。
l     RD_opt:对读取后的短信息进行处理,0表示删除,1表示不做处理。
实现过程
(1)新建一个项目,命名为Ex13_14,默认窗体为Form1。
(2)在Form1窗体中,主要添加TextBox控件和Label控件,控件的数量及用途如图13.15所示,添加两个Button控件,分别用于发送短信息和接收短信息。
(3)主要程序代码。
将所使用的函数封装在GMS类中。代码如下:
class GMS
{
    //初始化gsm modem,并连接gsm modem
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemInitNew",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern bool GSMModemInitNew(
        string device,
        string baudrate,
        string initstring,
        string charset,
        bool swHandshake,
        string sn);
    //获取短信猫新的标识号码
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemGetSnInfoNew",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemGetSnInfoNew(string device, string baudrate);
    //获取当前通讯端口
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemGetDevice",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemGetDevice();
    //获取当前通讯波特率
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemGetBaudrate",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemGetBaudrate();
    //断开连接并释放内存空间       
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemRelease",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern void GSMModemRelease();
    //取得错误信息   
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemGetErrorMsg",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemGetErrorMsg();
    //发送短信息
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemSMSsend",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern bool GSMModemSMSsend(
        string serviceCenterAddress,
        int encodeval,
        string text,
        int textlen,
        string phonenumber,
        bool requestStatusReport);
    //接收短信息返回字符串格式为:手机号码|短信内容||手机号码|短信内容||
    //RD_opt为1接收短信息后不做任何处理,0为接收后删除信息
    [DllImport("dllforvc.dll",
         EntryPoint = "GSMModemSMSReadAll",
         CharSet = CharSet.Ansi,
         CallingConvention = CallingConvention.StdCall)]
    public static extern string GSMModemSMSReadAll(int RD_opt);
}
在装载Form1窗体时,获取设备信息。代码如下:
        private void Form1_Load(object sender, EventArgs e)
        {
            //机器号码,当参数为空时,函数自动获取设备信息
            txtJQHM.Text = GMS.GSMModemGetSnInfoNew(txtCOM.Text, txtBTL.Text);
            txtCOM.Text = GMS.GSMModemGetDevice();  //COM1
            txtBTL.Text= GMS.GSMModemGetBaudrate();  //波特率
        }
发送短信息。代码如下:
        private void btnSend_Click(object sender, EventArgs e)
        {
               if(txtSJHM.Text == "")
               {
           MessageBox.Show("手机号码不能为空!","提示", MessageBoxButtons.OK);
                   txtSJHM.Focus();
                   return;
               }
               if(txtContent.Text=="")
               {
           MessageBox.Show("短信内容不能为空!", "提示", MessageBoxButtons.OK);
                   txtContent.Focus();
                   return;
               }
               //连接设备
               if(GMS.GSMModemInitNew(txtCOM.Text, txtBTL.Text, null, null, false, txtPower.Text)==false)
               {
                   MessageBox.Show("设备连接失败!" + GMS.GSMModemGetErrorMsg(),"提示", MessageBoxButtons.OK);
                   return;
               }
               // 发送短信
               if (GMS.GSMModemSMSsend(null, 8, txtContent.Text, Encoding.Default.GetByteCount(txtContent.Text),txtSJHM.Text, false) == true)
                   MessageBox.Show("短信发送成功!", "提示", MessageBoxButtons.OK);
               else
                   MessageBox.Show("短信发送失败!" + GMS.GSMModemGetErrorMsg(), "提示", MessageBoxButtons.OK);
        }
接收短信息。代码如下:
        private void btnResvice_Click(object sender, EventArgs e)
        {
            //1)连接设备
            if (GMS.GSMModemInitNew(txtCOM.Text, txtBTL.Text, null, null, false, txtPower.Text) == false)
            {
                MessageBox.Show("连接失败!" + GMS.GSMModemGetErrorMsg(), "提示", MessageBoxButtons.OK);
                return;
            }
            //2)接收短信
            txtContent.Text = GMS.GSMModemSMSReadAll(1);
            txtSJHM.Text = txtContent.Text.Substring(0, 13);
            txtContent.Text = txtContent.Text.Substring(13, txtContent.Text.Length-13);
        }

原创粉丝点击