开发环境是ARM11&linux。我们当初选择的是飞凌的6410开发板,选择这个开发板,主要还是出于价格的考虑,飞凌的开发板价格相对于而言很便宜,记得买第一块的时候是在2011年4月,128m内存,256flash要590大洋,还送很多光盘,第二块板子的时候是在2011年5月,256内存,1gflash才要560大洋。 当然了板子做的也还可以,说明文档也很有条理,整体来说还是一款物美价廉的产品,但是售后服务就一般了(主要是价格摆在那了,同类的像立宇泰,优龙的就要贵了)。飞凌的论坛还是可以解决一些问题,至于那个售后热线貌似有点水。不过我个人觉得,飞凌开发板整体上来说对于是初学者是一个比较好的选择。既然选择了飞凌的开发板,所以在后来的gprs模块也就选择了飞凌的产品,飞凌的是一款3g模块,核心是中兴的AD3812,提供的软件还是比较全的,包括基本的at指令,wince,linux下的驱动源码。
飞凌的ad3812模块使用的usb口,在使用at指令发送短信之前要先设置数据的传输速率,数据位,奇偶校验位,停止位等,所以要使用该模块开发短信,还要有一定的串口编程基础,这个在在网上一搜一大把,我就不介绍了。
短信的发送一般分为三种模式:Block Mode, Text Mode和PDU Mode,其中block mode已经很少使用。下面介绍的内容,是在PDU Mode下发送和接收短消息的实现方法。text模式发送短信的时候比较简单,pdu模式相比而言的话要麻烦一下。具体使用那种模式,还要看你的需求,如果所要发送的短信内容全部是英文或者数字的话可以使用text模,如果你发送的短信中含有中文字符或者汉子的话就只能用pdu模式进行发送了。
我做的短信开发,发送的信息包含中文,而且接收的短信命令中也有中文,所以使用的是pdu模式。使用pdu模式发送短信的步骤如下:
(1)串口初始化。
(2)构建SMS的pdu串。
(3)设置短信发送模块的模式。
(4)使用AT指令发送pdu串到指定的手机号码。
下面对以上步骤进行详细的解释:
(1)串口初始化,串口的初始化要按照短信发送模块的默认来设置,我所使用的AD3812的说明书上明确指出 :115200,8,N,1,即传输速率是115200,数据位是8位,无奇偶校验位,一位停止位。
(2)构建SMS的pdu串。这一步是整个过程最主要的一步,关系到发送能否成功。首先要知道短信pdu串的组成,sms pdu串主要由9个部分组成,按照顺序分别为 SCA(service center adress)服务中心的电话号码;pdu—type(protocol data unit type):协议数据但与类型;MR(message reference) 所有成功的sms—submit参考数目;OA (originator adress)发送方sme(short-message-entity)的地址;DA(destination)接收方SME的地址;PID(Protocol Identifier)参数显示SMSC以何种方式处理SM;DCS(data coding scheme)参数表示用户数据采用什么编码方案;SCTS(service center time stamp)smsc接收到消息是的时间戳;UDL,用户数据长度;UD,用户要发送信息的内容。
(3)之前已经说过了,使用pdu模式,所以这一步其实就是告诉设备,我们使用的是pdu模式,对用的at指令是:AT+CMGF=0\r.注意:\r表示的是回车,指令后面必须跟有\r设备才能识别。
(4)第1-3搞定之后,剩下的就是告诉设备发送该短信了,具体的命令是AT+CMGS=%d\r,%d是一个正整数,该数的值与你发送短信的内容有关系,%d=15+2*发送的字符数。
现在根据我做的具体来说明过程,希望对你有帮助:
上面已经把我的软硬件环境说明了,下面重点说明短信的发送过程,我需要发送的短信内容是:江大科茂欢迎您!目的电话号码是18796082112,我使用是移动的sim卡。最后构建的sms pdu为:0891683108501105F011000D91688197062811F2000800166C5F592779D183026B228FCE60A8FF01
如上所示,其实整个sms pdu构建过程中,需要自己做的只有四处,分别是发送方的短信中心号码,目的手机号码,短信内容长度,短信内容的unicode码。其中紫色的为所在地的短信中心号码,因为我用的是镇江移动的号吗作为发送手机号,所以从网上就可以查到,对应的短信中心号是13800511500,需要按照前后位交换,最后一位补F进行重新排列。3108501105F0。红色的为目的手机号码,也需要进行重新排列。绿色的是短信的内容的长度具体计算方法为:短信内容的字符数*2,并要注意要以4位16进制表示。蓝色的为短信内容“江大科茂欢迎您!”的unicode吗,网上可以查到,这样就sms pdu就构建完成了。还需要特别提醒一下的是,在pdu构建完成,向设备写pdu串的时候不要忘记最后要添加ctrl+z,因为这是设备识别pdu串结束的标志。ctrl+z的assic码是0x1a。其中还要重点提一下就是 AT+CMGS=?的计算方法 15+短信字符数*2。具体的实现代码如下。
char smstype[]="AT+CMGF=0\r";
char smscmgs[]="AT+CMGS=31\r";
char pdu[]="0891683108501105F011000D91688197062811F2000800316C5F592779D183026B228FCE60A8FF01
\0x1a";
write(fd_usb,smstype,sizeof (smstype));
usleep (20000);
write(fd_usb, smscmgs,sizeof (smscmgs));
usleep (20000);
write(fd_usb,pdu_warn,sizeof(pdu_warn));
usleep (20000);