Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33953
  • 博文数量: 17
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-02 12:04
文章分类
文章存档

2011年(1)

2010年(6)

2008年(10)

我的朋友
最近访客

分类: WINDOWS

2010-02-28 14:26:01

eVCARM9主板上实现短信收发

英创公司

2009-12-3

 

       利用公共的GSM短信信道(SMS)和GPRS数据信道(TCP/IP),实现设备的远程通讯,是英创嵌入式主板的主要应用领域之一。在英创的x86嵌入式模块产品线中,通过与西门子公司的MC39i无线模块构成基本硬件环境,已提供了完善的GSM短信收发(包括中文短信)方案和基于GPRSTCP/IP数据通讯方案。在英创ARM9工控主板产品中,通过利用WinCE提供的RAS功能,已实现了基于GPRS3G信道的TCP/IP通讯,相关方案的介绍请参考《》、《》等文章。本文则主要侧重介绍英创ARM9主板与MC39i模块结合,通过eVC标准C/C++代码操作AT指令,实现中英短信收发功能的方法。

收发短消息可分三种模式:BLOCK 模式、TEXT 模式和PDU 模式。BLOCK 模式现在用的很少了;TEXT 模式则只能发送ASCII 码,它不能发送中文的UNICODE码;而PDU 模式编码较为复杂,它需要编写专门的函数来将文本转换为PDU格式,但PDU模式被所有手机支持,可以使用任何字符集,它也是手机默认的编码方式。英创公司提供的解决方案中,正是选用的PDU 模式。

PDU模式收发短消息可以使用三种编码: 7-bit 编码、8-bit 编码和UCS2 编码。7-bit 编码用于发送普通的ASCII字符;8-bit 编码通常用于发送数据消息,如图片或铃声等;UCS2 编码用于发送Unicode字符,当然也可以发送ASCII字符。由于英创的解决方案要实现中文短消息或者ASCII字符的发送,所以选择用UCS2 编码,即中文Unicode码,这可以适应发中文和ASCII字符的需要。PDU 串除了包含所发送的消息本身外,还包含很多其它参数信息,如服务中心号码、目标号码和编码方式等。

PDU编码与解码比较复杂,本文不做介绍。使用英创公司给出的SMS类,可以在不了解PDU编码格式的情况下,轻松完成短信收发编程。下面详细介绍SMS类的主要成员函数和使用方法。

       为了方便程序开发,定义SM_PARAM结构体如下:

typedef struct {

       char SCA[16];                    // 短消息服务中心号码(SMSC地址)

       char TPA[16];                     // 目标号码或回复号码(TP-DATP-RA)

       char TP_PID;                     // 用户信息协议标识(TP-PID)

       char TP_DCS;                   // 用户信息编码方式(TP-DCS)

       char TP_SCTS[16];           // 服务时间戳字符串(TP_SCTS), 接收时用到

       char TP_UD[160];              // 接收到的短信内容

       TCHAR TP_UDS[160];              // 要发送的短信内容

       } SM_PARAM;

       变量SCA为短消息服务中心号码(SMSC地址),例如成都移动的短消息服务中心号码为:8613800280500,注意,短消息服务中心号码应该包括86

       变量TPA为要发送的号码和收到短信时对方的手机号码,例如:8613880851364

       变量PID为协议标识,00表示普通GSM 类型,点到点方式

       变量DCS为用户信息编码方式:00表示7-bit编码;08表示UCS2 编码;04:表示8-bit 编码。

       变量SCTS为收到的短信的时间戳字符串。

       变量UDS为要发送短信的内容,最大容量是140字节,所以在UCS2 编码方式下,可发送短消息的最大字符数是70

       变量UD为接收到的短信内容。

 

在发短信之前,只需要填充SM_PARAM结构体,然后调用SMS_SendPDUMessage函数就可以发短信了。调用SMS_ReadShortMessage,就可以把短信信息读到SM_PARAM结构体中。SMS类的主要函数如下:

// 函数名称: SMS_Init

//     : SMS 模块初始化函数

// 输入参数: LPCTSTR Port   : 串口号, "COM1:"

// int  BaudRate   :    串口波特率, 115200

// DWORD UserParam:  用户传递到该类中的参数

// 输出参数:

//     : TRUE: 成功   FALSE: 失败

BOOL CSMS:: SMS_Init(LPCTSTR Port, int BaudRate, DWORD UserParam)

 

// 发送PDU编码短消息

// 输入: pSrc - PDU参数指针

// 返回:  TRUE: 成功   FALSE: 失败

BOOL CSMS::SMS_SendPDUMessage(SM_PARAM* pSrc)

 

// 函数名称: SMS_ReadShortMessage

//     : 读取短信内容

// 输入参数: DWORD num                           : 短信序号

// 输出参数: SM_PARAM * SmGetMsg  : 短信信息

//     : TRUE: 成功   FALSE: 失败

BOOL CSMS::SMS_ReadShortMessage(DWORD num, SM_PARAM * SmGetMsg)

 

// 函数名称: SMS_DeleteShortMsg

//     : 删除短信

// 输入参数:

// 输出参数: DWORD num  : 短信序号

//     : TRUE: 成功   FALSE: 失败

BOOL CSMS::SMS_DeleteShortMsg(DWORD num)

 

注意,在使用英创评估底板上的MC39i时,要先对先对MC39I上电,然后在调用初始化函数。下面以向13880851364号码发送英创hello为例,说明SMS_SendPDUMessage函数的使用方法。

1、 MC39I上电,并初始化:

SM_PARAM SmsInfo;

CSMS m_SMS;

GPRS_PowerOn( );                //MC39I上电

Sleep( 3000 );                                  //3秒钟

m_SMS.SMS_Init(_T("COM3:"), 115200, (DWORD)this);

 //MC39IEM9000com3

       2  填充pdu结构体

              SmsInfo.SCA=” 8613800280500”

              SmsInfo .TPA=”8613880851364”

SmsInfo.TP_PID=0;     //00 协议标识(TP-PID) 是普通GSM类型,点到点方式

              SmsInfo.TP_DCS=GSM_UCS2;   //使用UCS2编码方式

              SmsInfo .TP_UDS=_T(“英创hello”);

 

3、 调用SMS_SendPDUMessage函数,发短信息

m_SMS.SMS_SendPDUMessage(&SmsInfo);

       在读取短信时可以设置一个定时器,在响应TIMER事件的函数中调用SMS_ReadShortMessage函数,就可以及时得到含有短信信息的结构体。

       CString strTelCode, strMsg;

       Bool ret = m_SMS.SMS_ReadShortMessage(1, &ReadMsg);//读取第 1 条短信

       if (ret == TRUE)

       {

              strTelCode=ReadMsg.TPA;                  //得到对方手机号码

              strMsg=ReadMsg.TP_UD;                      //得到短信内容

              m_SMS.SMS_DeleteShortMsg(1);          //删除短信

       }

 

以上给出来使用英创提供的SMS类发短信与读短信的方法,英创客户可以在开发光盘中找到源码,也可以和我们联系得到源码。

阅读(495) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~