如PDU字符串:002008818169329646F10009119 02232003l00044F60597D,将其字段进行分解,如表4 所示。 DCS为0x09,表示使用UCS2字符集,当为0x00 时,使用GSM 8一bit编码方案。如“hellol”的GSM 8一 bit字节的编码为:E8329BFDOE01。 ScTS字段的意思是:发送时间为2011年09月 22日22 s 27 l 21,00时区 ![]() UD字段对于中文采用UCS2编码,对英文字符 则采用8 bit编码。其他字段参考前面所述,在这里不 再赘述。 3具体移植过程 目前,关于GSM SMS编解码已经有实现,代码已 经部分开放。在GSM SMS具体移植过程中,只需调用 相关功能函数接口即可。本文具体移植环境是在 Android 2.2操作系统上,移植过程中使用的3G无线 通讯模块为CDMA EvDo模组,模组使用的短信格式 是text模式。 3.1 SMS Send功能移植 在Android GSM Phone框架下,Android telephony framework层通过Socket接口传送给RIL 层的短信内容采用的是GSM PDU字符串形式 (Submit—PDU),而CDMA EvDo模组目前并不支持 PDU编码的信息对此可以有两种选择:①修改 framework层,把下发给RIL的信息改为text mode 的信息;②修改RIL,把PDU MODE的信息还原成 text mode的内容再发送。考虑到Android framework 层源代码对字符串的处理比较复杂,加上修改 framework层会导致很多问题的出现,比如对strlen、 asprintf函数调用等。在实际开发中本文采用了第2 种方案。 3.1.1 SMS Send相关AT命令介绍 在短信发送功能实现上涉及的AT命令是选择短 信参数命令‘HSMSSS和短信发送命令‘HCMGS。 在短信发送之前须先设置短信参数。具体说明如下: 短息参数设置命令语法结构[6]为:‘HSMSSS= <ack>,<prt>,<fmt>,<pry>。<ack>字段的 意思是是否需要短信状态报告(o一不需要短息状态报 告,1一需要短信状态报告),实际开发中该字段设置为 0。<prt>为短信优先级字段,<prv>为保密级别字 段,这两个字段都采用缺省处理,设置为0。<fmt>字 段为编码方式字段,当发送英文短信时,该字段设置为 1(GSM 7 bit编码)‘当发送中文短信时该字段需设置 为6(UCs2编码)。 短信的发送分两步完成[6]。首先下发‘HCMGS =<da>以(CR)结束;然后下发消息内容以<ctrl—Z >结束。其中<da>字段为接收发号码。<ctrl—Z>标 识一条短信的结束,编码方式为非UCS2方式下字符 为’0xlA’,编码方式为Ucs2方式下字符为, 0x001A’。实际开发中上述两步是姆用RIL中at send—command—sins()函数一并处理的。 3.1.2具体解码流程 Android平台在发送短信时,Android telephony framework层通过Socket接口,调用RIL层的 requestSendSMS(void*data,size—t datalen,RIL— Token t)函数,将Submit—PDU以PDU字符串的形 式传递给datat妇变量。由于在发送短信时,SMSC已经 包含在UIM卡中,所以从telephony framework传递 过来的PDU是不带SMSC的。为保证PDU字段的完 整性和正常解析,在RIL层处理上需将接收到PDU 串前加上0x00。整个解码工作流程如图1所示,详细 说明如下。 ①将Submit—PDU字符串转化为标准GSM SUBMIT SMS PDU结构体,调用函数smspdu create—from hex()。SMS PDU结构体描述如下: typedef struct SmsPDURec{ bytes—t base bytes—t end; bytes—t tpdu} )SmsPDURee I typedef struct SmsPDURee*SmsPDU‘ ②取Submit—PDU协议字段中目标地址字段,调 用smspdu—get—receiver—address()函数。 ③将目标地址字段转换为普通手机接收方号码, 调用函数sms address..to str()。 ④调用函数smspdu—get—text—messgae()获取 SMS PDU结构体中的文本信息(要发送的短信正文 内容)和内容编码方式。由于在UTF一8里,英文字符仍 然跟ASCII编码一样,所以可以直接取到其value。但 对于中文短信,在取其UTF8字节流字符串的value 之后,需将UTF8字节流字符串的value转换为将 UCS2字符串的value,调用函数utf8 to ucs2()函 数。这里需注意的是,短信正文内容结束标记,对于英 文短信直接将字符串结尾设置为’0xlA’,对于中文短 |