MTK两个常用函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、域名解析
对于网络编程而言,硬编码IP到客户端,定是下下策,为此,我们需要域名解析功能。MTK 对此有类似的解决之道,即soc_gethostbyname,下面将它的用法简单叙述如下
soc_gethostbyname( kal_bool is_blocking,//是否为阻塞式调用,手机平台一般不会支持阻塞式调用的
module_type mod_id, //调用该函数的模块id,也即将来接收消息的模块
kal_int32 request_id,//用于区分是那个请求之用,我们自定义的id值,标示不同的应用
const kal_char *domain_name,//域名
kal_uint8 *addr,//ipv4的ip地址,将来也许会有ipv6的
kal_uint8 *addr_len,//数据长度
kal_uint8 access_id,//这个访问控制id,我没有使用给它赋值为0好了
kal_uint32 nwk_account_id //手机gprs帐户id,做过手机的人自然会明白
)//
补充,调用这个函数不需要建立socket,而且是我们建立tcp/ip连接之前,必须完成一个必备步骤
实例代码如下:
typedef void (* mf_funcOnGetHostByName)(mf_u32 hAddr,mf_u32 nAddr);
static mf_funcOnGetHostByName mf_dnsFunc = NULL;
#define MF_DNS_APPID 1
static void MF_dns_event(void * inMsg)
{
app_soc_get_host_by_name_ind_struct *dns_ind;
if( inMsg )
{
dns_ind = (app_soc_get_host_by_name_ind_struct*) inMsg;
if (dns_ind->result == KAL_TRUE)
{
mf_u32 ipAddr = 0;
switch (dns_ind->request_id)
{
case MF_DNS_APPID:
ClearProtocolEventHandler(MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", dns_ind->addr[0], dns_ind->addr[1], dns_ind->addr[2], dns_ind->addr[3]);
MF_memcpy(&ipAddr, dns_ind->addr,dns_ind->addr_len);
if( mf_dnsFunc )
mf_dnsFunc(MF_ntohl((mf_u32)ipAddr),ipAddr);
mf_dnsFunc = NULL;
break;
}
}
}
else if( mf_dnsFunc )
{
mf_dnsFunc(0,0);
}
}
mf_bool MF_getHostByName(mf_s8 * server_domain,mf_u32 * hAddr,mf_u32 * nAddr, mf_funcOnGetHostByName func)
{
kal_int8 ret = MF_FALSE;
static kal_uint8 addr_len=0;
kal_uint32 nwk_account_id = mf_skt_account;
static kal_int16 sDNSHandle = MF_DNS_APPID;
static kal_uint32 ipAddr;
mf_dnsFunc = func;
ret = soc_gethostbyname(KAL_FALSE,
MOD_MMI,
(kal_int32)sDNSHandle,
(const kal_char *)server_domain,
(kal_uint8*)&ipAddr,
(kal_uint8*)&addr_len,
(kal_uint8)0,
nwk_account_id);
if (ret == SOC_SUCCESS)
{
kal_uint8 *ptr;
ptr = (kal_uint8*)&ipAddr;
kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", ptr[0], ptr[1], ptr[2], ptr[3]);
if(hAddr)
*hAddr = MF_ntohl((mf_u32)ipAddr);
if(nAddr)
*nAddr = (mf_u32)ipAddr;
return MF_TRUE;
}
else if(ret == SOC_WOULDBLOCK)
{
SetProtocolEventHandler(MF_dns_event, MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
}
kal_prompt_trace(MOD_ENG," MF_getHostByName , ret %d", ret);
return ret;
}
2、定制窗口的使用
一般我们创建mtk应用的时候,多多少少会用到Screen,而我们可以使用MTK自带的categories screen,这些封装好的函数,会完成两件重要的事情
第一是绘制我们自己创建的Screen,第二是检测该类型窗口的事件,当然MTK允许你设置一些事件的处理函数(也即钩子函数,Handler)。我们可以
在程序创建时调用EntryNewScreen,然后再调用ShowListCategoryScreen,绘制列表框窗口,并注册自己的highlight handler,当然也可,更进一步
即我们可以在这个screen上再绘制别的类型的窗口,比如ShowCategory74Screen,唯一需要注意的是,你需要把自己注册的钩子函数注销(干净的做法);
并且调用ExitListCategoryScreen(),来停止绘制列表框界面,再调用ShowCategory74Screen 开始绘制文本框。嘿嘿,这个方法很爽的。不过,有一点
需要注意,就是绘图很慢,显示下一个窗口需要延时显示,即调用ExitListCategoryScreen之后,延时一段时间后再调用ShowCategory74Screen,这样才
不会有“重影”。
补充:需要注意的是新窗口的建立撤销方法,我以实例说明,
static void MF_Scr_Exit(void)
{
MF_Exit_LastCategoriesScreen();
//if(new_scr_id == GetActiveScreenId())
// GoBackHistory();
//else
DeleteScreenIfPresent(new_scr_id);
if ( exit_func )
exit_func();
}
static void MF_Scr_Enter(void)
{
EntryNewScreen(new_scr_id, MF_Scr_Exit, MF_Scr_Enter, NULL);
if( enter_func )
enter_func();
}