MTK Http Socket GPRS以及解析器和下载器概述

本文介绍了MTK手机App连接网络的步骤,包括GPRS网络注册、Socket API接口、HTTP功能及封装的Parser和Downloader。GPRS模块负责网络注册,Socket接口用于数据传输,HTTP模块实现HTTP协议的GET和POST操作,同时提供了Parser和Downloader来解析数据和下载文件。调试功能和配置选项也进行了概述。
摘要由CSDN通过智能技术生成

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 )
    {
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值