ofono发送GSM短信流程
2017-03-27 17:41
281 查看
以下为阅读ofono发送gsm短信流程笔记
1,上层通过DBus调用ofono的sms.c::sms_send_message
1)这一步传入参数:DBusConncetion conn
DBusMessage *msg
to 收件人地址
text 短信内容
void *data
ofono_sms *sms
2)从DBusMessage中取出text和to,验证to合法之后调用sms_text_prepare_with_alphabet,传入参数(to,text,sms->ref,flase,sms->use_delivery_reports,sms->alphabet)
2, 调用sms_text_prepare_with_alphabet
1)参数列表to : char*收件人地址
utf8 : char* 短信内容
ref : guint16 一个guint类型的值
use_16bit : bool 为false
use_delivery_reports : bool是否需要发送报告
alphabet : sms_alphabet 枚举类型的字符表值
2)处理流程:
1)申请如下数据结构成员:
template sms的数据结构,包含userData,smsAddress
gsm_encoded char*经过gsm编码过后的数据
ucs2_encoded char*经过usc2编码的数据
seq
used_locking/used_single gsm编码用到的字符表
2)初始化sms:
type设为sms_type_submit
rd为false
vpf 为 sms_validity_period_format_relative
rp 为false
srr 为 use_delivery_reports
mr 为0
vp.relative 为 0xA7 24小时制
调用sms_address_from_string将收件人地址to编码到submit.addr里面
3)调用convert_utf8_to_gsm_best_lang,传入参数:(utf8, -1, NULL, &written, 0, alphabet, &used_locking, &used_single)
3,调用convert_utf8_to_gsm_best_lang
1)参数列表:utf8 : char* utf8格式编码的源数据
len :long 长度,传入为-1
items_read :long* 返回值,读取数据
items_written : long* 返回值,写入数据数量
terminator : char 结束符
hint : gsm_dialect,这个结构体只代表字符表的名称,default,西班牙,土耳其等等.这里代表指定的字符表值
used_locking : gsm_dialect* 返回值,字符表
used_single : gsm_dialect* 返回值,字符表
2)声明本地变量 encoded : char*,然后调用convert_utf8_to_gsm_with_lang(utf8, len, items_read, items_written, terminator, locking, single)//字符表全是default
3.1,调用convert_utf8_to_gsm_with_lang
1)参数列表:text : char* utf8编码的字符串
len : long 长度这里还是-1
items_read /items_written : long* 返回值,分别表示读了多少,写了多少
terminator : char 结束符号
locking_lang/single_lang : gsm_dialect 字符表
2)处理流程
1)声明conversion_table t,用于保存转换表,调用conversion_table_init方法通过传入的字符表值初始化转换表。
2)开始处理字符,因为len是-1,所以在in不为0的时候回一直在循环里面。调用g_utf8_get_char_validated(in, max)//in为输入数据,max为6,返回gunichar,这个gunichar是从in里面读取max个字符组成的大unicodechar,
如果大于0xFFFF的值则表明非法跳转到err_out
调用unicode_locking_shift_lookup,使用得到的unicode char作为key去unicodeToGsm字符表中查找value,查不到返回0xFFFF
上一步查找失败的话再去扩展字符表查找,查不到返回0xFFFF,还是查不到的话就去goto err_out
如果查到的话,0x1b开头的话表示双字节gsm字符,否则表示单字节gsm字符(都是GSMAlphabet字符表定义的)
in跳转到下一个unicode字符的开端(宏定义实现的),nchars+1,unicode的字符数量+1
这样往复循环,有一个查不到的unicode字符就转到err_out
3)得到了unicode字符数,也得到了gsm字符数,把传入的utf8字符转成gsm,循环结束,返回结果。
4)错误处理:返回读取字符的数目,读了多少就返回多少
5)返回res,如果不成功的话基本上就是返回NULL
3)如果3.1中编码成功就返回,如果编码不成功,切传入的hint指定字符表为GSM-Default,说明无法编码数据,返回NULL,否则使用hint指定的字符集名称作为扩展表再次尝试编码。
4)如果仅仅拿来作为扩展表编码失败就用hint作为主表再次尝试编码(GSM_DIALECT_SPANISH主表就是默认的不用再次尝试),如果主表和扩展表全用hint还是无法编码就返回null,否则返回编码的数据
5)如果编码成功,将编码所用的字符表名称通过两个返回值,返回给调用者。
4, 继续sms_text_prepare_with_alphabet
1) 调用g_convert方法将utf8的字符串转换成USC22)如果转换的gsmencoded和usc2_encoded均为NULL就返回结果NULL
3)如果不都为NULL就通过template.submit.dcs记录编码方式
0x00对应7bit gsm 0x08对应UCS2
4)如果编码结果是gsm,将编码使用的字符表的名称写入到template.submit.ud中
5)如果是单条短信,直接调用pack_7bit_own_buf方法吧编码好的gsm加到template.submit.ud里面或者如果编码结果是ucs2的数据,直接加到template.submit.ud后面就可以。最后调用sms_list_append加入list然后返回。
6)对于长短信每次从编码好的数据中取出一个chunk(msgSize - headSize)大小的数据放到sms中并append到list中。最后返回list
Created with Raphaël 2.1.0sms.csms.ccommon.ccommon.csmsutils.csmsutils.cutil.cutil.cgutf8.cgutf8.cvalid_phone_number_formattrue(valid)or notif false will terminalsms_text_prepare_with_alphabetconvert_utf8_to_gsm_best_langconvert_utf8_to_gsm_with_langg_utf8_get_char_validatedg_utf8_get_char_extendedwill return the unicodecharreturn the valid unicodecharreturn the encodeed textreturn the list of messagesthis message list will be sent to modem with debus
鉴于MarkDown流程图超宽无法显示,流程图原始文字贴出来如下: sms.c->common.c:valid_phone_number_format common.c-->sms.c:true(valid)or not Note left of sms.c:if false\n will terminal sms.c->smsutils.c:sms_text_prepare_with_alphabet smsutils.c->util.c:convert_utf8_to_gsm_best_lang util.c->util.c:convert_utf8_to_gsm_with_lang util.c->gutf8.c:g_utf8_get_char_validated gutf8.c->gutf8.c:g_utf8_get_char_extended Note right of gutf8.c:will return \nthe unicodechar gutf8.c-->util.c:return the \nvalid unicodechar util.c-->smsutils.c:return the\n encodeed text smsutils.c-->sms.c:return the list \n of messages Note right of sms.c:this message list\n will be sent to modem with debus
相关文章推荐
- Android短信发送流程之普通短信发送(原)
- 如何通过GSM猫发送和接受GSM短信
- 普通短信发送流程
- Android Mms之:短信发送流程(图文详解)
- Android framework 短信发送流程
- AT指令发送短信流程
- Android短信发送流程之多收件人发送(原)
- [Android][KK][SMS]Frameworks学习——发送短信流程分析
- Android短信发送流程之长短信发送(原)
- Android 短信发送流程(修改版)
- Wavecom gsm 模块发送中文短信
- Android短彩信源码解析-短信发送流程(二)
- AT指令发送短信流程
- Android短信发送和接收流程源码分析
- AT指令对wavecom串口GSM工业手机发送短信(英文和PDU短信)
- 华为常用无线模块GSM短信发送例程
- 短信发送流程一:系统彩信(MMS)发送流程(2.2)
- Android短信发送流程之多收件人发送(原)
- php编程之短信发送接口调用流程的实现
- Android Mms之:短信发送流程(图文详解)