简单谈谈C#开发短信收发软件的原理 .

坛子里好像很多人对如何自己用C#开发手机短信有兴趣,正好我也做过这个,不妨今天就聊聊这个话题。

要说这个功能的原理其实并不难(我可没说不复杂:P)。首先当然要把手机和PC连接起来。怎么连倒是次要的,数据线/红外/蓝牙什么的都可以。通常连接好以后PC会虚拟出一个串行通讯口,这下就好办了,我们只要把手机看作一个普通的串口终端设备来进行给它下命令就行了!当然,给手机发命令也是有标准的,通常是GSM AT指令集,不过各厂商可能会有自己的扩充。最后只要命令手机把编过码的短信(一般通用的是PDU格式)替你发出去就可以了!

所以要实现这个功能牵涉到的知识点有点多:
1 串口通讯
2 GSM AT指令
3 PDU编码(如果需要接收的话还要知道怎么解码)

一样一样来。

在VS.NET 2005里,新加了个SerialPort控件(不过我还是喜欢直接定义个SerialPort,记得要先引用IO.Ports),用起来还是很方便的,所以串口通讯应该问题不大。

PDU编码算法网上有文章的,有兴趣的不妨自己搜一下。主要关键点就是PDU字符串各个字段的编排,还有短信中心和接收方手机号码的编码(很简单,奇偶位互换,长度为奇数的话先补F。例如,1234变成2143),中文正文的编码(BigEndian字节顺序的Unicode格式编码,说白了就是汉字的“Ascii”码)等等。

GSM AT相对可能就陌生点了。不过如果以前开发过modem设备应用的话肯定会很容易上手 -- 工作方式很像的。简单来说,发送短信的过程:

向手机发送 AT+CMGS=PUD长度
成功的话手机回送> 提示符(大于符后有个空格)
接着向手机发送短信PDU字串,以0x1A(Ctrl Z)结束。
成功的话手机回送OK,整个过程结束。

这个过程如果用超级终端的话很容易看清楚。当然需要事先计算好PDU和长度。

收短信的过程要复杂点。首先要让手机在收到短信时主动通知计算机,指令是 AT+CNMI=1,1。[注:根据某些资料的说法应该设置成2,1,但是我的西门子S65不支持。这里先置疑一下吧。]
这样短消息到达时手机会自动向PC发送+CMTI消息。这个消息中,我们取出短信的存储位置和该位置下的索引号。假如发现存到了ME,那么接下来发送AT+CPMS=ME。成功的话会得到+CPMS开头的消息。再发送AT+CMGR=刚才得到的索引号,成功的话就可以得到接收到的短消息的源代码了。

接下来就是要解析这条消息,包括短信中心号码,发送方号码,接收时间,编码方式(Unicode,Utf-7等),正文内容等等。有了这些信息愿意的话甚至还可以实现自动回复。具体格式请在网上搜索一把。Wavecom和西门子诺基亚等公司也都提供相关内容的pdf电子手册,包括GSM AT、PDU格式等,网上也都有流传,应该可以下载到。

至于彩信...尚未涉足... 

posted on 2012-01-17 14:04  chennie  阅读(514)  评论(0编辑  收藏  举报