信需在字符串结尾加上’Ox00’和’0xlA’。 ⑤调用at—send—command()函数,设置短信参 数。对于英文短信需将编码字段<fmt>设置为1 (GsM 7bit编码),对于中文短信需将编码字段设置为 6(UCS2编码)。 ⑥调用at—send—command—sms()接口函数,对 目标地址下发短信正文内容。至此RIL层已经完成短 信发送功能。 ![]() 3.2 SMS Receive功能移植 text模式下,CDMA EvDo模组上报的内容,英文 短信情况下以原字符显示,中文短信则以UCs2编码 显示。GSM Phone框架下,Android telephony ramework层通过Socket等待RIL层传递过来的 MS必须为Deliver—PDU字符串形式。为此在RIL层 需要对模组上报的内容进行编码转换成GSM eliver—PDU字符串。 .2.1新短信直接上报指示语法结构与取值说明 以下是CDMA EvDo模块在测试板上,发送 “hello”内容给模块,模块主动上报的信息。 ‘HCMT:18962369641,2011,9,23.9,40,6,0, ,5 hello-’ 其语法结构‘63如下: ‘HCMT:<callerlD>,<year>,<month>,<day>· hour>.<minute>,<second>.<lang>,<format>。< ength><CR><LF><msg><CTRL+Z><CR><LF > 各字段取值说明如下: <lang>:语言,取值为0时为普通英文短信。取 值为6时为中文短信。 <format>:表示短消息的编码格式,1表示 ASCII编码,按照原字符发送。例如字母A的ASCIl 码为0x41,则传输的字符为“A”;当该字段为6时,表 示为Unicode编码,Unicode编码按照字符的原始值 传送。例如汉字“一”的Unicode编码为0x4E00,则传 输的字符为‘0x4E00’。 <CTRL+Z>:标识一条消息的结束,字符为:’ 0xlA’(Unicode编码对应为:’0x001A)。 3.2.2具体编码流程 编码工作流程如图2所示,详细说明如下。 ①编写功能函数,提取发送方号码、<lang>字 段、短信正文内容。 ②将发送方号码转换为标准发OA(Originator Address)字段,具体实现会用到sms—address—from str()函数。SMS Addresses结构体定义如下: #define SMS..ADDRESS..MAX..SIZE 16 typedef struct{ unsigned char len; unsigned char toa;I unsigned char data[SMS_ADDRESS_MAX_SIZE]) }SmsAddressRec,-SmsAddress l ③获取SMS时间戳,调用sms—timestamp—now (&timestamp)函数。SMS时间戳结构体如下: typedef struct{ unsigned char data[7]; )SmsTimeStampRec,-SmsTimeStamp l ④编写功能函数get—text()取短信正文内容的 value值。对于英文短信,直接取模组上报的原始值。对 中文短信,按照每个字节(8bit)处理,取其value。如 “你好”的UCS2编码为“4F60597D”,其对应的value 值为“O’Y)”。 ⑤将text值转化为标准GSM SMS PDU结构, 调用函数smspdu—create—deliver—utf8(text, length,&addr,8‘timestamp)。由于在UTF一8里,英 文字符仍然跟ASCII编码一样,所以可以直接转换。 为便于统一处理,对于中文短信,需先将UCS2字符串 的value转化为UTF8字节流字符串的value,转换方 法如下:例如“汉”字的UCS2编码是0x6C49。6C49在 0800一FFFF之间,所以要用到3字节模板[7】: lllOxxxx lOxxxxxx 10xxxxxx。将6C49写成二迸制 是:0110 110001 001001,用这个比特流依次代替模板 中的X,得到:11100110 10110001 10001001,即E6 B 89。编码实际过程中要用到了ucs2 to utfS()转换函 数,该函数在sms—gsm.C源程序中已有实现,在这里 不再赘述。 ⑥调用函数smspdu—to—hex(p[0],hex—pdu, 512),将SMS PDU转换为PDU字符串形式。 ⑦调用函数RIL onUnsolicitedResponse(RIL UNSOL—RESPONSE—NEW—SMS,hex—pdu, strlen(hex—pdu)),将Deliver—PDU字符串上报给 Android framework层。 ![]() 4 结束语 Android操作系统在RIL层提供了对GSM网络的支持。RIL则提供了SMS发送和上报的接口函数。 通过分析GSM SMS PDU的协议字段含义,结合 |