新闻  |   论坛  |   博客  |   在线研讨会
单片机给手机发短信
gsfei2009 | 2009-05-31 13:14:49    阅读:697   发布文章

       随着科技的飞速发展和人民生活水平的不断提高,手机的普及率越来越高,更新也越来越快,价格也越来越便宜。因为手机工作的无线网络覆盖范围广,在信息传递方面性能稳定、可靠,所以把手机作为信息传递的载体,与单片机结合起来构成应用系统有着强大的生命力和广阔的应用空间,特别是在远程数据传输、远程监控等领域更是受到电子设计应用工程师的关注。一些专业刊物也介绍了一些有关这方面的文章,然而由于手机的控制指令复杂,数据格式繁琐,工程技术人员在进行单片机与手机的硬软件接口设计时经常会遇到很多困难,有时还无资料可查。笔者在完成一个项目的开发过程中,针对几种手机进行了大量的测试和实验,在此基础上归纳出一些带规律性的结论,对此结论,工程设计人员可拿来即用,大大缩短研发周期,现在把它公布出来,愿与广大电子设计人员共享。
1 硬件接口技术方面
    目前市场上流行的大部分手机几乎都具有数据引出口,并基本上都支持与GsM短信息相关的AT控制指令(GSM-SMS-AT指令),手机通过数据口以串行方式接收指令并向外输出数据。理论上讲,在数据口中找出RxD、TxD和GND引脚与单片机的串口对应连接即完成了硬件接口。然而,实际上由于不同品牌,不同型号手机的RxD、TxD和GND引脚并非一致,找查这三根线有时也非易事;况且手机数据口的电平既不是RS232电平,也不是TTL电平,与由5V供电的单片机串口还不能直接连接。最简单可靠的方法是使用手机的数据线建立单片机与手机的硬件连接。手机数据线是专为连接PC机9针串口而设计的,信号电平为标准的RS232电平,只要单片机的串口也转换为Rs 2 3 2电平,就可方便连接。9针串口引脚定义是固定的,即2脚为TxD(手机发送),3脚为RxD(手机接收)、5脚为GND。这样,无论什么型号的手机与单片机的连接就成了固定连接,不需要知道手机数据口信号的具体定义,二者通过数据线的连接电路如图1所示。 

    需要注意的是:不同手机数据线内部电平转换芯片的供电方式是不同的,有的是通过手机直接供电;有的是通过窃取PC机串口某些引脚(通常为4、6、7、8引脚)的电流经内部整流滤波稳压后提供。判断的方法是将数据线一端插到手机数据口,测量另一端2脚与5脚之间的电压,如果有一7V左右的电压,则为前者,如果测不出电压,则为后者,对于后者则需要单片机为4、6、7、8引脚任意一引脚提供+5V电压即可,如图1中虚线所示。

2 软件接口技术及控制原理
    单片机与手机的软件接口其实就是单片机通过与GSM短信息有关的AT指令控制手机的控制技术,如读取手机的短消息内容,删除短消息内容,列出手机中还未读的短消息等。关于AT指令的功能描述见参考文献[1,2]的文章内容,此处不再赘述。然而,执行一条指令,也并非某些资料中介绍得那么简单。事实上,指令的执行过程需要单片机与手机交互应答完成,每一次发送或接收的字节数有严格的规定,二者必须依据这些规定实现数据交换,否则,通信就是失败的。笔者经过对几种手机反复测试,总结出来一些规律,如表1所列。

    对几个问题说明如下。
    ①所有AT指令的指令符号、常数、PDu数据包等都是以ASCII编码形式传送的,比如“A”的ASCII编码为41H,“T”的AscII编码为54H,数字“0,,的AsCⅡ编码为30H等。
    ②单片机控制手机工作,必须把手机的短信息工作模式设置为PDu格式,即通过指令AT+cMGF=O完成。
    ③单片机向手机发送每一条指令后,必须以回车符作为该条指令的结束,回车的ASCII编码为0DH。例如,单片机向手机发送“AT+CMGF=0”这条指令,其ASCII编码序列为“41H、54H、2BH、42H、4DH、47H、46H、3DH、30H、0DH”,最后一个字节0DH就是回车符,表示该条指令结束,如果没有这个回车符,手机将不识别这条指令。
    ④当手机接收到一条完整的AT指令后,手机并不立即执行这条指令,而是先把刚才接收到的AT指令的全部ASCII编码序列全部反发送出来(含0DH),然后发送一个回车符和换行符的ASCII编码,即0DH和0AH,最后执行该条指令。
    ⑤手机向单片机传送短信息内容时,其PDu数据包的内容是以十六进制表示的数据,但并不是直接向单片机传递十六进制数据,而仍然是把每一位十六进制数以AscII编码来发送。这样,二个字节的十六进制数就变成4字节的ASCII码。但是,PDU数据包中的数据字节长度部分仍然是实际字节长度,而不是变成AscII码的字节长度,这在编程时应特别注意,否则,接收的数据就不完整。单片机接收到PDU数据包数据后,必须将其恢复成十六进制数据,其算法如下:设a为接收的ASCII码,b为转换后的十六进制数。如果a<39H,则b=a-30H;如果a>39H,则b=a-30H-07H,最后把前后两个数合并为一个字节。
    ⑥手机向单片机应答PDU数据包的字节数不包括前9字节数据(短信服务中心地址),但向单片机传送PDU数据包时,包括这9个字节的数据。例如,如果手机应答的PDU数据长度为50,而实际向单片机传送的十六进制数据为59字节,ASCII码为2×59字节,所以,单片机必须按2×59字节接收PDU数据。


3 应用实例
    笔者利用上述原理和接口技术开发了一个项目:高速公路显示导引系统。安装在高速公路上的LED显示屏实时显示前方路段车辆通行态势和天气气候情况,提醒并引导驾驶人员,正确驾驶。该系统的使用一定程度上消除了许多交通事故隐患,从而保障了道路的畅通和人民生命财产的安全。该系统由控制中心和若干个显示屏组成。控制中心实时将最新信息发送到各显示屏。构建控制中心与显示终端的通信链路,传统的方法要么铺设光缆用有线方式实现,要么构建专用无线网用无线方式实现。因为高速公路的特殊性,控制中心与显示终端之间的距离通常很远,两种方案都必须投入大量资金和巨大的施工工作量。如果采用GSM公众无线传输网络,控制中心以短信息的形式把显示信息发送到显示终端的技术方案,则具有投资小,施工方便,工作可靠,运行费用低等诸多优点。
    在控制中心,微机编辑好短信息后通过手机这个载体发送出去。在显示终端,单片机通过读取手机的短信息把它显示到LED显示屏上。项目的核心技术是单片机与手机的接口和PDU数据包中的汉字信息编码。因为短信息中的汉字仅仅是一个编码,单片机应用系统将编码变为汉字点阵数据,必须配置汉字字库。按GSM07.05协议规定,短信息中的汉字编码为Unicode编码,如果构建一个Unicode编码的汉字字库,确实是一件繁琐的工作,因此,在设计单片机应用系统时,采用如下两点技术措施。
    ①单片机系统配置的字库为GB-2312编码的汉字库,即区位码汉字库,该汉字库在网上可免费下载,固化到Flash存储芯片中即可。当然这样做的前提是PDU数据包中的汉字编码必须为汉字内码而非Unicode编码。
    ②控制中心编辑PDU数据包数据时,采用自定义数据方式,其中,代表汉字的数据,直接取用汉字的机内码即可,免去了把机内码再转换为Unicode编码之苦。实践证明,这是可行的。
    采用以上技术措施的优点,一是省去了两种编码的相互转换;二是保证了数据的保密性,非系统内用户无法接收,即使接收也无法显示。
    该项目研制成功投入使用后,因显示终端只接收不发送,几乎没有运行成本。发送端(控制中心)可采用月租方式,也能把运行费用降低到最低限度。因此该项目得到用户满意的评价。

GSM(Global System for Mobile communication)系统是目前基于时分多址技术的移动通讯体制中比较成熟、完善、应用最广泛的一种系统。目前已建成的覆盖全国的GSM数字蜂窝移动通信网,是我国公众移动通信网的主要方式。主要提供话音、短信息、数据等多种业务。基于GSM短消息功能可以做成传输各种检测、监控数据信号和控制命令的数据通信系统,能广泛用于远程监控、定位导航、个人通信终端等。由于公众GSM网络在全球范围内实现了联网和漫游,建立上述系统不须再组建专用通信网络,所以具有实时传输数据功能的短消息应用将得到迅速普及。

目前,人们设计的各类DTE设备基础上以微处理器为核心,带有RS232/RS485等通信接口,在物理层上很容易实现与GSM设置(如手机等)的连接。但对SMS协议的研究文献却较少,特别是用单片机控制手机的SMS(Short Message Service)收发的研究更少。笔者在用单片机设计基于GSM的SMS数据采集器时,对怎样用单片机控制手机收发短信息进行了探讨。

1 串口控制SMS的工作原理

单片机与手机一般采用串行异步通信接口,具有红外和通信电缆两种连接方式,通信速度可设定,通常为19200bps。采用红外接口的优点是单片机系统与手机电气隔离,相互不干扰,接口各自独立,使用方便;缺点是通信距离较短,红外传播的方向性对接口相对位置有要求。采用电缆连接时,数据传输的可靠性较好;其主要缺点是接口的电气参数不兼容,设计不当时会对手机的通信质量产生影响。笔者经过实践设计的接口电平转换电路如图1。

GSM的短信息业务SMS利用信令信道传输,这是GSM通信网所特有的。它不用拨号建立连接,把要发的信息加上目的地址发送到短信息服务中心,经短消息服务中心完成存储后再发送给最终的信宿。所以当目的GSM终端没开机时信息不会丢失。每个短消息的信息量限制为160字节。

现在市场上大多数手机均支持GSM07.05规定的AT指令集。该指令集是ETSI(欧洲通信技术委员会)发布的,其中包含了对SMS的控制。利用GSM手机的串行接口,单片机向手机收发一系列的AT命令,就能达到控制手机收发SMS的目的。ETSI的GSM07.05中用于SMS收发控制的主要AT命令见表1。

表1 常用AT指令GSM07.05Function(功能)ATE0RESETAT+CSMS选择短信息服务AT+CPMS选择短信息内存AT+CMGF选择短信息格式AT+CSCA短信息中心地址AT+CNMI显示新收到的短信息AT+CMGR读短信息AT+CMGS发送短信息AT+CMGL列出SIM卡中短信息AT+CMSS从SIM内存中发短信息AT+CMGW向SIM内存中写入待发短信息AT+CMGD删除SIM内存中的短信息AT+CSCB选择蜂窝广播信息

GSM手机通过异步通信接口实现对SMS的控制共有三种接入协议:Block Mode;基于AT命令的TextMode;基于AT命令的PDU Mode。PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU Mode应用最为广泛,基本上全国所有的电信局都提供支持PDU Mode的短消息业务。有些地址则不支持Text Mode和Block Mode,这就限制了这两种接入协议的应用,而且PDU Mode已有取代Block Mode的趋势。为了保证系统具有广泛的适用性,本文采用PDU模式收发SMS。

PDU相当于一个数据包,它由构成消息(SMS)的信息组成。作为一种数据单元,它必须包含源/目的地址、保护(有效)时间、数据格式、协议类型和正文,正文长度可达140字节,它们都以十六进制表示。PDU结构根据短消息由移动终端发起或以移动终端为目的而不同。

当由移动终端发起时,PDU的格式为:
SMSCPDU类型MRDAPIDDCSVPUDLUD(0~140octed)

当以移动终端为目的时,PDU的格式为:
SMSCPDU类型OAPIDDCSSCTSUDLUD(0~140octed)

其中,SMSC为短消息业务中心地址,DA/OA为源/目的地址,PID为协议识别,DCS为数据编码,UDL为用户数据长度,UD为用户数据,VP为有效时间,MR指明是发出信息,SCTS指明短消息到达业务中心的时间。

2 PDU格式下短信息的接收

根据设置不同,手机将收到的短消息保存在缓存单元或存入SIM卡,单片机从手机中接收短消息实质上就是从SIM或缓存中读出信息。这主要利用AT+CMGR和AT+CMGL两条指令来完成,其工作过程见图2。

由于不同的厂商对AT指令集的解释代码和响应信息不一样,所以单片机首先要确认能否与手机建立起通信,一般用ATE指令完成此确认;然后用AT+CMGF指令选定短消息的数据格式;在收到手机的正确回答反以AT指令完成读出功能。一般用AT+CMGL读取以前的信息,在收到手机的RING(振铃)数据时,用AT+CMGR读取实时信息。

以下是笔者设计的物流数据采集系统中用到的接收SMS的一个实例,它说明了PDU模式的应用。单片机发送和接收(手机回答)均为ASCII码。所用手机为SIEMENS S3508i。

操作过程如下({}内为注释):

发送:ATE

手机回答:OK {已建立联接}

发送:AT+CMGF=0 {选用PDU格式}

手机回答:OK {允许选择PDU格式}

发送:AT+CMGL=2 {列出已有的短信息}

手机回答:+CMGL:1,2,,24{1表示信息个数,2表示未发信息,24表示信息总容量}

0D71683108370105F004000D81683179133208F

10000026080410033802632184CF682D

95E0DC2B36D3D170A0243106933D97A

0243106933D97A02451068B1983492608

OK

以上这组PDU格式的十六进制字符串,不但包含了短消息的内容,同时包含了发送者的手机号码、短信息中心号码、短消息发送时间等。

下面对信息内容进行分析:

0D:短信息中心地址(号码)长度。

91:短信息中心号码类型,91是TON/NPI。TON/NPI遵守International/E.164标准,指在号码前需加'+'号;此外还可直有其他数值,但91最常用。

683108370105F0:SMSC 短信息所使用的服务中心号码13807310500。它经过十六进制以字节为单位的高低半字节换位处理,号码是奇数的添F,构成一个HEX字节。

04:PDU类型,文件头字节。

0B:主叫号码长度。

81:主叫号码类型。

3179133208F1:0A主叫号码,也经过了处理,实际号码为13973123801。

00:PID,为协议标识。

00:DCS短信息编码类型是GSM Default Alphabet,即由7位ASCII码移位组成8位十六进制码(octet),其方法见表2。
1sthexB0A6A5A4A3A2A1A02ndhexC1C0B6B5B4B3B2B13rdhexD2D1

D0C6C5C4C3C24thhexE3E2E1E0D6

D5D4D35thhexF4F3F2F1F0E6E5E46thhexG5G

4G3G2G1G0F6F56thhexH6H5H4H3H2H1H0G6

02608041003380:SCTS短信息发送时间,02/06/08/14:00:33.08。

26:UDL经处理后的8位码(octet)短信息字节长度,它小于消息ASCII码的长度。

32184CF682D95E30DC2B36D3D170A024310693

3D97A0243106933D97A02451068B1983492608:

UD 编码后的PDU数据,短信息内容“2002/06/08/13:48ID102OKID10

3OK ID201FAIL”。

3 短信息的发送

与接收短信息一样,发送时也要先建立联接,传送一些初始化指令,然后发送短消息内容。下面是用SIEMENS S3508i发

送一个短信息的例子,内容为:“2002/06/08/13:48 ID102OK ID103OK ID201FAIL”。其

ASCII码为:“32030322F30362F30382F31333A34382049443130324F4B

2049443130334F4B2049443230314641494C20”。

发送:ATE {请求建立联接}

手机回答:OK {已建立联接}

发送:AT+CMGF=0 {选择PDU模式}

手机回答:OK

发送:AT+CSMS=0{检测手机是否支持SMS命令}

手机回答:OK

发送:AT+CMGS=52{发送短信息,52 octets(不包括最初9个短信息元字节)}

手机回答:>{允许上传数据,ASCII码是($20H,$2EH)}

发送:0891683108701305F011000B81317913320

8F10000AA2632184CF682D95

E30DC2B36D3D170A0243106933D97A02431069

33D97A02451068B19834926081A

不计最初9个短消息信元字节,本短信息有52字节(104个字符)。AT+CMGS仅说明了SMSC信息内容的长度,在收到手机回答的>符号手才发送PDU数据串,并以(CTRL^Z)结束。

PDU数据串的内容说明如下:

08:短信息信元SMSC(短信息中心号码)的字节长度

91:短信息中心号码类型,91表明中心号码是国际通用电话号码。

683108701305F0:短信息中心号码:8613807310500。

11:PDU SMS发送的文件头字节。这里11指正常发送短信息。

00:信息类型。这里00指让手机自动加上主叫号码。

0B:被叫号码长度。

81:被叫号码类型。

3179133208F1:被叫号码13973123801。

00:协议标识。

00:短信息编码类型是GSM Default Alphabet。

AA:短信息被保留的时间为4天,其计算方法依照表3。
VP值短消息有效时间长度0~143(VP+1)×5分钟144~16712时+(VP-143)×30分168~1961天×(VP-166)197~2551周×(VP-192)

26:PDU格式短信息编码后字节长度。

32184CF682D95E30DC2B36D3D170A0243106

933D97A0243106933D

97A02451068B1983492608:编码后的PDU数据,短信息内容为“2002/06/08/13:

48ID102OKID103OK ID201FAIL”。

1A:ASCII码CTRL^Z:报文结束标志。

4 应用情况及常见主要问题的解决

笔者用MCS-51系列的单片机研制了一个手持式的数据采集产品,通过SIMEENS手机,利用GSM的SMS传输数据。经过在国内多个省市较大数量长期广泛的使用,性能良好,没有出现数据丢失的现象。证明上述设计用,性能良好,没有出现数据丢失的现象。证明上述设计是正确的。但在调试和试用阶段也遇到了如下问题:

(1)接口电平

手机的电缆接口电平一般是3V左右,单片机系统的工作电压一般为2.7~5.5V,范围较宽,为保证数据传输的正确,需在接口加电平限制电路,详见图1。

(2)部分城市无法使用

一些城市的SMS平台不允许使用缺省短消息服务中心号码的协议,只需在发送的PDU数据前面几个字节加上中心号码即可,详见本文发送实例。

(3)不能接收已正确发送的短消息

除GSM的SMS信道拥塞原因外,主要是PDU中PID字节的设置,使得收到的信息要存入SIM卡,而SIM卡已满,故不再接收信息。改变PID的设置即可。

(4)收不到开机前的短消息

主要是发送数据时,对短消息有效时间VP值设置不当造成的。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客