通过短信猫发送手机短信

wavecom短信猫常用AT命令

一、一般命令
1、 AT+CGMI 给出模块厂商的标识。
2、 AT+CGMM 获得模块标识。这个命令用来得到支持的频带
(GSM 900,DCS 1800 或PCS 1900)。当模块有多频带时,回应可能是不同频带的结合。
3、 AT+CGMR 获得改订的软件版本。
4、 AT+CGSN 获得GSM模块的IMEI(国际移动设备标识)序列号。
5、 AT+CSCS 选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换
每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
6、 AT+WPCS 设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。
ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
7、 AT+CIMI 获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。
在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
8、 AT+CCID 获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
9、 AT+GCAP 获得能力表。(支持的功能)
10、A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
11、AT+CPOF 关机。这个特殊的命令停止GSM软件堆栈和硬件层。
命令AT+CFUN=0的功能与+CPOF相同。
12、AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。
13、AT+CPAS 返回移动设备的活动状态。
14、AT+CMEE 报告移动设备的错误。这个命令决定允许或不允许用结果码
“+CME ERROR: <xxx>”或者“+CMS ERROR:<xxx>”代替简单的“ERROR”。
15、AT+CKPD 小键盘控制。仿真ME小键盘执行命令。
16、AT+CCLK 时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
17、AT+CALA 警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
18、AT+CRMP 铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。
有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
19、AT+CRSL 设定或获得到来的电话铃声的声音级别。

二、呼叫控制命令
1、 ATD 拨号命令。这个命令用来设置通话、数据或传真呼叫。
2、 ATH 挂机命令。
3、 ATA 接电话。
4、 AT+CEER 扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
5、 AT+VTD 给用户提供应用GSM网络发送DTMF(双音多频)双音频。
这个命令用来定义双音频的长度(默认值是300毫秒)。
6、 AT+VTS 给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
7、 ATDL 重拨上次电话号码。
8、 AT%Dn 数据终端就绪(DTR)时自动拨号。
9、 ATS0 自动应答。
10、AT+CICB 来电信差。
11、AT+CSNS 单一编号方案。
12、AT+VGR,AT+VGT 增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
13、AT+CMUT 麦克风静音控制。
14、AT+SPEAKER 喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
15、AT+ECHO 回音取消。
16、AT+SIDET 侧音修正。
17、AT+VIP 初始化声音参数。
18、AT+DUI 用附加的用户信息拨号。
19、AT+HUI 用附加的用户信息挂机。
20、AT+RUI 接收附加用户信息。

三、网络服务命令
1、 AT+CSQ 信号质量。
2、 AT+COPS 服务商选择。
3、 AT+CREG 网络注册。获得手机的注册状态。
4、 AT+WOPN 读取操作员名字。
5、 AT+CPOL 优先操作员列表。

四、安全命令
1、 AT+CPIN 输入PIN。
2、 AT+CPIN2 输入PIN2。
3、 AT+CPINC PIN的剩余的尝试号码。
4、 AT+CLCK 设备锁。
5、 AT+CPWD 改变密码。

五、电话簿命令
1、 AT+CPBS 选择电话簿记忆存储。
2、 AT+CPBR 读取电话簿表目。
3、 AT+CPBF 查找电话簿表目。
4、 AT+CPBW 写电话簿表目。
5、 AT+CPBP 电话簿电话查询。
6、 AT+CPBN 电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
7、 AT+CNUM 签署者号码。
8、 AT+WAIP 防止在下一次重起时初始化所有的电话簿。
9、 AT+WDCP 删除呼叫电话号码。
10、AT+CSVM 设置语音邮件号码。

六、短消息命令
1、 AT+CSMS 选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
2、 AT+CNMA 新信息确认应答。
3、 AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。
4、 AT+CMGF 优先信息格式。执行格式有TEXT方式和PDU方式。
5、 AT+CSAS 保存设置。保存+CSAS和+CSMP的参数。
6、 AT+CRES 恢复设置。
7、 AT+CSDH 显示文本方式的参数。
8、 AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。
9、 AT+CMGR 读短信。信息从+CPMS命令设定的存储器读取。
10、AT+CMGL 列出存储的信息。
11、AT+CMGS 发送信息。
12、AT+CMGW 写短信息并存储。
13、AT+CMSS 从存储器中发送信息。
14、AT+CSMP 设置文本模式的参数。
15、AT+CMGD 删除短信息。删除一个或多个短信息。
16、AT+CSCA 短信服务中心地址。
17、AT+CSCB 选择单元广播信息类型。
18、AT+WCBM 单元广播信息标识。
19、AT+WMSC 信息状态(是否读过、是否发送等等)修正。
20、AT+WMGO 信息覆盖写入。
21、AT+WUSS 不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。

七、追加服务命令
1、 AT+CCFC 呼叫继续。
2、 AT+CLCK 呼叫禁止。
3、 AT+CPWD 改变追加服务密码。
4、 AT+CCWA 呼叫等待。
5、 AT+CLIR 呼叫线确认限制。
6、 AT+CLIP 呼叫线确认陈述。
7、 AT+COLP 联络线确认陈述。
8、 AT+CAOC 费用报告。
9、 AT+CACM 累计呼叫计量。
10、AT+CAMM 累计呼叫计量最大值。
11、AT+CPUC 单价和货币表。
12、AT+CHLD 呼叫相关的追加服务。
13、AT+CLCC 列出当前的呼叫。
14、AT+CSSN 追加服务通知。
15、AT+CUSD 无组织的追加服务数据。
16、AT+CCUG 关闭的用户组。

八、数据命令
1、 AT+CBST 信差类型选择。
2、 AT+FCLASS 选择模式。这个命令把模块设置成数据或传真操作的特殊模式。
3、 AT+CR 服务报告控制。这个命令允许更为详细的服务报告。
4、 AT+CRC 划分的结果代码。这个命令在呼叫到来时允许更为详细的铃声指示。
5、 AT+ILRR 本地DTE-DCE速率报告。
6、 AT+CRLP 无线电通信线路协议参数。
7、 AT+DOPT 其他无线电通信线路参数。
8、 AT%C 数据压缩选择。
9、 AT+DS 是否允许V42二度数据压缩。
10、AT+DR 是否报告V42二度数据压缩。
11、AT\N 数据纠错选择。

九、传真命令
1、 AT+FTM 传送速率。
2、 AT+FRM 接收速率
3、 AT+FTH 用HDLC协议设置传真传送速率。
4、 AT+FRH 用HDLC协议设置传真接收速率。
5、 AT+FTS 停止特定时期的传送并等待。
6、 AT+FRS 接收沉默。

十、第二类传真命令
1、 AT+FDT 传送数据。
2、 AT+FDR 接收数据。
3、 AT+FET 传送页标点。
4、 AT+FPTS 页转换状态参数。
5、 AT+FK 终止会议。
6、 AT+FBOR 页转换字节顺序。
7、 AT+FBUF 缓冲大小报告。
8、 AT+FCQ 控制拷贝质量检验。
9、 AT+FCR 控制接收传真的能力。
10、AT+FDIS 当前会议参数。
11、AT+FDCC 设置DCE功能参数。
12、AT+FLID 定义本地ID串。
13、AT+FPHCTO 页转换超时参数。

十一、V24-V25命令
1、 AT+IPR 确定DTE速率。
2、 AT+ICF 确定DTE-DCE特征结构。
3、 AT+IFC 控制DTE-DCE本地流量。
4、 AT&C 设置DCD(数据携带检测)信号。
5、 AT&D 设置DTR(数据终端就绪)信号。
6、 AT&S 设置DST(数据设置就绪)信号。
7、 ATO 回到联机模式。
8、 ATQ 决定手机是否发送结果代码。
9、 ATV 决定DCE响应格式。
10、ATZ 恢复为缺省设置。
11、AT&W 保存设置。
12、AT&T 自动测试。
13、ATE 决定是否回显字符。
14、AT&F 回到出厂时的设定。
15、AT&V 显示模块设置情况。
16、ATI 要求确认信息。这命令使GSM模块传送一行或多行特定的信息文字。
17、AT+WMUX 数据/命令多路复用。

十二、特殊AT命令
1、 AT+CCED 电池环境描述。
2、 AT+CCED 自动RxLev指示。
3、 AT+WIND 一般指示。
4、 AT+ALEA 在ME和MSC之间的数据密码模式。
5、 AT+CRYPT 数据密码模式。
6、 AT+EXPKEY 键管理。
7、 AT+CPLMN 在PLMN上的信息。
8、 AT+ADC 模拟数字转换度量。
9、 AT+CMER 移动设备事件报告。这个命令决定是否允许在键按下时是否主动发送结果代码。
10、AT+WLPR 读取语言偏好。
11、AT+WLPW 写语言偏好。
12、AT+WIOR 读取GPIO值。
13、AT+WIOW 写GPIO值。
14、AT+WIOM 输入/输出管理。
15、AT+WAC 忽略命令。这个特殊命令允许忽略SMS、SS和可用的PLMN。
16、AT+WTONE 播放旋律。
17、AT+WDTMF 播放DTMF旋律。
18、AT+WDWL 下载模式。
19、AT+WVR 配置信差的声音速率。
20、AT+WDR 配置数据速率。
21、AT+WHWV 显示硬件的版本。
22、AT+WDOP 显示产品的出厂日期。
23、AT+WSVG 声音增益选择。
24、AT+WSTR 返回指定状态的状态。
25、AT+WSCAN 扫描。
26、AT+WRIM 设置或返回铃声指示模式。
27、AT+W32K 是否允许32kHz掉电方式。
28、AT+WCDM 改变缺省旋律。
29、AT+WSSW 显示内部软件版本。
30、AT+WCCS 编辑或显示订制性质设置表。
31、AT+WLCK 允许在特定的操作符上个性化ME。
32、AT+CPHS 设置CPHS命令。
33、AT+WBCM 电池充电管理。
34、AT+WFM 特性管理。是否允许模块的某些特性,如带宽模式、SIM卡电压等。
35、AT+WCFM 商业特性管理。是否允许Wavecom特殊特性。
36、AT+WMIR 允许从当前存储的参数值创建定制的存储镜像。
37、AT+WCDP 改变旋律的缺省播放器。
38、AT+WMBN 设置SIM卡中的不同邮箱号码。

十三、SIM卡工具箱命令
1、 AT+STSF 配置工具箱实用程序。
2、 AT+STIN 工具箱指示。
3、 AT+STGI 获得从SIM卡发来的预期命令的信息。
4、 AT+STCR 主动提供的结果:工具箱控制反应。

十四、AT命令使用举例(简单发送短信息命令)
1.设置短消息中心
AT+CSCA=“+8613800756500”回车(具体的号码由当地的运营商决定。)
2.接收短消息
+CMTI:“SM”,X (X表示接收短消息的SIM卡存储号码)
AT+CMGR=X回车 (从X存储区读短消息)
AT+CMGD=X回车 (从X存储区删除短消息)
3.发送短消息
AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0)
AT+CMGS=“+8613xxxxxxxxx”回车
>输入短消息。Crtl+Z结束并发送

 

短信猫开发之短信编码格式

 

目前,发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由A B C D E F G H I J K L M十三项组成。

A:短信息中心地址长度,2位十六进制数(1字节)。
B:短信息中心号码类型,2位十六进制数。
C:短信息中心号码,B+C的长度将由A中的数据决定。
D:文件头字节,2位十六进制数。
E:信息类型,2位十六进制数。
F:被叫号码长度,2位十六进制数。
G:被叫号码类型,2位十六进制数,取值同B。
H:被叫号码,长度由F中的数据决定。
I:协议标识,2位十六进制数。
J:数据编码方案,2位十六进制数。
K:有效期,2位十六进制数。
L:用户数据长度,2位十六进制数。
M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的Unicode字符。

PDU编码协议简单说明

例1 发送:SMSC号码是+8613800250500,对方号码是13693092030,消息内容是“Hello!”。从手机发出的PDU串可以是
08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 96 03 29 30 F0 00 00 00 06 C8 32 9B FD 0E 01
对照规范,具体分析:
分段 含义 说明
08 SMSC地址信息的长度 共8个八位字节(包括91)
91 SMSC地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,补‘F’凑成偶数个
11 基本参数(TP-MTI/VFP) 发送,TP-VP用相对格式
00 消息基准值(TP-MR) 0
0D 目标地址数字个数 共13个十进制数(不包括91和‘F’)
91 目标地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 96 03 29 30 F0 目标地址(TP-DA) 8613693092030,补‘F’凑成偶数个
00 协议标识(TP-PID) 是普通GSM类型,点到点方式
00 用户信息编码方式(TP-DCS) 7-bit编码
00 有效期(TP-VP) 5分钟
06 用户信息长度(TP-UDL) 实际长度6个字节
C8 32 9B FD 0E 01 用户信息(TP-UD) “Hello!”

例2 接收:SMSC号码是+8613800250500,对方号码是13693092030,消息内容是“你好!”。手机接收到的PDU串可以是
08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 96 03 29 30 F0 00 08 30 30 21 80 63 54 80 06 4F 60 59 7D 00 21
对照规范,具体分析:
分段 含义 说明
08 地址信息的长度 个八位字节(包括91)
91 SMSC地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,补‘F’凑成偶数个
84 基本参数(TP-MTI/MMS/RP) 接收,无更多消息,有回复地址
0D 回复地址数字个数 共13个十进制数(不包括91和‘F’)
91 回复地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 96 03 29 30 F0 回复地址(TP-RA) 8613693092030,补‘F’凑成偶数个
00 协议标识(TP-PID) 是普通GSM类型,点到点方式
08 用户信息编码方式(TP-DCS) UCS2编码
30 30 21 80 63 54 80 时间戳(TP-SCTS) 2003-3-12 08:36:45  +8时区
06 用户信息长度(TP-UDL) 实际长度6个字节
4F 60 59 7D 00 21 用户信息(TP-UD) “你好!”


若基本参数的最高位(TP-RP)为0,则没有回复地址的三个段。从Internet上发出的短消息常常是这种情形。
注意号码和时间的表示方法,不是按正常顺序顺着来的,而且要以‘F’将奇数补成偶数。


在PDU Mode中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可“压缩”成7个;8-bit编码通常用于发送数据消息,比如图片和铃声等;而UCS2编码用于发送Unicode字符。PDU串的用户信息(TP-UD)段最大容量是140字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。


需要注意的是,PDU串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。7-bit编码时,指原始短消息的字符个数,而不是编码后的字节数。8-bit编码时,就是字节数。UCS2编码时,也是字节数,等于原始短消息的字符数的两倍。如果用户信息(TP-UD)中存在一个头(基本参数的TP-UDHI为1),在所有编码方式下,用户信息长度(TP-UDL)都等于头长度与编码后字节数之和。如果采用GSM 03.42所建议的压缩算法(TP-DCS的高3位为001),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。

         上面的文字描述有点空谈的感觉,下面以一个小Demo实例来讲解。Demo的功能是获取待发送短信pdu编码。

 

发送短信,需要手机号和短信服务中心,本例及以后说明都以中国移动手机号码开发为例。移动的短信服务中心号为13800100500

查看pdu按外钮代码如下:

 

代码
 1     string _mobileNumber = “12345678901”;//手机号码
 2             string _content =”测试”;//短信同容
 3             string centerNo = “13800100500”;
 4             string length = string.Empty;
 5             string smstosendPDU = string.Empty;
 6                 length = PDUencoding.CountSMSLength(_mobileNumber, _content);
 7                 smstosendPDU = PDUencoding.PDUEncodingSMS(centerNo, _mobileNumber, _content);
 8                 string str = "AT+CMGS=" + length + "\r" + smstosendPDU + "\x01A";//指令格式
 9                 tbSmsPduCode.Text = str;
10 

 

 

相关方法如下:

 

 

代码
 1        /// <summary>
 2        /// 计算消息长度
 3        /// </summary>
 4        /// <param name="_phoneNumber">Phone</param>
 5        /// <param name="_targetText">Context</param>
 6        /// <returns></returns>
 7        public static string CountSMSLength(string _phoneNumber, string _targetText)
 8        {
 9            if (!(_phoneNumber.Substring(02== "86"))
10            {
11                _phoneNumber = String.Format("86{0}", _phoneNumber);     //检查手机号是否按标准格式书写,不是,就补上“”
12            }
13            return (8 + ((_phoneNumber.Length % 2== 0 ? _phoneNumber.Length / 2 : (_phoneNumber.Length + 1/ 2+ _targetText.Length * 2).ToString();
14        }
15 
16        /// <summary>
17        /// 对整个要发送的短信的PDU编码
18        /// </summary>
19        /// <param name="cscaNumber"></param>
20        /// <param name="PhoneNumber"></param>
21        /// <param name="TargetText"></param>
22        /// <returns></returns>
23        public static string PDUEncodingSMS(string _cscaNumber, string _phoneNumber, string _targetText)
24        {
25            if (!(_cscaNumber.Substring(02== "86"))
26            {
27                _cscaNumber = String.Format("86{0}", _cscaNumber);     //检查手机号是否按标准格式书写,不是,就补上“”
28            }
29            if (!(_phoneNumber.Substring(02== "86"))
30            {
31                _phoneNumber = String.Format("86{0}", _phoneNumber);     //检查手机号是否按标准格式书写,不是,就补上“”
32            }
33            //开始号码
34            StringBuilder _sb = new StringBuilder();
35            _sb.Append("0891");
36            //短信中心
37            _sb.Append(ReversalNumber(_cscaNumber));
38            _sb.Append("1100" + String.Format("{0,2:X}", _phoneNumber.Length).Replace(' ''0'+ "91");
39            //目标号码
40            _sb.Append(ReversalNumber(_phoneNumber));
41            //协议标识,编码信息和有效期
42            _sb.Append("0008FF");//+ String.Format("{0,2:X}", TargetText.Length * 2).Replace(' ', '0'));
43            //短信长度和内容
44            _sb.Append(ContentEncoding(_targetText));
45            return _sb.ToString();
46        }
47 
48        /// <summary>
49        /// 手机号码的编码
50        /// </summary>
51        /// <param name="Target"></param>
52        /// <returns></returns>
53        public static string ReversalNumber(string _phone)
54        {
55            string _strResult = string.Empty;
56            if (!(_phone.Substring(02== "86"))
57            {
58                _phone = String.Format("86{0}", _phone);     //检查手机号是否按标准格式书写,不是,就补上“”
59            }
60 
61            char[] _eachnumber = (_phone.Length % 2 == 0? Convert.ToString(_phone).ToCharArray() : Convert.ToString(_phone + "F").ToCharArray();
62            for (int i = 0; i < _eachnumber.Length - 1; i += 2)
63            {
64                _strResult += (_eachnumber[i + 1].ToString() + _eachnumber[i].ToString());
65            }
66            return _strResult;
67        }
68 
69        /// <summary>
70        /// 短信内容的编码
71        /// </summary>
72        /// <param name="srvContent"></param>
73        /// <returns></returns>
74        public static string ContentEncoding(string _srvContent)
75        {
76            Encoding encodingUTF = System.Text.Encoding.BigEndianUnicode;
77            string s = string.Empty;
78            byte[] encodedBytes = encodingUTF.GetBytes(_srvContent);
79            for (int i = 0; i < encodedBytes.Length; i++)
80            {
81                s += BitConverter.ToString(encodedBytes, i, 1);
82            }
83            s = String.Format("{0:X2}{1}", s.Length / 2, s);
84 
85            return s;
86        }
87 

 

通过短信猫发送手机短信

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

1.方案分析

  

发送手机短信的一种方法是利用短信猫发送手机短信,本例中使用的是北京人大金仓信息技术有限公司生产的串口短信猫(DG-C1A)。

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

 

  

 

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

 

2.实施过程

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

 

程序实现具体步骤:

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

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

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

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
.补充说明

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

posted on 2011-06-23 22:12  kasafuma  阅读(1923)  评论(2编辑  收藏  举报