C# 经过串口发送短信

手机短信群发做为企业平常通知,公告,天气预报等信息的一个发布平台,在于成本低,操做方便等诸多特色,成为企业通信之首选。本文介绍短信的编码方式,AT指令以及用C#实现串口通信的方法。数组

前言目前,发送短信的方式主要有三种:缓存

一、网关方式:向当前电信部门申请,不须要另外设备。可是费用相对来讲,比较高,以目前上海移动公司推出的短信群发套餐来讲,对于中小企业的短信息的发送数量来看,网络

短信群发和打电话相比,几乎没有什么优点。对于几万人的大公司而言,可能很便宜。对于几百人甚至更少人的公司来讲,这种方式根本不划算。函数

二、终端方式:借助GSM Modem(短信猫)之类的设备,经过数据线与PC机的串口相连,来群发短信,加之目前电信部门的拇指派地感地带之类的套餐,基本是成本在一条短信大概在5分钱左右,而短信猫的价格根本芯片不一样,价格有所不一样,最便宜的二三百钱就可搞定,贵的也就一千块左右。这种方式适合于小型企业和我的,并且这种方式不须要网络支持,只须要一台有串口的计算机便可。但这种方式的一个缺点就是若是群发人数比较多的状况下,发送信息会比较慢,还有尽管短信猫厂家宣传支持全部GSM卡,可是在市面的上150,158,159的卡兼容性比较差,其中我就用过150的卡,只能发送信息,而收不到回复信息。这种方式须要理解串口通讯、AT指令、短信编码、解码。性能

三、利用网站来实现,方式很简单。不过对网站的依赖性强,对网络的稳定性要求也高,且须要短信中间件支持,不太适合短信开发。测试

四、也是终端方式,就是一台高性能的短信猫支持,该短信猫能够同时插2张,最多插8张手机卡,进行同时的短信群发。目前咱们手机的接收的到不少垃圾短信基本就是这种方式发出来的,这种支持2张手机卡的短信猫价格在一千块左右,支持8张手机卡的短信猫价格大概在四千块左右。并且发送速度快。可是这种方式有三个缺点:网站

(1)该短信猫在一个时间周期内发出的信息是有限制的,好比只用一张手机卡的短信猫,一小时大概只能发布700条信息;(2)这种短信群发,会被电信部门视为垃圾短信,会被屏蔽掉,好比上海,目前这种方式就不能用,在奥运期间,好像北京也会屏蔽掉这种信息。编码

(3)发送信息量越大,单条信息价格越低。可是就是发送10万条短信,平均单条信息价格也在5分钱的样子。 下面详细说一下,第二种短信猫方式的进行短信群发的原理。短信发送的原理附后,这不是咱们开发的重点。短信编码   在收发短信方面,按时间产生前后,.net

共产生了三种模式:调试

Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文通过十六进制编码后被传送。目前,

PDU已取代Block Mode,因咱们主要探讨PDU模式的发送。以西门子3508手机为例。   

SMS是由Etsi所制定的一个规范(GSM 03.40 和 GSM 03.38)。当使用7-bits编码时,它能够发送最多160个字符;但用8 -bit编码,最多能够发送140个字符,一般没法直接经过手机显示;还有用16-bit编码时,最多70个字符,被用来显示Unicode(UCS2) 文本信息,能够被大多数的手机所显示。咱们今天讨论的是UCS2编码,也就是说,最多只能发送70个字符,无论英文仍是中文。   

      现例如咱们如今要发送以下信息,向个人手机13715342642发送"你好,Hello!"。在没有发送以前,你要清楚,手机SIM卡所在地的短信中心号,并非你如今所在地方的短信中心号,像我在深圳,深圳的短信中心号是:8613800755000,即便我如今到外地,短信中心号还是深圳。从上面咱们获得了下面的信息:   接收的手机号:13715342642   短信中心号:8613800755000   短信内容:你好,Hello!   在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先无论,看看编码后的信息: 0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021   看不懂吧,我来解释一下:   08 - 指的是短信中心号的长度,也就是指(91)+( 683108705500F0)的长度   91 - 指的是短信息中心号码类型。91是TON/NPI遵照International/E.164标准,指在号码前需加'+'号;此外还有其它数值,但91最经常使用。   683108705500F0 - 短信息中心号码。因为位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这须要根据不一样的地域做相应的修改。前面的(08)+(91)+( 683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SMSC)。

 11 - 文件头字节  

 00 - 信息类型(TP-Message-Reference)

 0D - 被叫号码长度  

 91 - 被叫号码类型  

 其实在实际处理中,咱们一般把11000D91写死在程序中,由于在国内,这些数据都是不会改变的。   683117352446F2 -被叫号码,通过了位移处理,实际号码为"8613715342642"。

上面的(00)+(0D)+(91)+ ( 683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。  

 00 - 协议标识TP-PID,这里通常为00  

 08 - 数据编码方案TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码  

 00 - 有效期TP-VP(TP-Valid-Period)  

 12-长度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的长度 36 / 2 = 18 的十六进 12   4F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:"你好,Hello!" AT指令   说到AT指令可多了,有厚厚的一本书,不属于咱们今天讨论的范围,在这里我仅讨论在发送短信中必需要用的几个AT指令。

  与SMS有关的GSM AT指令(from GSM07.05)如表1所示: AT 指令 功 能 AT+CMGC Send an SMS command(发出一条短消息命令) AT+CMGD Delete SMS message(删除SIM卡内存的短消息) AT+CMGF Select SMS message formate(选择短消息信息格式:0-PDU;1-文本) AT+CMGL List SMS message from preferred store(列出SIM卡中的短消息PDU/text:

0/"REC UNREAD"-未读,

1/"REC READ"-已读,

2/"STO UNSENT"-待发,

3/"STO SENT"-已发,

4/"ALL"-所有的)

AT+CMGR Read SMS message(读短消息)

AT+CMGS Send SMS message(发送短消息)

AT+CMGW Write SMS message to memory(向SIM内存中写入待发的短消息)

AT+CMSS Send SMS message from storage(从SIN|M内存中发送短消息)

AT+CNMI New SMS message indications(显示新收到的短消息)

AT+CPMS Preferred SMS message storage(选择短消息内存)

AT+CSCA SMS service center address(短消息中心地址)

AT+CSCB Select cell broadcast messages(选择蜂窝广播消息)

AT+CSMP Set SMS text mode parameters(设置短消息文本模式参数)

AT+CSMS Select Message Service(选择短消息服务)

表一:相关的GSM AT指令   我如今以实例来讲明这些指令的使用方法:   先用手机数据线将手机链接到电脑串口,并将串口的波特率设置为19200,能够开始了。   

   一、首先测试你的链接及手机是否支持AT指令,请在你的串口调试程序中输入:   AT<回车>   屏幕上返回"OK"代表计算机与手机链接正常,那样咱们就能够进行其它的AT指令测试了  

 二、设置短信发送格式   AT+CMGF=1<回车>   屏幕上返回"OK"代表如今短信的发送方式为PDU方式,若是是设置为TEXT方式,则,AT+CMGF=0<回车>  

 三、 发送短信   发送内容及手要号仍旧同上面在编码中的同样,编码后,获得要发送的数据以下 0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021   咱们用以下指令来发送   AT+CMGS=33<回车>   若是返回">",就把上面编码数据输入,并以CTRL+Z结尾,稍等一下,你就能够看到返回OK啦。   说明一下,为何AT+CMGS=33呢,是这样得来的: 11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021   这一段字符串的长度除以2获得的结果,上面的字符串,短信中心号加上短信内容获得的,怎么获得的,请回顾一下解码部份   在咱们前面的讨论中,一条完整的短信发送,只要执行三条AT指令,AT、AT+CMGS=?、AT+CMGS=?就能够了。因为篇幅,

我只能在这里提到这么多,你们要是想了解更多,能够向各手机厂商索取AT指令白皮书,里面很详细的。  

 上面讲到的,只能为咱们实际中做准备,咱们还必需要一个发送途径,根据咱们的须要,咱们选择投资最少,实现比较方便的串口通讯。注意,串口经过数据线跟手机相连,用AT指令来实现发送短信,在咱们选择数据线时,建议购买原厂所配,非原厂所配,在使用过程当中,常常出现一些莫明其妙的问题,好比,手机屏幕黑了,手机总是提示电池电量不足之类的。  串口通讯   

在C#中要实现串口通讯,不少人都不知所措,在论坛上常常能够看到"怎么用MSCOMM实现串口通讯"、"怎样能过串口与设备相连"诸如此类的问题。其实国外的网友早就把这些列入FAQ中了。   一般,在C#中实现串口通讯,

咱们有四种方法:   

第一:经过MSCOMM控件这是最简单的,最方便的方法。可功能上很难作到控制自如,同时这个控件在VS2003环境里没有,若是须要在VS2003环境开发串口通讯,须要在VB60里把这个控件借过来,并且还须要注册,之后在调试程序的过程当中,会出现再让你注册的状况(这方面有兴趣的朋友,能够加我QQ:617586962,你们一块儿探讨,我用这种方式开发几个通讯后台)。VS2005以后,包括VS2008里这个控件已经加里去了,使用起来很方便的。  

 第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的你们能够访问微软网站http: //msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便获得更多资料。  

 第三:就是用第三方控件啦,可通常都要付费的,不太合实际,不做考虑  

 第四:本身用API写串口通讯,这样难度高点,但对于咱们来讲,能够方便实现本身想要的各类功能   在本文,咱们采用第四种方法来实现串口通讯,不过不是本身写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对咱们来讲已经够用了。   

在整个终端短信的操做过程当中,与串口的通讯,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义:   

打开串口:   

函数原型:public void Open()   

说明:打开事先设置好的端口   

示例:

    using JustinIO;

 static JustinIO.CommPort ss_port = new JustinIO.CommPort();

  ss_port.PortNum = COM1; //端口号

 ss_port.BaudRate = 19200; //串口通讯波特率

  ss_port.ByteSize = 8; //数据位

 ss_port.Parity = 0; //奇偶校验

 ss_port.StopBits = 1;//中止位

  ss_port.ReadTimeout = 1000; //读超时

  try {  if (ss_port.Opened)

 {   

    ss_port.Close();   

    ss_port.Open(); //打开串口 

  }  

  else

 {  

 ss_port.Open();//打开串口 

  }

 return     true;

  } catch(Exception e)

{

 MessageBox.Show("错误:" + e.Message);

 return false;

}   写串口:  

 函数原型:

   public void Write(byte[] WriteBytes)

  WriteBytes 就是你的写入的字节,注意,字符串要转换成字节数组才能进行通讯  

 示例:

    ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI/r")); //获取手机品牌  

 读串口:   

  函数原型:

  public byte[] Read(int NumBytes)  

 NumBytes 读入缓存数,注意读取来的是字节数组,要实际应用中要进行字符转换  

 示例: string response = Encoding.ASCII.GetString(ss_port.Read(128)); //读取128个字节缓存

  关闭串口:   

   函数原型:ss_port.Close()   

   示例: ss_port.Close(); 实现上上边说了半天,短信猫实际就是两个做用:

(1)把PC的短信内容组包后经过短信猫发出去;

(2)把外边的短信经过猫收上来;实际上API就是初始化设备,读信息,写信息这几个过程; /////////////////// 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hbqhdlc/archive/2008/10/02/3009889.aspx

相关文章
相关标签/搜索