mt2503接收带端口的短信
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
09B之前版本适用。需要在MMItask或者其他task中接收带端口号的短信
[SOLUTION]
InMMItask
注册端口
要接收一个数据短信,首先需要注册一个对应的端口;当收到该端口的SMS时,会调用注册的CallbackFunction.
1API原型
voidmmi_frm_sms_reg_port(
PsFuncPtrU16callback,
module_typemod_src,
U16port_num,
BOOLenable,
BOOLwithoutdata,
PsFuncPtrU16regcallback);
2功能描述
注册一个SMS端口号,当收到该类型的SMS时,会通过回调函数通知对应的Application.主要用于MMItask的
Application使用。
3函数参数
3.1callback
注册后的回调函数,用于知道这次注册的结果
3.2mod_src
注册的Application所属的模块
3.3port_num
注册的端口号
3.4enable
表示注册还是取消注册,TRUE为注册,FALSE为取消注册
3.5withoutdata
表示Application是否需要该SMS的Content,如果不需要,在SMSphp?mod=tag&id=6090" target="_blank" class="relatedlink">Framework中会把接收到的该SMS的所有数据都释放掉。
注意:withoutdata为TRUE时,表示不需要保留Content,为FALSE为表示需要保留Content。
3.6regcallback
接收到该端口的SMS的回调函数。相当于接收该端口短信的函数
4类型描述
4.1PsFuncPtrU16
typedefvoid(*PsFuncPtrU16)(void*,module_type,U16);
4.2module_type
Componenttask'smoduleid,pleaserefertoenummodule_type
4.3mmi_frm_sms_deliver_msg_struct
SMS的Information,需要做强制转换mmi_frm_sms_deliver_msg_struct;
typedefstruct
{
U8fo;
U8scts[7];
l4c_number_structsca_number;
l4c_number_structaddr_number;
U8pid;
U8dcs;
U8ori_dcs;
U16index;/*forawaitedmessage,thisisthestartindex*/
U16dest_port;
U16src_port;
U8mti;
U8display_type;
#ifdef__MMI_MESSAGES_COPY__
U8storageType;
#endif
U32concat_info;
U16no_msg_data;
U8msg_data[1];/*forawaitedmessage,thisisthefirstsegmentdata*/
}mmi_frm_sms_deliver_msg_struct;
fo
SMSTPDU的FirstOtect,用于判断短信的类型,是否有UDH等(具体可以参见sepc23.040的9.2.2.1)
scts
短信中心时间戳,短信中心收到该SMS的时间,我们在Inbox里可以看到的时间;在开UM的情况下,对于Outbox,Unsent或
Draft,为发送或保存的时间。在这个Case,是收到的SMS的时间。(具体可以参见spec23.040的9.2.3.11)
sca_number
短信中心号码
addr_number
接收者号码(DA)或发送者号码(OA);在这个Case,是发送者的号码
pid
ProtocolIdentifier,如为0x00则是SMSApplication,0x32则是Email。(具体可以参见spec23.040的9.2.3.9)
dcs
Content部分编码格式,具体值请参考smsal_dcs_enum
ori_dcs
在TPDU中的TP-DCS字段值
index
L4index,在这个Case,为第一个Segment的L4Index.
dest_port
目的端口,如果该SMS为端口短信,则不为零
src_port
源端口,如果该SMS为端口短信,则不为零
mti
messagetypeidentifier,表示该SMS的类型(参考spec23.040的9.2.3.1)
display_type
显示类型,具体值请参考smsal_display_type_enum
storageType
存储类型,具体值请参考smsal_storage_enum
concat_info
长短信(ConcatenatedSMS)的Information,包括这个SMS多少个Segment,这个Segment的第几个等。
2个低字节为Referencenumber;
最高字节为该SMSSegment是第几个Segment;
第三字节为该SMS的总Segment数。
no_msg_data
SMScontent部分的字节数
msg_data[1]
新来的SMS的Content都会缓存在一个Buffer里,msg_data的是第一个Segment的Content缓存Buffer的Index。
5SampleCode
5.1注册端口
voidsample_reg_sms_port_req(U16port_num)
{
mmi_frm_sms_reg_port(
sample_reg_sms_port_rsp,
MOD_MMI,
port_num,
MMI_TRUE,
MMI_FALSE,
sample_recieve_data_sms);
}
voidsample_reg_sms_port_rsp(void*data,module_typemod,U16result)
{
if(result==MMI_FRM_SMS_OK)
{
//Registersuccess
//AddHandleCode
}
else
{
//RegisterFailed
//AddhandleCode
}
}
5.2接收数据短信
/*serial_num,表示这是接收到的第几个该端口的DataSMS,只有在注册时withoutData为FALSE时才有用*/
voidsample_recieve_data_sms(void*data,module_typemode,U16serial_num)
{
mmi_frm_sms_deliver_data_struct*inMsg=(mmi_frm_sms_deliver_data_struct*)data;U8*msg_content;
U8msg_content_len=inMsg->message_len;
if(msg_content_len>0)
{
msg_content=OslMalloc(inMsg->message_len+ENCODING_LENGTH);
if(sample_get_data_sms_content(inMsg->dest_port,msg_content)==TRUE)
{
//recievesuccess
if((inMsg->dcs==SMSAL_DEFAULT_DCS)||
(inMsg->dcs==SMSAL_UCS2_DCS))
{
//thEMSg_contentisUCS2encoding
//Addhandlecode
}
else//inMsg->dcsisSMSAL_8BIT_DCS
{
//themsg_contentis8Bitencoding
//Addhandlecode
}
}
else
{
//recievefailed
//Addhandlecode
}
}
else
{
//recievefailed
//Addhandlecode
}
}
5.3获取数据短信的文本内容
得到的msg_content编码格式与该SMS的dcs的关系如下:
如果dcs是SMSAL_DEFAULT_DCS或SMSAL_UCS2_DCS,则msg_content是UCS2编码;如果dcs是SMSAL_8BIT_DCS,则
msg_content是8Bit(Ascii)编码。
U8sample_get_data_sms_content(U16part_num,S8*msg_content)
{
mmi_frm_sms_deliver_data_struct*smsdata;
U8index;
smsdata=OslMalloc(sizeof(mmi_frm_sms_deliver_data_struct));
index=mmi_frm_sms_get_data_index(MOD_MMI,part_num,0);
while(index!=MMI_FRM_SMS_INVALID_NUM)
{
if(mmi_frm_sms_check_data_complete(index))
{
break;
}
index++;
index=mmi_frm_sms_get_data_index(MOD_MMI,part_num,index);
}
if(index!=MMI_FRM_SMS_INVALID_NUM)
{
mmi_frm_sms_get_data(index,smsdata,msg_content);
mmi_frm_sms_free_data(index);
returnTRUE;
}
else
{
returnFALSE;
}
OslMfree(smsdata);
}
09B之前版本适用。需要在MMItask或者其他task中接收带端口号的短信
[SOLUTION]
InMMItask
注册端口
要接收一个数据短信,首先需要注册一个对应的端口;当收到该端口的SMS时,会调用注册的CallbackFunction.
1API原型
voidmmi_frm_sms_reg_port(
PsFuncPtrU16callback,
module_typemod_src,
U16port_num,
BOOLenable,
BOOLwithoutdata,
PsFuncPtrU16regcallback);
2功能描述
注册一个SMS端口号,当收到该类型的SMS时,会通过回调函数通知对应的Application.主要用于MMItask的
Application使用。
3函数参数
3.1callback
注册后的回调函数,用于知道这次注册的结果
3.2mod_src
注册的Application所属的模块
3.3port_num
注册的端口号
3.4enable
表示注册还是取消注册,TRUE为注册,FALSE为取消注册
3.5withoutdata
表示Application是否需要该SMS的Content,如果不需要,在SMSphp?mod=tag&id=6090" target="_blank" class="relatedlink">Framework中会把接收到的该SMS的所有数据都释放掉。
注意:withoutdata为TRUE时,表示不需要保留Content,为FALSE为表示需要保留Content。
3.6regcallback
接收到该端口的SMS的回调函数。相当于接收该端口短信的函数
4类型描述
4.1PsFuncPtrU16
typedefvoid(*PsFuncPtrU16)(void*,module_type,U16);
4.2module_type
Componenttask'smoduleid,pleaserefertoenummodule_type
4.3mmi_frm_sms_deliver_msg_struct
SMS的Information,需要做强制转换mmi_frm_sms_deliver_msg_struct;
typedefstruct
{
U8fo;
U8scts[7];
l4c_number_structsca_number;
l4c_number_structaddr_number;
U8pid;
U8dcs;
U8ori_dcs;
U16index;/*forawaitedmessage,thisisthestartindex*/
U16dest_port;
U16src_port;
U8mti;
U8display_type;
#ifdef__MMI_MESSAGES_COPY__
U8storageType;
#endif
U32concat_info;
U16no_msg_data;
U8msg_data[1];/*forawaitedmessage,thisisthefirstsegmentdata*/
}mmi_frm_sms_deliver_msg_struct;
fo
SMSTPDU的FirstOtect,用于判断短信的类型,是否有UDH等(具体可以参见sepc23.040的9.2.2.1)
scts
短信中心时间戳,短信中心收到该SMS的时间,我们在Inbox里可以看到的时间;在开UM的情况下,对于Outbox,Unsent或
Draft,为发送或保存的时间。在这个Case,是收到的SMS的时间。(具体可以参见spec23.040的9.2.3.11)
sca_number
短信中心号码
addr_number
接收者号码(DA)或发送者号码(OA);在这个Case,是发送者的号码
pid
ProtocolIdentifier,如为0x00则是SMSApplication,0x32则是Email。(具体可以参见spec23.040的9.2.3.9)
dcs
Content部分编码格式,具体值请参考smsal_dcs_enum
ori_dcs
在TPDU中的TP-DCS字段值
index
L4index,在这个Case,为第一个Segment的L4Index.
dest_port
目的端口,如果该SMS为端口短信,则不为零
src_port
源端口,如果该SMS为端口短信,则不为零
mti
messagetypeidentifier,表示该SMS的类型(参考spec23.040的9.2.3.1)
display_type
显示类型,具体值请参考smsal_display_type_enum
storageType
存储类型,具体值请参考smsal_storage_enum
concat_info
长短信(ConcatenatedSMS)的Information,包括这个SMS多少个Segment,这个Segment的第几个等。
2个低字节为Referencenumber;
最高字节为该SMSSegment是第几个Segment;
第三字节为该SMS的总Segment数。
no_msg_data
SMScontent部分的字节数
msg_data[1]
新来的SMS的Content都会缓存在一个Buffer里,msg_data的是第一个Segment的Content缓存Buffer的Index。
5SampleCode
5.1注册端口
voidsample_reg_sms_port_req(U16port_num)
{
mmi_frm_sms_reg_port(
sample_reg_sms_port_rsp,
MOD_MMI,
port_num,
MMI_TRUE,
MMI_FALSE,
sample_recieve_data_sms);
}
voidsample_reg_sms_port_rsp(void*data,module_typemod,U16result)
{
if(result==MMI_FRM_SMS_OK)
{
//Registersuccess
//AddHandleCode
}
else
{
//RegisterFailed
//AddhandleCode
}
}
5.2接收数据短信
/*serial_num,表示这是接收到的第几个该端口的DataSMS,只有在注册时withoutData为FALSE时才有用*/
voidsample_recieve_data_sms(void*data,module_typemode,U16serial_num)
{
mmi_frm_sms_deliver_data_struct*inMsg=(mmi_frm_sms_deliver_data_struct*)data;U8*msg_content;
U8msg_content_len=inMsg->message_len;
if(msg_content_len>0)
{
msg_content=OslMalloc(inMsg->message_len+ENCODING_LENGTH);
if(sample_get_data_sms_content(inMsg->dest_port,msg_content)==TRUE)
{
//recievesuccess
if((inMsg->dcs==SMSAL_DEFAULT_DCS)||
(inMsg->dcs==SMSAL_UCS2_DCS))
{
//thEMSg_contentisUCS2encoding
//Addhandlecode
}
else//inMsg->dcsisSMSAL_8BIT_DCS
{
//themsg_contentis8Bitencoding
//Addhandlecode
}
}
else
{
//recievefailed
//Addhandlecode
}
}
else
{
//recievefailed
//Addhandlecode
}
}
5.3获取数据短信的文本内容
得到的msg_content编码格式与该SMS的dcs的关系如下:
如果dcs是SMSAL_DEFAULT_DCS或SMSAL_UCS2_DCS,则msg_content是UCS2编码;如果dcs是SMSAL_8BIT_DCS,则
msg_content是8Bit(Ascii)编码。
U8sample_get_data_sms_content(U16part_num,S8*msg_content)
{
mmi_frm_sms_deliver_data_struct*smsdata;
U8index;
smsdata=OslMalloc(sizeof(mmi_frm_sms_deliver_data_struct));
index=mmi_frm_sms_get_data_index(MOD_MMI,part_num,0);
while(index!=MMI_FRM_SMS_INVALID_NUM)
{
if(mmi_frm_sms_check_data_complete(index))
{
break;
}
index++;
index=mmi_frm_sms_get_data_index(MOD_MMI,part_num,index);
}
if(index!=MMI_FRM_SMS_INVALID_NUM)
{
mmi_frm_sms_get_data(index,smsdata,msg_content);
mmi_frm_sms_free_data(index);
returnTRUE;
}
else
{
returnFALSE;
}
OslMfree(smsdata);
}