GPRS模块发送中文短信_gprs模块发送中文短信
GPRS模块发送中文短信由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“gprs模块发送中文短信”。
GPRS发送中文短信
我所使用的GPRS模块型号是WAVECOM Q2403A。
FS2410开发板通过串口1与GPRS模块通信,向串口1写入AT指令来控制GPRS模块,读串口1获得GPRS模块返回的状态信息。
使用串口连接GPRS模块发送和接收短消息,首先,我们要对由ESTI制订的SMS规范有所了解。与我们讨论的短消息收发有关的规范主要包括GSM 03.38、GSM 03.40和GSM 07.05。前二者着重描述SMS的技术实现(含编码方式),后者则规定了SMS的DTE-DCE接口标准(AT命令集)。
一共有三种方式来发送和接收SMS信息:Block Mode, Text Mode和PDU Mode。Block Mode已是昔日黄花,目前很少用了。Text Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区。PDU Mode被所有手机支持,可以使用任何字符集,这也是手机默认的编码方式。Text Mode比较简单,而且不适合做自定义数据传输,我们就不讨论了。下面介绍的内容,是在PDU Mode下发送和接收短消息的实现方法。
PDU串表面上是一串ASCII码,由‘0’-‘9’、‘A’-‘F’这些数字和字母组成。它们是8位字节的十六进制数,或者BCD码十进制数。PDU串不仅包含可显示的消息本身,还包含很多其它信息,如SMS服务中心号码、目标号码、回复号码、编码方式和服务时间等。发送和接收的PDU串,结构是不完全相同的。
首先以一个实例来说明在PC上通过AT指令发送PDU短信的全过程。假如我要发送下面的短信:
接收号码:+86***
短信内容:工作愉快!
短信中心号码:+86***
***5f011000d91683173711368f20008000a5bb691cc67098d3cff01
一、打开超级终端,设置波特率为9600,数据位8位,无奇偶校验,停止位1位,无流控,把GPRS模块连接到电脑的串口上。
二、对需要发送的短信内容进行处理。
1、短信中心号码处理:用字符串 addr 表示
(1)、将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 addr = “+86***”
=> addr = “86***F”
(2)、将奇数位和偶数位交换。
=> addr = “683108200005F0”
(3)、将短信息中心号码前面加上字符91,91是国际化的意思
=> addr = “91683108200005F0”
(4)、算出 addr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8 => “08” => addr = “***5F0”
2、手机号码处理:用字符串 phone
(1)、将手机号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 phone = “+86***”
=> phone = “86***F”
(2)、将手机号码奇数位和偶数位交换。
=> phone = “683106423346F9”
3、短信息部分处理:用字符串 msg 表示
(1)、转字符串转换为Unicode代码,例如“工作愉快!”的unicode代码为 5DE54F5C61095FEBFF01,(2)、将 msg 长度除2,保留两位16进制数,即 5DE54F5C61095FEBFF01 = 20 / 2 => “0A”,再加上 msg
=> msg = “0A5DE54F5C61095FEBFF01”
4、组合(1)、手机号码前加上字符串 11000D91(1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81),即 phone = “11000D91” + phone
=> 11000D91683106423346F9
(2)、手机号码后加上 000800 和刚才的短信息内容,000800也写死就可以了
即 phone = phone + “000800” + msg
即 11000D91683106423346F9 + 000800 + 0A5DE54F5C61095FEBFF01
=> phone = 11000D91683106423346F90008000A5DE54F5C61095FEBFF01
(3)、phone 长度除以2,格式化成2位的十进制数
即 11000D91683106423346F90008000A5DE54F5C61095FEBFF01 => 50位 / 2 => 25
三、通过串口向GPRS模块发送我们处理过的短信内容。
在超级终端里输入AT指令设置GPRS工作模式
AT+CMGF=0 //PDU模式发送
OK
接着输入我们处理的短信数据
AT+CMGS=25
> addr+phone
如果返回不是ERROR,就发送成功了。
通过以上的例子可以看出,我们编写的函数中要实现的主要功能有打开串口、设置串口的工作方式、处理发送的短信内容,把处理后的内容写入串口。
我写的接口函数如下
//打开串口和设置串口的工作方式
int gsmInit(void);
//处理发送的短信内容
int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength);//UCS2编码 int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength);//可打印字符串转换为字节数据
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength);//字节数据转换为可打印字符串
int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength);//正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength);//两两颠倒的字符串转换为正常顺序的字符串
int gsmEncodePdu(const SM_PARAM* pSrc, char* pDst);//PDU编码,用于编制、发送短消息
//发送短信函数
int gsmSendMeage(const SM_PARAM* pSrc);
//读短信函数
int gsmReadMeage(SM_PARAM* pMsg)
//删除短消息
int gsmDeleteMeage(const int index)
使用以上函数就可以发送中文短信,首先调用int gsmInit(void)做初始化工作,然后构建SM_PARAM结构体(SM_PARAM结构体的定义如下),调用int gsmSendMeage(const SM_PARAM* pSrc)函数,把SM_PARAM结构体的地址传递给这个函数就可以把短信发送出去。
// 短消息参数结构,编码/解码共用
// 其中,字符串以0结尾
typedef struct {
char SCA[16];// 短消息服务中心号码(SMSC地址)
char TPA[16];// 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID;// 用户信息协议标识(TP-PID)
char TP_DCS;// 用户信息编码方式(TP-DCS)
char TP_SCTS[16];// 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[161];// 原始用户信息(编码前或解码后的TP-UD)
char index;// 短消息序号,在读取时用到
} SM_PARAM;
通过以上方法在虚拟机环境下测试可以正常发送中文短信,想通过FS2410开发板上的串口发送中文短信还需要做一些工作。
首先要修改int gsmInit(void)中打开的串口设备节点名称,FS2410开发板上串口的设备节点需要我们自己建立,在开发板上串口的主设备号是204,我所使用的串口1的次设备号是65,使用mknod命令在/dev目录下建立串口设备节点,把int gsmInit(void)中打开的设备节点改成我们自己建立的。
其次我们开发板上挂载的根文件系统包含的动态库可能不完全,我们进行汉字编码转换时用到的iconv系列函数需要使用/usr/lib/gconv目录下的动态库,把我们交叉工具链所在目录crotool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/arm-softfloat-linux-gnu/lib/gconv下的全部动态库拷贝到/usr/lib/gconv目录下。在/etc/profile文件中加入环境变量exportGCONV_PATH=/usr/lib/gconv/。
最后使用交叉工具链编译出目标系统的代码就可以运行了。