如今手机已成为大众交流的主要工具。有关手机的程序开发越来越广泛,本节通过典型实例介绍如何利用短信猫发送、接收短信。

1.方案分析

发短信的一种方法是利用短信猫发短信,本例中使用的是生产的串口短信猫。

所谓短信猫,其实是一种工业级GSM MODEM,通过串口与计算机连接,可以通过AT指令控制进行短信收发的设备。国内目前应用较多的短信猫,都是以SIEMENS或WAVECOM模块为核心组装而成的,与普通手机相比更为稳定高效。

短信猫是利用SIM卡发送短信的硬件设备,通过串口或USB接口(根据设备型号而定)与计算机相连。在程序中可以利用短信猫发送或接收短信。本例使用的是的串口短信猫。在购买短信猫时会附带有SDK的短信猫开发包,其中提供了操作短信猫的函数(封装在dllforvc.dll动态库中)。

2.实施过程
下面利用短信猫发送短信,单击【发送短信】按钮就可以完成对指定手机号码的短信发送,当有新的短信发送过来的时候,单击【接收短信】按钮就可以将短信显示出来。

程序实现具体步骤:

(1)新建一个网站,默认主页为Default.aspx。

(2)在页面中添加6个TextBox文本框,分别用于显示短信猫的COM端口、波特率、机器号码、短信猫的授权号码、输入接收短信的手机号码和要发送的短信内容。

(3)在页面中添加2个Button按钮,分别用于发送短信和接收短信。

(4)程序主要代码如下。

首先建立一个类库,将其命名为Baisc,然后在此类库中建立一个名为GMS的公共类,用于获取短信猫附带的动态库dllforvc.dll中的一些函数,之后将此类库编译成Basic.dll文件,在项目中将其引用,具体代码如下。

导入必要的命名空间,代码如下。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
通过调用dllforvc.dll中的一些函数,获取其中的各种方法供Default.aspx页面中调用,具体的代码如下。

namespace Basic
{
    public class GMS
    {
        //初始化gsm modem,并连接gsm modem
//参数说明:
//device:标识通信端口,如果为NULL,系统会自动检测。
//baudrate:标识通讯波特率,如果为NULL,系统自动检测。
//initstring:标识初始化命令,为NULL即可。
//charset:标识通讯字符集,为NULL即可。
//swHandshake:标识是否进行软件握手,为FALSE即可。
//sn:标识短信猫的授权号,需要根据实际情况填写。
        [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);
        //获取短信猫新的标识号码
//参数说明:
//device :通讯端口,为null时系统会自动检测。
//baudrate :通讯波特率,为null时系统会自动检测。
        [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();
        //发送短信息
//参数说明:
//serviceCenterAddress:标识短信中心号码,为NULL即可。
//encodeval:标识短信息编码格式,如果为8,表示中文短信编码。
//text:标识短信内容。
//textlen:标识短信内容的长度。
//phonenumber:标识接收短信的电话号码。
//requestStatusReport:标识状态报告。
        [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);
    }
}
在Default.aspx页中,导入命名空间using System.Text,具体代码如下。
using System.Text;

当页面加载时,通过调用GMS 类中的GSMModemGetSnInfoNew方法、GSMModemGetDevice方法和GSMModemGetBaudrate方法分别用于显示机器号码、COM端口和波特率,具体代码如下。

protected void Page_Load(object sender, EventArgs e)
    {
        //机器号码
        this.txtJQHM.Text = Basic.GMS.GSMModemGetSnInfoNew(txtCOM.Text, txtBTL.Text);
        this.txtCOM.Text = Basic.GMS.GSMModemGetDevice();  //COM1
        this.txtBTL.Text = Basic.GMS.GSMModemGetBaudrate();  //波特率
    }
当各项信息填写完毕之后,单击【发送短信】按钮,程序首先通过GMS类中的GSMModemInitNew方法连接设备,如果连接成功,程序会通过GMS类中的GSMModemSMSsend方法将输入的短信内容发送到指定的手机号码中,如果连接失败,程序会通过GMS类中的GSMModemGetErrorMsg方法输出错误信息,【发送短信】按钮的 Click事件中的代码如下。

protected void btnSend_Click(object sender, EventArgs e)
    {
        if (txtSJHM.Text == "")
        {
            Page.RegisterStartupScript("","<script>alert('手机号码不能为空!')</script>");
            txtSJHM.Focus();
            return;
        }
        if (txtContent.Text == "")
        {
            Page.RegisterStartupScript("", "<script>alert('短信内容不能为空!')</script>");
            txtContent.Focus();
            return;
        }
        //连接设备
        if (Basic.GMS.GSMModemInitNew(txtCOM.Text, txtBTL.Text, null, null, false, txtPower.Text) == false)
        {
            Page.RegisterStartupScript("","<script>alert('设备连接失败!'" + Basic.GMS.GSMModemGetErrorMsg()+"')</script>");
            return;
        }
        // 发送短信
        if (Basic.GMS.GSMModemSMSsend(null, 8, txtContent.Text, Encoding.Default.GetByteCount(txtContent.Text), txtSJHM.Text, false) == true)
            Page.RegisterStartupScript("","<script>alert('短信发送成功!')</script>");
        else
            Page.RegisterStartupScript("","<script>alert('短信发送失败!'" + Basic.GMS.GSMModemGetErrorMsg()+"')</script>");
    }
当单击【接收短信】按钮时,程序通过GSM类中的GSMModemSMSReadAll方法将发送到手机卡中的短信读取出来,【接受短信】按钮的Click事件中的代码如下。

protected void btnResvice_Click(object sender, EventArgs e)
    {
        //连接设备
        if (Basic.GMS.GSMModemInitNew(txtCOM.Text, txtBTL.Text, null, null, false, txtPower.Text) == false)
        {
            Page.RegisterStartupScript("","<script>alert('连接失败!'" + Basic.GMS.GSMModemGetErrorMsg()+"')</script>");
            return;
        }
        //接收短信
        txtContent.Text = Basic.GMS.GSMModemSMSReadAll(1);
        if (txtContent.Text.Length <= 0)
        {
            Page.RegisterStartupScript("","<script>alert('暂时没有新的信息!')</script>");
            return;
        }
        txtSJHM.Text = txtContent.Text.Substring(0, 13);
        txtContent.Text = txtContent.Text.Substring(13, txtContent.Text.Length - 13);
    }

3.补充说明
因为短信猫是串行通讯设备,必须串行提交短信发送,而且提交后必须等到有回应后才能提交下一条,否则会造成短信猫死机。如果存在多线程同时并发操作短信猫,也会造成短信猫死机。即使是针对同一短信猫的收发,也必须为一前一后串行,而不能通过收发两个并发线程来操作。

转载于:https://www.cnblogs.com/freedom831215/archive/2011/09/15/2177624.html

通过asp.net 短信猫发短信相关推荐

  1. 记AT命令控制短信猫发短信(中英文)加打电话java

    写在前面:全局变量 private static char symbol1 = 13; private static char symbol4 = '\n'; 拨打电话方法: public stati ...

  2. wavecom短信猫发短信的前期配置

    直接根据java开发包配置发现并不能用,经过自己的摸索终于可以用了,记录一下配置过程及所需要的jar包. 1.将给的jar包如下复制到jdk/jre/lib/ext目录下 2.将rxtxSerial. ...

  3. Java使用短信猫发信息(向串口发送AT指令)

    使用Java发送短信息的方式有两种: 1>使用第三方平台的http请求进行发送,优点是接口简单,使用方便,发送的效率高,多条可以同时发送,缺点是短信平台,三大运营商不提供接口,都是第三方平台,但 ...

  4. 短信猫实现短信验证小例子

    其实很多人都在用短信平台做这个注册的短信验证这块,以下是一个短信猫做短信验证的例子. 有具体的注解,可以尝试用用. /** * 获取验证码      */     public void sendCo ...

  5. Java调用SMSLib用单口短信猫发送短信详解

    技术园地 当前位置:短信猫网站主页 > 技术园地 > [转载]Java调用SMSLib用单口短信猫发送短信详解 发布时间:2017/02/09 点击量:620 SMSLib是Apache的 ...

  6. 超级终端调用短信猫发送短信说明

    转载文章:超级终端调用短信猫发送短信说明 短信发送测试 1.短信收发说明命令说明: 1).设置短消息中心  AT+CSCA="+8613800756500"回车(短信中心具体的号码 ...

  7. wavecom短信猫发送短信失败

    http://www.puppeter.cn/?p=106 wavecom短信猫发送短信失败 发表评论 分类:运维工具 | 标签:sms wavecom | 1,048 views 放置在机房用于监控 ...

  8. 基于JCFXBL与GSM短信猫的短信中心建设方案

    基于JCFXBL与GSM短信猫的短信中心建设方案 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/87 ...

  9. 知道106短信平台发短信为什么必须带上签名吗?

    许多客户在使用kewail短信平台的时候经常会问到: "为什么你们正规的106短信平台群发短信必须要加签名?" " 这个签名是什么意思?" " 签名不 ...

最新文章

  1. 程序员成长的本质,就是一步步靠近商业
  2. python if语句多个条件-关于函数:如何在python中为一个if语句提供多个条件
  3. 常用,好用的js代码
  4. 用faster-rcnn训练自己的数据集(VOC2007格式,python版)
  5. 如何将HBuilder中的项目Push至Gitee中!
  6. React之函数中的this指向
  7. java调用三汇语音卡,三汇语音卡
  8. 长春学校计算机科学技术学院,长春大学计算机科学技术学院
  9. java内容寻址_java – 获取方法对象而不按名称寻址方法
  10. ubuntu高版本环境变量问题
  11. 关于svn、git生成版本号脚本的改进
  12. jdk13.0.2安装mysql_centos下的安装mysql,jdk
  13. OpenShift 4 - 运行Spark和Zeppelin大数据应用
  14. 8月8日白暨豚宣告灭绝
  15. (转载)关注——软件界首例 暴风影音宣布召回1.2亿播放器软件
  16. 抖音java表白教程_抖音vbs表白代码制作方法分享
  17. 校园邮箱免费激活idea教程
  18. 读书笔记-采购与供应链管理(一个实践者的角度)
  19. 转账功能怎么测试?以支付宝转账到银行卡为例
  20. 小米路由器sn算ssh密码_路由宝刷小米mini编程器固件,开SSH.

热门文章

  1. go append 方法_Go 的 append 操作是线程安全的吗
  2. oracle 查询表里信息_查看ORACLE 数据库及表信息
  3. excel打印预览在哪里_别再浪费A4纸了,Excel按下这个键,一张纸可以打印全部表格内容...
  4. 6.5版本虚拟机的封装
  5. Python基础技术点和常见错误
  6. Java8 forEach 使用
  7. Delphi无法修改Clientdataset的字段的解决方法
  8. Fei Labs:FIP-5提案已通过
  9. Elon Musk发起投票,超7成参与者认为狗狗币是地球未来货币
  10. Hive 查看库有多少表,表有多少字段以及动态监控