MTK App网络应用介绍
MTK手机App开发过去开发总是使用while循环嵌套来获取数据,而现在我们使用消息机制来完成Socket上网。本篇博客借手机里的天气应用来系统介绍MTK手机App连接上网所需要经历的步骤。
MTK App网络开发步骤
GPRS网络注册模块
GPRS负责为Socket联网进行网络注册,这一部分负责和手机的apn交互,为Socket联网拿到account_id。
mtk_network_gprs.h
#ifndef _MTK_NETWORK_GPRS_H_
#define _MTK_NETWORK_GPRS_H_
#include "mtk_network_def.h"
extern void mtk_network_gprs_reg( E_MTK_NETWORK_MODE net_mode );
extern void mtk_network_gprs_dereg( void );
#endif
mtk_network_gprs.c
#if defined (__MTK_NETWORK_SUPPORT__)
#include "mtk_network_config.h"
#include "mtk_network_socket.h"
#include "mtk_network_debug.h"
#include "mtk_network_gprs.h"
#include "mtk_network_def.h"
#include "kal_release.h"
#include "kal_trace.h"
#include "kal_debug.h"
#include "cbm_api.h"
#include "cbm_consts.h"
/**** Data Acccount related *****/
#include "DtcntSrvGprot.h"
#include "DtcntSrvIprot.h"
#include "DataAccountGProt.h"
/**** Data Account End *****/
#include "NwUsabSrvGprot.h"
#include "MMIDataType.h"
extern S_MTK_NETWORK_NW_STAT nw_stat;
extern S_MTK_NETWORK_SOC_STAT soc_stat;
static kal_int32 mtk_network_2_mi( kal_int32 y )
{
if( y <= 0 )
{
return 1;
}
return 2 * mtk_network_2_mi( y - 1 );
}
dtcnt_apptype_enum mtk_network_gprs_net_mode( E_MTK_NETWORK_MODE net_mode )
{
switch( net_mode )
{
case E_MTK_NETWORKMODE_NET:
if ( g_mtk_network_vm_mode == DTCNT_APPTYPE_MRE_NAME )
{
return ( 0x0800 | DTCNT_APPTYPE_SKIP_CSD );
}
else if ( g_mtk_network_vm_mode == DTCNT_APPTYPE_VRE_NAME )
{
return ( 0x0800 );
}
break;
case E_MTK_NETWORKMODE_NONE:
case E_MTK_NETWORKMODE_WAP:
case E_MTK_NETWORKMODE_AUTO:
default:
if ( g_mtk_network_vm_mode == DTCNT_APPTYPE_MRE_NAME )
{
return ( 0x0400 | DTCNT_APPTYPE_SKIP_CSD );
}
else if ( g_mtk_network_vm_mode == DTCNT_APPTYPE_VRE_NAME )
{
return ( 0x0400 );
}
break;
}
}
BOOL mtk_network_dtcnt_get_apn(U32 account_id, S8 *dest, U8 len)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
srv_dtcnt_prof_str_info_qry_struct acct_data;
extern MMI_BOOL srv_dtcnt_get_apn(U32 acc_id,
srv_dtcnt_prof_str_info_qry_struct *out_apn,
srv_dtcnt_account_enum acc_idx);
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if( !mtk_network_is_mmi_feature_open )
{
return MMI_FALSE;
}
acct_data.dest_len = len;
acct_data.dest = (S8*)dest;
return srv_dtcnt_get_apn(account_id, &acct_data, SRV_DTCNT_ACCOUNT_PRIMARY);
}
void mtk_network_gprs_reg_profile( E_MTK_NETWORK_MODE net_mode )
{
kal_uint32 account_id = 0; //输出 内部判断网络账号 out
srv_dtcnt_result_enum result;
cbm_sim_id_enum sim_id; //少一个0
dtcnt_apptype_enum netMode;
wchar_t *pApn;
kal_int32 iIndex; //(kal_int32)SRV_DTCNT_PROF_MAX_ACCOUNT_NUM;
mtk_network_debug( 2, "GPRS PROFILE REGISTER ACCOUNTID START!");
//全局变量初始化
nw_stat.nw_net_mode = (kal_int8)net_mode;
//本地变量初始化
memset(&(nw_stat.data_account_profile), 0, sizeof(srv_dtcnt_store_prof_data_struct));
nw_stat.data_account_profile.prof_type = SRV_DTCNT_BEARER_GPRS;
nw_stat.data_account_profile.prof_data = &(nw_stat.profile_gprs);
nw_stat.data_account_profile.prof_fields = SRV_DTCNT_PROF_FIELD_ALL;
memset(&(nw_stat.profile_gprs), 0, sizeof(srv_dtcnt_prof_gprs_struct));
nw_stat.profile_gprs.prof_common_header.acct_type = SRV_DTCNT_PROF_TYPE_USER_CONF;
nw_stat.profile_gprs.prof_common_header.acc_id = account_id;
netMode = mtk_network_gprs_net_mode(net_mode);
switch( net_mode )
{
case E_MTK_NETWORKMODE_NET:
pApn = L"cmnet";
nw_stat.profile_gprs.APN = (const U8 *)"cmnet";
nw_stat.profile_gprs.prof_common_header.AccountName = (const U8 *)L"USER_NET";
break;
case E_MTK_NETWORKMODE_NONE:
case E_MTK_NETWORKMODE_WAP:
case E_MTK_NETWORKMODE_AUTO:
default:
pApn = L"cmwap";
nw_stat.profile_gprs.APN = (const U8 *)"cmwap";
nw_stat.profile_gprs.prof_common_header.AccountName = (const U8 *)L"USER_WAP";
break;
}
//选择sim卡
for( sim_id = CBM_SIM_ID_SIM1; sim_id < CBM_SIM_ID_TOTAL; sim_id++ )
{
iIndex = mtk_network_2_mi( (kal_int32)sim_id );
if( srv_nw_usab_is_usable ((mmi_sim_enum)iIndex) )
{
nw_stat.nw_sim_id = ( kal_int8 )iIndex;
break;
}
}
mtk_network_debug( 2, "SIMID CHOOSE START!" );
mtk_network_debug( 2, "cbm_sim_id_enum simid = %d !", sim_id );
mtk_network_debug( 2, "mmi_sim_enum simid = %d !", nw_stat.nw_sim_id );
mtk_network_debug( 2, "sim card apn = %s !", nw_stat.profile_gprs.APN );
mtk_network_debug( 2, "SIMID CHOOSE STOP!" );
nw_stat.profile_gprs.prof_common_header.sim_info = (srv_dtcnt_sim_type_enum)(sim_id+1);
result = srv_dtcnt_store_add_prof(&(nw_stat.data_account_profile), &(account_id));//
if(result == SRV_DTCNT_RESULT_STORE_FULL)
{
mtk_network_debug( 2, "GPRS PROFILE REGISTER ACCOUNTID ADD RESULT FULL THEN QRY!" );
iIndex = (kal_int32)SRV_DTCNT_PROF_MAX_ACCOUNT_NUM;
memset(&(nw_stat.qry_prof), 0, sizeof(srv_dtcnt_store_prof_data_struct));
nw_stat.qry_prof.prof_type = SRV_DTCNT_BEARER_GPRS;
nw_stat.qry_prof.prof_data = &(nw_stat.prof_gprs);
nw_stat.qry_prof.prof_fields = SRV_DTCNT_PROF_FIELD_ALL;
while(iIndex--)
{
if(srv_dtcnt_acct_is_read_only(iIndex))
{
mtk_network_debug( 2, "count %d account is read only continue !", iIndex );
continue;
}
memset(&(nw_stat.prof_gprs), 0, sizeof(srv_dtcnt_prof_gprs_struct));
result = srv_dtcnt_store_qry_prof(iIndex, &(nw_stat.qry_prof));
if(result == SRV_DTCNT_RESULT_SUCCESS)
{
mtk_network_debug( 2, "GPRS PROFILE REGISTER ACCOUNTID QRY RESULT SUCCESS !" );
nw_stat.data_account_profile.prof_fields = SRV_DTCNT_PROF_FIELD_ALL;
result = srv_dtcnt_store_update_prof(iIndex, &(nw_stat.data_account_profile));
if(result == SRV_DTCNT_RESULT_SUCCESS)
{
nw_stat.profile_id = iIndex;
nw_stat.nw_account_id = cbm_encode_data_account_id(iIndex, sim_id, 1, KAL_FALSE);
nw_stat.account_status = 1;
mtk_network_debug( 2, "profile account index = %d !", iIndex);
mtk_network_debug( 2, "account id = %d !", nw_stat.nw_account_id);
mtk_network_debug( 2, "GPRS PROFILE REGISTER ACCOUNTID STOP!");
mtk_network_commit_status(E_MTK_NETWORK_GPRS_SUCCESS);
return;//SUCCESS
}
}
}
mtk_network_debug( 2, "GPRS PROFILE REGISTER ACCOUNTID ADD RESULT FAIL THEN RETURN!" );
//return;//FAIL
}
else if (result == SRV_DTCNT_RESULT_SUCCESS)
{
mtk_network_debug( 2, "GPRS PROFILE REGISTER ACCOUNTID ADD RESULT SUCCESS!" );
nw_stat.profile_id = account_id;
nw_stat.nw_account_id = cbm_encode_data_account_id(account_id, sim_id, 1, KAL_FALSE);
nw_stat.account_status = 1;
mtk_network_debug( 2, "profile account index = %d !", account_id );
mtk_network_debug( 2, "account id = %d !", nw_stat.nw_account_id);
mtk_network_debug( 2, "GPRS PROFILE REGISTER ACCOUNTID STOP!");
mtk_network_commit_status(E_MTK_NETWORK_GPRS_SUCCESS);
return;//SUCCESS
}
mtk_network_commit_status ( E_MTK_NETWORK_GPRS_FAIL );
return;//DEFAULT FAIL
}
void mtk_network_gprs_reg( E_MTK_NETWORK_MODE net_mode )
{
kal_int32 iIndex;
kal_int32 acc_id;
wchar_t apn_name[100];
wchar_t *pApn = NULL;
wchar_t *pApn_l = NULL;
kal_int8 plmn[6+1];
CHAR tmp[20];
cbm_app_info_struct app_info;
cbm_sim_id_enum sim_id;//少一个0
dtcnt_apptype_enum netMode;
extern S32 mmi_wcsnicmp(const WCHAR *str_src, const WCHAR *str_dst, U32 count );
extern MMI_BOOL srv_sim_ctrl_get_home_plmn(mmi_sim_enum sim, CHAR *out_plmn_buffer, U32 buffer_size);
nw_stat.nw_net_mode = (kal_int8)net_mode;
netMode = mtk_network_gprs_net_mode(net_mode);
switch( net_mode )
{
case E_MTK_NETWORKMODE_NET:
pApn = L"cmnet";
pApn_l = L"uninet";
break;
case E_MTK_NETWORKMODE_NONE:
case E_MTK_NETWORKMODE_WAP:
case E_MTK_NETWORKMODE_AUTO:
default:
pApn = L"cmwap";
pApn_l = L"uniwap";
break;
}
#ifdef WIN32
if( !mtk_network_is_tcpip_open )
{
mtk_network_debug( 2, "GPRS TCPIP IS CLOSED!" );
mtk_network_commit_status ( E_MTK_NETWORK_GPRS_FAIL );
return;
}
nw_stat.account_status = cbm_get_valid_account_id( CBM_GPRS,
&(nw_stat.nw_account_id) );
mtk_network_debug( 2, "GPRS REGISTER ACCOUNTID START!" );
mtk_network_debug( 2, "account id = %d!", nw_stat.nw_account_id );
mtk_network_debug( 2, "GPRS REGISTER ACCOUNTID STOP!");
if( nw_stat.account_status == CBM_ERROR )
{
mtk_network_commit_status ( E_MTK_NETWORK_GPRS_FAIL );
return;
}
mtk_network_commit_status(E_MTK_NETWORK_GPRS_SUCCESS);
nw_stat.account_status = 1;
return;
#endif
mtk_network_debug( 2, "GPRS REGISTER ACCOUNTID START!");
for( sim_id = CBM_SIM_ID_SIM1; sim_id < CBM_SIM_ID_TOTAL; sim_id++ )
{
iIndex = mtk_network_2_mi( (kal_int32)sim_id );
if( srv_nw_usab_is_usable ((mmi_sim_enum)iIndex) )
{
nw_stat.nw_sim_id = ( kal_int8 )iIndex;
break;
}
}
mtk_network_debug( 2, "cbm_sim_id_enum simid = %d !", sim_id );
mtk_network_debug( 2, "mmi_sim_enum simid = %d !", nw_stat.nw_sim_id );
if ( MMI_TRUE == srv_sim_ctrl_get_home_plmn(
(mmi_sim_enum)( nw_stat.nw_sim_id ), ( CHAR * )plmn, sizeof( plmn ) ) )
{
mtk_network_debug( 2, "home plmn = %s !", plmn );
}
else
{
mtk_network_debug( 2, "PLMN BAD THEN RETURN!" );
mtk_network_commit_status ( E_MTK_NETWORK_GPRS_FAIL );
return;
}
memset( &app_info, 0, sizeof(app_info) );
app_info.app_icon_id = 0;//GetRootTitleIcon(IMG_GLOBAL_OK);
app_info.app_str_id = 0;//STR_ID_AVK;
app_info.app_type = (kal_uint64)netMode;//DTCNT_APPTYPE_MRE_WAP;
#if defined (__TCPIP__)
if( CBM_OK == cbm_register_app_id_with_app_info(
&app_info, &( nw_stat.nw_app_id ) ) )
{
mtk_network_debug( 2, "appid = %d !", nw_stat.nw_app_id );
}
#endif
for (iIndex = 0; iIndex < SRV_DTCNT_PROF_MAX_ACCOUNT_NUM; iIndex++ )
{
memset(apn_name, 0, 20);
//获取apn
if ( MMI_FALSE == mtk_network_dtcnt_get_apn((U32)iIndex, (S8 *)apn_name, 20) )
{
mtk_network_debug( 2, "profile account index = %d, continue !", iIndex );
continue;
}
//记录apn
memset( tmp, 0, 20);
mmi_wcs_to_asc(tmp, apn_name);
mtk_network_debug( 2, "profile account index = %d, its apn = %s !", iIndex, tmp);
//获取accountid 当3611A 3611B打开平台后此处需要修改
if ( UNICOM_CMCC_PROCESS == g_mtk_network_process )
{
//(VX2232)11B数据账户不分移动联通的情况
if( memcmp(plmn, "46002", 5) == 0 || memcmp(plmn, "46000", 5) == 0 )//移动卡流程
{
if( mmi_wcsnicmp(apn_name, pApn, 6 ) == 0 )//移动流程
{
break;
}
}
else if( memcmp(plmn, "46001", 5) == 0 )//联通卡流程
{
if ( mmi_wcsnicmp(apn_name, pApn_l, 7 ) == 0 )//先联通流程
{
break;
}
else if ( mmi_wcsnicmp(apn_name, pApn, 6 ) == 0 )//后移动流程
{
break;
}
}
}
else if ( UNICOM_UNICOM_PROCESS == g_mtk_network_process )
{
//(VX2232)在10A平台正常处理数据账户,这一个分支为了防止10A的意外与下一分支分离
//关闭联通移动分离,无论11B 10A等平台均使用正常的数据账户
if( memcmp(plmn, "46002", 5) == 0 || memcmp(plmn, "46000", 5) == 0 )//移动卡流程
{
if( mmi_wcsnicmp(apn_name, pApn, 6 ) == 0 )//移动流程
{
break;
}
}
else if( memcmp(plmn, "46001", 5) == 0 )//联通卡流程
{
if ( mmi_wcsnicmp(apn_name, pApn_l, 7 ) == 0 )//联通流程
{
break;
}
}
}
}//for循环结束
if( iIndex == SRV_DTCNT_PROF_MAX_ACCOUNT_NUM )
{
//此处可以创建数据账户 不过由于各种原因最好不要创建
if( mtk_network_is_profile_create_open )
{
mtk_network_commit_status ( E_MTK_NETWORK_GPRS_WAIT );
mtk_network_debug( 2, "GPRS REGISTER ACCOUNTID STOP RESULT FULL THEN CLEATE PROFILE!" );
mtk_network_gprs_reg_profile(net_mode);
return;
}
mtk_network_debug( 2, "GPRS REGISTER ACCOUNTID STOP RESULT BADACCOUNT!" );
mtk_network_commit_status ( E_MTK_NETWORK_GPRS_FAIL );
return;
}
nw_stat.nw_account_id = cbm_encode_data_account_id(
iIndex, sim_id, nw_stat.nw_app_id, KAL_FALSE );
nw_stat.account_status = 1;
mtk_network_debug( 2, "profile account index = %d !", iIndex );
mtk_network_debug( 2, "sim card apn = %s !", tmp );
mtk_network_debug( 2, "account id = %d !", nw_stat.nw_account_id );
mtk_network_debug( 2, "GPRS REGISTER ACCOUNTID STOP!");
mtk_network_commit_status(E_MTK_NETWORK_GPRS_SUCCESS);
return;
}
void mtk_network_gprs_dereg( void )
{
if( nw_stat.nw_app_id > 0 )
{
if ( cbm_deregister_app_id( nw_stat.nw_app_id ) )
{
mtk_network_debug( 2, "DEREGISTERAPPID OK!");
}
}
if( mtk_network_is_profile_create_open )
{
if ( nw_stat.account_status == 1 )
{
if( nw_stat.profile_id > 0 )
{
srv_dtcnt_store_delete_prof( (nw_stat.profile_id), KAL_TRUE, NULL, NULL );
mtk_network_debug( 2, "GPRS DEREGISTER PROFILE OK!");
}
}
}
}
#endif
Socket联网API接口
Socket在获取到accountid之后就可以进行平时开发中的socket处理了,这里多说几句Tips,正规socket使用soc_create,soc_setsockopt,get_hostbyname,soc_connect,连接成功服务器进行soc_send、soc_recv, 最后停止持续任务进行soc_close。这里很多同事打开,收发一次数据,关闭一蹴而就,这样太浪费socket句柄资源和浪费了socket-tcp长连接的优势,那样开关使用还不如封装下UDP,只要将安全数据收发封装好,和一次性使用socket开关同样的效果,而且属于扩展能力,而不是浪费能力。Socket组件目标通过使用MTK消息机制实现Socket联网功能。而不是使用Timer。
mtk_network_socket.h
#ifndef _MTK_NETWORK_SOCKET_H_
#define _MTK_NETWORK_SOCKET_H_
#if 1 /*引用*/
#include "mtk_network_gprs.h"
#include "kal_release.h"
#include "mtk_network_config.h"
#include "mtk_network_def.h"
/**** Data Acccount related *****/
#include "DtcntSrvGprot.h"
#include "DtcntSrvIprot.h"
#include "DataAccountGProt.h"
/**Data Account End **/
#endif
#if 1 /*结构*/
//宏
#define MTK_NETWORK_MAX_SOCKADDR_LEN (28) //MAX_SOCK_ADDR_LEN
/*枚举*/
typedef enum
{
E_MTK_NETWORK_START, //0 网络启动
E_MTK_NETWORK_GPRS_REG, //1 注册网络资源
E_MTK_NETWORK_GPRS_WAIT, //2 等待网络资源
E_MTK_NETWORK_GPRS_SUCCESS, //3 网络资源注册成功
E_MTK_NETWORK_DNS_GET, //4 获取服务器IP解析
E_MTK_NETWORK_DNS_WAIT, //5 等待服务器IP解析
E_MTK_NETWORK_DNS_SUCCESS, //6 服务器IP解析成功
E_MTK_NETWORK_SOC_CREATE, //7 初始化连接
E_MTK_NETWORK_SOC_CONNECT, //8 请求服务器连接
E_MTK_NETWORK_SOC_BIDE, //9 等待服务器连接
E_MTK_NETWORK_SOC_INIT, //10 服务器连接成功,此时可发送初始化数据(手动)
E_MTK_NETWORK_SOC_SEND, //11 发送数据至服务器
E_MTK_NETWORK_SOC_RECV, //12 接收服务器数据
E_MTK_NETWORK_SOC_WAIT, //13 等待服务器空闲
E_MTK_NETWORK_SOC_BLOCK, //14 服务被占用,请等待
E_MTK_NETWORK_GPRS_FAIL, //15 注册网络资源失败
E_MTK_NETWORK_DNS_FAIL, //16 服务器IP解析失败
E_MTK_NETWORK_SOC_FAIL, //17 SOCKET失败
E_MTK_NETWORK_CONN_FAIL, //18 服务器连接失败
E_MTK_NETWORK_UPDATE_FAIL, //19 收发消息失败
E_MTK_NETWORK_STOP //20 网络停止
} E_MTK_NETWORK_STEP;
//结构体
//内部 1 SIM_INFO -> ACCOUNT_ID
typedef struct
{
kal_int8 nw_sim_moved_stat; //是否被移除
kal_int8 nw_sim_legality; //是否合法
kal_int8 nw_service_type; //服务商
kal_int8 nw_sim_id; //sim卡
kal_int8 nw_net_mode; //联网方式
kal_uint8 nw_app_id; //应用id
kal_uint32 nw_account_id; //网络账号
kal_int8 account_status;
kal_int32 profile_id; //输出 用户可以忽略
srv_dtcnt_store_prof_data_struct data_account_profile; //输出 网络账户详细配置信息
srv_dtcnt_prof_gprs_struct profile_gprs; //输出 网络账户GPRS详细配置信息
srv_dtcnt_store_prof_data_struct qry_prof; //输出 申请网络账户详细配置信息
srv_dtcnt_prof_gprs_struct prof_gprs; //输出 申请网络账户GPRS详细配置信息
}S_MTK_NETWORK_NW_STAT;
//内部 2 DNS -> SOC信息
typedef struct
{
sockaddr_struct addr; //soc addr
kal_uint16 port; //端口//IP地址 不同平台应该注意大小端问题
kal_int8 soc_id; //soc_id
E_MTK_NETWORK_STEP soc_step; //soc step
}S_MTK_NETWORK_SOC_STAT;
#endif
#if 1
/************************************************************************
* 内存控制
************************************************************************/
extern void* mtk_network_malloc( kal_int32 size );
extern void mtk_network_free( void* block );
/************************************************************************
* Timer
* Timer 控制SOC联网步骤
* 它修改网络状态变量,通知用户
************************************************************************/
//以下timer很底层,很精准,socket禁用
extern kal_timerid mtk_network_start_timer( kal_char* timer_name,
kal_uint32 count, kal_timer_func_ptr callback );
extern void mtk_network_stop_timer( kal_timerid timer_id );
/*Socket*/
//封装过来简化接口
extern kal_uint8* mtk_network_get_host_name( void );
extern E_MTK_NETWORK_STEP mtk_network_get_status( void );
extern void mtk_network_commit_status( E_MTK_NETWORK_STEP macro );
extern kal_int8 mtk_network_client_open (
const kal_char* host_name,
kal_uint16 port,
E_MTK_NETWORK_MODE net_mode
);
extern kal_int32 mtk_network_recv( kal_int8 soc_id, void* recv_buf, kal_int32 buf_len );
extern kal_int32 mtk_network_send( kal_int8 soc_id, void* send_buf,
kal_int32 send_size );
extern void mtk_network_client_close( kal_int8 soc_id );
#endif
#endif
mtk_network_socket.c
#ifdef __MTK_NETWORK_SUPPORT__
#include "mtk_network_config.h"
#include "mtk_network_gprs.h"
#include "mtk_network_socket.h"
#include "mtk_network_debug.h"
#include "mtk_network_def.h"
#include "kal_release.h"
#include "kal_trace.h"
#include "kal_debug.h"
#include "MMIDataType.h"
#include "med_utility.h"
//#include "soc_api.h"
//#include "EventsGprot.h"
S_MTK_NETWORK_NW_STAT nw_stat;
S_MTK_NETWORK_SOC_STAT soc_stat;
extern void mmi_frm_set_protocol_event_handler(U16 eventID, PsIntFuncPtr funcPtr, MMI_BOOL isMultiHandler);
extern void mmi_frm_clear_protocol_event_handler(U16 eventID, PsIntFuncPtr funcPtr);
void mtk_network_commit_status( E_MTK_NETWORK_STEP macro )
{
soc_stat.soc_step = macro;
mtk_network_proc_info( soc_stat.soc_id, macro );
}
#if 1
void* mtk_network_malloc( kal_int32 size )
{
return med_ext_smalloc( size );
}
void mtk_network_free( void* block )
{
if( block == NULL )
{
return;
}
med_ext_sfree( ( address_t )block );
}
#endif
#if 1
/************************************************************************
* Timer
* Timer 控制SOC联网步骤
* 它修改网络状态变量,通知用户
************************************************************************/
kal_timerid mtk_network_start_timer( kal_char* timer_name,
kal_uint32 count, kal_timer_func_ptr callback )
{
kal_timerid timer_id = NULL;
timer_id = kal_create_timer( timer_name );
kal_set_timer( timer_id, callback, NULL,
count, 1 );
return timer_id;
}
void mtk_network_stop_timer( kal_timerid timer_id )
{
kal_cancel_timer( timer_id );
}
E_MTK_NETWORK_STEP mtk_network_get_status( void )
{
return soc_stat.soc_step;
}
kal_uint8* mtk_network_get_host_name( void )
{
return soc_stat.addr.addr;
}
kal_uint8 mtk_network_read_write_notify_callback( void* inMsg )
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
app_soc_notify_ind_struct *soc_notify =
(app_soc_notify_ind_struct*) inMsg;
kal_int32 ret = 0;
kal_bool is_ready = KAL_FALSE;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if( soc_notify->socket_id != soc_stat.soc_id )
{