金笛工业手机论坛  

返回   金笛工业手机论坛 > 开发者乐园 > 短信开发资料

短信开发资料 短信开发技巧,代码分析

回复
 
LinkBack 主题工具 显示模式
旧 2012-08-24   #1 (permalink)
论坛管理员
 
admin 的头像
 
注册日期: 2009-06-30
帖子: 861
admin 的声望功能已被禁用
默认 SMS模块

SMS模块


参考文档
《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)返回有误。
__________________

让世界倾听我们的笛声
admin 当前离线   回复时引用此帖
回复

书签


当前查看此主题的会员: 1 (0 位会员和 1 位游客)
 

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为北京时间。现在的时间是 13:13


Powered by vBulletin® 版本 3.8.3
版权所有 ©2000 - 2024,Jelsoft Enterprises Ltd.