2012-08-24 | #1 (permalink) |
论坛管理员
注册日期: 2009-06-30
帖子: 861
|
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)返回有误。
__________________
让世界倾听我们的笛声 |