分享

SMS模块

 ColonelLee 2012-08-13
参考文档

《RIL Driver Implementation Reference》

《中国电信CDMAEVDO-RevA数据终端客户端软件AT命令接口规范V1[1].1》

设计说明

1、参数设置

1.1   短信存储选择命令+CPMS

目前EVDO可选值为:“SM”,表示SIM卡;“ME”,表示NV。

目前只能读取SIM卡中的短信。

1.2 短信格式设置+CMGF

目前EVDO只支持text模式,设置AT+CMGF=1。

1.3   新短信上报+CNMI

设置AT+CNMI=1,2,2,1,0,上报消息包括^HCMT与^HCDS。

2、发送短信

上层应用调用RIL_SendMsg发送短信,到RIL Driver层调用RILDrv_SendMsg函数,在该函数中对短信数据进行编码,设置modem的选择短信参数命令HSMSSS,然后使用AT^HCMGS命令将短信数据传给modem,由modem向网络发送短信。

流程图:

2.1   短信发送参数HSMSSS

发送短信发送命令前,需发送HSMSSS命令至modem设置短信发送参数。

Command

Possible response(s)

^HSMSSS=<ack>,<prt>,<fmt>,<prv>

<CR><LF>OK<CR><LF>

有错误时:<CR><LF> ERROR<CR><LF>

每发一次短信,判断短信编码格式,设置一次HSMSSS

(现在的处理方法,后续可能需要再修改)

ASCII编码格式时,AT^HSMSSS=0,0,1,0;

UNICODE编码格式时,AT^HSMSSS=0,0,6,0;

<format>:表示该短消息的编码格式,取值为:

0—GSM 7 BIT

1-- ASCII编码(编码范围<=7F的采用ASCII编码)。ASCII编码按照原字符发送,例如字母A的ASCII码为0x41,则传输的字符为“A”。

2 -- IA5(可选)

3—OCTET(可选)

4—LATIN(可选)

5-- LATIN_HEBREW(可选)

6-- UNICODE编码(编码范围>7F的采用UNICODE编码)。UNICODE编码按照字符的原始值传送。例如汉字“一“的UINCODE编码为0x4E00,则传输的字符为’0x4E00’。

7—其它编码方式判断短信编码格式。

2.2   编码发送内容。

编码对方手机号码:EncodeMsgAddressText函数

编码短信内容:GSMToGSMHex函数

目前常用编码格式为ASCII和Unicode,中英文混合时使用Unicode编码格式。短信内容编码方式与GSM有所不同,GSM需将短信内容的ASCII码或Unicode码再转换为ASCII码进行传输,如短信内容为“A”,其ASCII码为“41”,GSM网络将“41”转为4和1的ASCII码即“3431”进行传输。而目前EVDO网络直接用“41”进行传输。

对短信编码结束后,判断短信编码格式,增加<ctrl+z>的编码。<ctrl-Z>:标识一条短信息内容的结束,编码方式为非UNICOD方式下字符为:'0x1A',编码方式为UNICOD方式下字符为:'0x001A'。

2.3 短信发送命令^HCMGS

需要发送的内容包括对方手机号码(<da>)和短信内容(TEXT)。

短信发送命令分两次进行,发送对方手机号码后等待返回一个“>”后再发送短信内容

返回短信发送成功上报指示^HCMGSS

Com out:           AT^HCMGS="da"<cr>

Com in:              <cr><lf>>

Com out:           <TEXT>

Com in:              <cr><lf>+CDSI: "ME",0<cr><lf>

Com in:              ^HCMGSS: 200<cr><cr><lf><cr><lf>0<cr>

                            目前modem返回有误,正确应为^HCMGSS: 200<cr><lf>0<cr>

 

         ParseSendMsg函数对返回消息进行解析。

2.4 出现的问题

1、短信内容取长问题

中英文混合短信的编码中包含[00],GSM网络将其转换为“3030”进行传输。而EVDO网络直接传输[00]时,原先的代码取长度处理的算法采用strlen,该函数将[00]视为结束符,导致发送中英文混合短信时英文内容丢失。

         2、短信内容包含<CR>

         目前发送AT命令至modem时,以<CR>判断为命令结束。当短信内容包含<CR>([0D])时,如“不”的Unicode编码为“4E0D”,则所发送的短信内容仅为“不”之前的字符。

         增加函数WriteMsgToComPort使发送短信内容时不判断<CR>为结束符。

3、解析短信发送返回消息

现在的处理方法是:不对<cr><lf>+CDSI: "ME",0<cr><lf>进行解析,等待下一条消息组合成<cr><lf>+CDSI: "ME",0<cr><lf>^HCMGSS: 200<cr><cr><lf><cr><lf>0<cr>时才对HCMGSS进行解析。因为先解析CDSI的话就不会再对HCMGSS进行解析,故先这么处理。

3、短信的接收

Modem接收新短信通知RIL Driver层,调用ParseMessage函数解析新短信上报消息。将解析的结果存放到结构体RILMESSAGE中,再通知上层应用。

3.1 新短信直接上报指示^HCMT

Command

Possible response(s)

 

<CR><LF>^HCMT:  <callerID>,<year>,<month>,<day>,<hour>,<minute>,<second>,<lang>,<format>,<length>,<prt>,<prv>,<type>,<tag><CR><LF><msg><CTRL+Z><CR><LF>

Type = RIL_MSGTYPE_IN_IS637DELIVER

解析对方号码:ParseMsgAddressText函数

解析时间:ParseMsgTimeStampText函数(小时的解析有些错误,应该要与系统时间对应)

解析短信内容:GSMHexToGSM函数

将解析后的数据传入结构体RILMESSAGE中相应的域。 

短信内容的解析过程是编码的逆过程。

3.2 新短信状态报告直接上报指示^HCDS

Command

Possible response(s)

 

<CR><LF>^HCDS: <callerID>,<year>,<month>,<day>,<hour>,<minute>,<second>,<lang>,<format>,<length>,<prt>,<prv>,<type>,<tag><CR><LF><msg><CTRL+Z><CR><LF>

Type = RIL_MSGTYPE_IN_IS637STATUS

解析过程与^HCMT基本相同,只是上报消息类型不同,而解析结果存放的结构体也不同。

3.3 出现的问题

1、查找<CR><LF>判断上报消息是否完整问题

         原代码中查找<CR><LF>采用strstr函数,该函数视[00]为结束符,导致短信内容为中英文混合时不能正确计算<CR><LF>的位置,而误判为上报信息不完整,所以不能解析上报消息。增加短信长度信息,将该信息传入ParseMessage函数,增加函数FindMsgRspPostfix,根据短信长度信息查找<CR><LF>,判断上报消息是否完整。

2、查找<CR><LF>判断短信内容长度

         原代码中采用strstr函数,中文短信或中英文混合短信则无法正确查找<CR><LF>位置。增加函数UnicodStrPostfixCRLF,替换strstr查找<CR><LF>,并返回<CR><LF>之后的字符串。

4、短信的读取HCMGR

开机初始化时上层应用调用RIL_ReadMsg读取SIM卡中短信,到RIL Driver层调用RILDrv_ReadMsg函数,使用AT^HCMGR命令读取SIM卡中短信,对短信数据进行解码,将短信数据存放到结构体RILMESSAGE传给AP端。

查询并设置短信存储选择命令+CPMS为读取SIM卡短信存储器(目前只能读取SIM卡中短信)。

Command

Possible response(s)

^HCMGR=<index>[,<mode>]

如果是 text 模式,并且命令执行成功时:

<CR><LF>^HCMGR:<callerID>,<year>,<month>,<day>,<hour>,<minute>,<second>,<lang>,<format>,<length>,<prt>,<prv>,<type>,<stat><CR><LF><msg> <CTRL+Z><CR><LF>OK<CR><LF>

否则:

<CR><LF>+CMS ERROR: <err><CR><LF>

首先对短信的存储状态Stat进行解析,根据Stat判断短信存储位置。

<stat>:整型值,表示短消息的存储状态,取值如下

0:收到的未读短信

1:收到的已读短信

2:存储的未发送短信

3:存储的已发送短信

4:所有的短信(该值只适用与+CMGL命令)

4.1 接收的未读短信或已读短信

调用ParseDeliverMessageTextGSM函数进行解析。

解析过程基本与新短信上报解析相同,只是上报消息类型不同,而解析结果存放的结构体也不同。

4.2   存储的未发送短信或已发短信

调用ParseSubmitMessageTextGSM函数进行解析。

解析过程基本与新短信上报解析相同,只是上报消息类型不同,而解析结果存放的结构体也不同。

4.3   出现的问题

1、短信存储状态的解析判断

由于EVDO上报格式与GSM不同,所以要修改代码,解析判断短信存储状态。增加函数ParseStatEnd。

         2、查找<CR><LF>判断短信内容长度

         与新短信上报存在同样的问题,当短信内容为中文或中英文混合时,无法正确查找<CR><LF>,增加函数UnicodStrPostfixCRLF,替换strstr查找<CR><LF>,并返回<CR><LF>之后的字符串。

5、短信的存储HCMGW

上层应用调用RIL_WriteMsg存储短信,到RIL Driver层调用RILDrv_WriteMsg函数,在该函数中对短信数据进行编码,使用AT^HCMRW命令将短信数据传给modem,存储到SIM卡中。

6、短信的删除CMGD

         处理方法与GSM网络完全相同,不做任何修改。

7、存在的上报错误问题(短信上报方面)

         1、设置ATV0时,新短信上报(^HCMT)、短信状态上报(^HCDS)和读短信上报(^HCMGR)消息结束符有误。

         2、成功发送短信后,返回消息(^HCMGSS)有误。

         3、读SIM卡中最后一条短信时(AT^HCMGR=40)返回有误。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多