11.M 601 networkの使用

12618 ワード

1 network API
1.1使用法
GPRS PDP contextプログラミングプロセスは以下の通りである:ステップ1:PDPコールバック関数を登録する.呼び出しZYF_GprsRegister関数はGPRSのコールバック関数を登録する.ステップ2:PDP contextを設定します.呼び出しZYF_GprsConfig関数はGPRS PDP contextを構成し、APN名、ユーザー名、パスワードを含む.手順3:PDPをアクティブにします.呼び出しZYF_GprsActivate関数はGPRS PDP contextをアクティブにします.アクティブ化結果は通常コールバック関数Callback_GPRS_Activedには通知メッセージがあり、クエリーを同期することもできます.PDPの最大活性化は約180 sであった.ステップ4:PDPが正常にアクティブ化されたかどうかを問い合わせる.呼び出しZYF_GprsGetStatusはPDPのアクティブ化状態を問い合せます.ステップ5:ローカルIPアドレスを取得する.呼び出しZYF_GprsGetLocalIPAddressローカルIPアドレスを取得します.GPRS_ACTIVATEDはアクティブ化に成功したことを示している.ステップ6:PDP非アクティブ化.呼び出しZYF_GprsDeactivateはGPRS PDP contextをオフにします.非アクティブ化結果は一般にコールバック関数CallBack_GPRS_Deactivedには通知メッセージがあり、クエリーを同期することもできます.GPRSの最大非活性化時間は約90秒である.ステップ7:PDPが正常にアクティブ化されたかどうかを問い合わせる.呼び出しZYF_GprsGetStatusはPDPのアクティブ化状態を問い合せます.GPRS_DEACTIVATEDは、非アクティブ化に成功したことを示しています.
1.2 API関数
1.2.1 ZYF_GprsRegisterこの関数はGPRSメッセージを登録するためのコールバック関数・関数プロトタイプint 32_t ZYF_GprsRegister(uint8_t contextId, ZYF_PdpCtxCb_t* callback_func);· パラメータcontextId:[入力]PDP context、0または1に設定できます.callback_func:[出力]GPRSコールバック関数インタフェースを指し、GPRSのアクティブ化、結果の非アクティブ化を通知する
・戻り値GPRS_PDP_SUCCESS:成功GPRS_PDP_INVAL:無効なパラメータGPRS_PDP_ALREADY:登録済み
1.2.2 ZYF_PdpActiveCallbackこの関数は、PDPアクティブ化結果のコールバック関数・関数プロトタイプvoid(*ZYF_PdpActiveCallback)(uint 8_t contextId,int 32_t errCode);パラメータcontextId:PDP context IDと呼び出しZYF_GprsActivateは同じものを使用し、0または1 errCode:GPRSアクティブ化結果、GPRS_PDP_SUCCESSはアクティブ化に成功したことを示し、そうでなければ失敗した.・戻り値NONE
1.2.3 ZYF_PdpDeactiveCallbackこの関数はPDP非アクティブ化結果のコールバック関数・関数プロトタイプvoid(*ZYF_PdpDeactiveCallback)(uint 8_t contextId,int 32_t errCode);パラメータcontextId:PDP context IDと呼び出しZYF_GprsActivateは同じものを使用しており、0または1 errCode:GPRSに設定して結果を非アクティブ化することができます.・戻り値NONE
1.2.4 ZYF_GprsConfigこの関数はAPNパラメータを構成するために使用されます.APNパラメータには、APN名、パスワード、認証方式(PAP/CHAP)が含まれます.
・関数プロトタイプint 32_t ZYF_GprsConfig(uint8_t contextId, ZYF_PdpCfg_t* cfg); typedef struct { uint8_t apnName[MAX_GPRS_APN_LEN]; uint8_t apnUserId[MAX_GPRS_USER_NAME_LEN]; uint8_t apnPasswd[MAX_GPRS_PASSWORD_LEN]; uint8_t PdpType; uint8_t authtype;//pap or chap void* Reserved1;//Qos void* Reserved2;//} ZYF_PdpCfg_t;· パラメータcontextId:PDP context IDと呼び出しZYF_GprsActivateは同じものを使用し、0または1 cfg:APNパラメータ構造体ポインタapnName:APN名apnUserId:ユーザ名apnPasswd:パスワードauthtype:認証方式PAPまたはCHAP・戻り値GPRS_PDP_SUCCESS:成功GPRS_PDP_ERROR:パラメータエラー
1.2.5 ZYF_GprsActivateというインタフェース関数は、PDP contextをアクティブにするために使用されます.アクティブ化には、現在のネットワークの状況に応じて、最大約150秒の時間がかかります.アクティブ化に成功したか失敗したかはZYF_PdpActiveCallbackコールバック関数に通知メッセージがあります.・関数プロトタイプint 32_t ZYF_GprsActivate(uint8_t contextId);· パラメータcontextId:PDP context IDと呼び出しZYF_GprsActivateは同じものを使用し、0または1・戻り値GPRS_に設定可能PDP_SUCCESS:成功GPRS_PDP_ALREADY:アクティブ化中または既にGPRSがアクティブ化されているPDP_ERROR:アクティブ化に失敗しました
1.2.6 ZYF_GprsGetStatusこの関数はPDPのアクティブ状態・関数プロトタイプint 32_を問い合わせるために使用されます.t ZYF_GprsGetStatus(uint8_t contextId, int32_t *pdp_status);· パラメータcontextId:PDP context IDと呼び出しZYF_GprsActivateは同じものを使用し、0または1 pdp_に設定できます.status:GPRS_ACTIVATED表示アクティブ、GPRS_DEACTIVATEDは、非アクティブ・戻り値GPRSを示すPDP_SUCCESS:成功GPRS_PDP_ERROR:エラー、GPRS登録やAPNパラメータの設定など
1.2.7 ZYF_GprsDeactivatePDPこの関数は、PDP contextをアクティブにするために使用されます.アクティブにするには、現在のネットワークの状況に応じて、最大約90秒かかります.アクティブ化に成功しても失敗してもZYF_PdpDeactiveCallbackコールバック関数に通知メッセージがあります.・関数プロトタイプint 32_t ZYF_GprsGetStatus(uint8_t contextId, int32_t *pdp_status);· パラメータcontextId:PDP context IDと呼び出しZYF_GprsActivateは同じものを使用し、0または1 pdp_に設定できます.status:GPRS_ACTIVATED表示アクティブ、GPRS_DEACTIVATEDは、非アクティブ・戻り値PRS_を示すPDP_SUCCESS:成功GPRS_PDP_ERROR:無効なパラメータGPRS_PDP_ERROR:アクティブ化に失敗しました
1.2.8 ZYF_GprsGetLocalIPAddressこの関数は、ネイティブ・アドレスのクエリーに使用されます.
・関数プロトタイプint 32_t ZYF_GprsGetLocalIPAddress(uint8_t contextId, uint8_t *ipAddr);· パラメータcontextId:PDP context IDと呼び出しZYF_GprsActivateは同じものを使用しており、0または1に設定可能:ローカルIPアドレス(IPv 4タイプ)を格納する配列ポインタ・戻り値GPRS_PDP_SUCCESS:成功GPRS_PDP_ERROR:エラー
2 networkルーチンの説明
この章では、SDKでのappの使用方法について説明します.network.c. コンパイル方法:.examplesbuild対応する.batファイルをダブルクリックして実行または開くとコンパイルできます.生成ファイル:.out対応ディレクトリhexM 601_example_**.pac
インスタンスでZYF_を先に通過RIL_NetworkInit()は、ATコマンドを送信してネットワーク接続の基本パラメータを設定し、ZYF_NetworkThread()のZYF_NetworkActiveReq()はGPRSのパラメータ構成を行う.ZYFでNetworkActiveReq()には、GPRS登録時に使用する関数の一部が用いられており、具体的には上記のAPI紹介部分を参照してください.
#include 
#include 
#include 

#include "ril_network.h"
#include "zyf_error.h"
#include "zyf_trace.h"
#include "zyf_gprs.h"
#include "zyf_thread.h"
#include "zyf_atclient.h"
#include "zyf_system.h"
#include "app_network.h"


/* network */
static ZYF_NwStat_t s_tNwState;

extern void ZYF_PdpActiveCnf(uint8_t contextId, int32_t errCode);
extern void ZYF_PdpDeactiveCnf(uint8_t contextId, int32_t errCode);

static ZYF_PdpCtxCb_t s_tPdpCb = {
    .ZYF_PdpActiveCallback = ZYF_PdpActiveCnf,
    .ZYF_PdpDeactiveCallback = ZYF_PdpDeactiveCnf,
};


#define NW_GET_SIMCARD_STATE    0
#define NW_GET_GSM_STATE        1
#define NW_GET_GPRS_STATE       2
#define NW_GET_CSQ_VALUE        3
#define NW_PDP_CFG              4
#define NW_PDP_ACTIVE           5
#define NW_PDP_WAIT_ACTIVE      6
#define NW_PDP_GET_IPADDR       7

#define NW_RET_ON_GOING         0
#define NW_RET_ERR              1
#define NW_RET_PDP_ACTIVE       2

int ZYF_NetworkActiveAuto(ZYF_NwStat_t *ptNwStat, uint8_t chCtxId)
{ 
    ZYF_PdpCfg_t tPdpCtx;
    uint8_t ipAddr[4] = {0};
    int32_t nStatus;
    int32_t nRet = -1;

    if (chCtxId <= 0) {
        return GPRS_PDP_ERROR;
    }

    switch (ptNwStat->chState) {
        case NW_GET_SIMCARD_STATE:
            nRet = ZYF_IsSimValid();
            if (!nRet) {
                ZYF_LOG("get sim card statuts ok! => %d", ptNwStat->chSimStat);
                ptNwStat->chTimeOut = 0;
                ptNwStat->chState = NW_GET_GSM_STATE;
            } else {
                ZYF_LOG("failed to get SIM status!");
                ZYF_ThreadSleep(2000);
            }
            break;
            
        case NW_GET_GSM_STATE:
            nRet = ZYF_GetCregStatus(&ptNwStat->chGsmReg);
            //nRet = ZYF_RIL_GetCregStatus(&ptNwStat->chGsmReg);
            if (ZYF_RET_OK == nRet && GSM_REG_HOME_NW == ptNwStat->chGsmReg) {
                ZYF_LOG("get gsm status ok! => %d", ptNwStat->chGsmReg);
                ptNwStat->chTimeOut = 0;
                ptNwStat->chState = NW_GET_GPRS_STATE;
            } else {
                if (++ ptNwStat->chTimeOut >= 10) {
                    ptNwStat->chTimeOut = 0;
                    ptNwStat->chState = NW_GET_SIMCARD_STATE;
                    ZYF_LOG("failed to get GSM status!");
                }
            }
            break;

        case NW_GET_GPRS_STATE:
            nRet = ZYF_GetCgregStatus(&ptNwStat->chGprsReg, ptNwStat->chPlmn, &ptNwStat->hwLac, &ptNwStat->hwCellId);
            //nRet = ZYF_RIL_GetCgregStatus(&ptNwStat->chGprsReg, &ptNwStat->chPlmn, &ptNwStat->hwLac, &ptNwStat->hwCellId);
            if (ZYF_RET_OK == nRet && GPRS_REG_HOME_NW == ptNwStat->chGprsReg) {
                ZYF_LOG("get gprs status ok! => %d", ptNwStat->chGprsReg);
                ptNwStat->chTimeOut = 0;
                ptNwStat->chState = NW_GET_CSQ_VALUE;
            } else {
                if (++ ptNwStat->chTimeOut >= 10) {
                    ptNwStat->chTimeOut = 0;
                    ptNwStat->chState = NW_GET_SIMCARD_STATE;
                    ZYF_LOG("failed to get GPRS status!");
                }
            }
            break;
            
        case NW_GET_CSQ_VALUE:
            nRet = ZYF_GetCsqValue((uint8_t *)&ptNwStat->chSigLvl);
            //nRet = ZYF_RIL_GetCsqValue((uint8_t *)&ptNwStat->chSigLvl);
            if (ZYF_RET_OK == nRet && (ptNwStat->chSigLvl >= 6 && ptNwStat->chSigLvl <= 31)) {
                ZYF_LOG("get signal quality ok! => %d", ptNwStat->chSigLvl);
                ptNwStat->chTimeOut = 0;
                ptNwStat->chState = NW_PDP_CFG;
            } else {
                if (++ ptNwStat->chTimeOut >= 10) {
                    ptNwStat->chTimeOut = 0;
                    ptNwStat->chState = NW_GET_SIMCARD_STATE;
                    ZYF_LOG("failed to signal quality!");
                }
            }
            break;
            
        case NW_PDP_CFG: 
            if ((GPRS_PDP_SUCCESS == ZYF_GprsGetStatus(chCtxId, &nStatus)) && 
                (GPRS_ACTIVATED == nStatus)) {
                if (ptNwStat->bIsActived) {
                    if (++ ptNwStat->chTimeOut >= 600) {
                        ptNwStat->chTimeOut = 0;
                        ptNwStat->chState = NW_GET_GPRS_STATE;
                    } else {
                        break;
                    }
                } else {
                    ptNwStat->chState = NW_GET_SIMCARD_STATE;
                }
                return NW_RET_PDP_ACTIVE;
            }

            ptNwStat->bIsActived = false;
        
            ZYF_GprsRegister(chCtxId, &s_tPdpCb);
            //ZYF_RIL_GprsRegister(chCtxId, &s_tPdpCb);
            memset((void *)&tPdpCtx, 0, sizeof(ZYF_PdpCfg_t));
            strcpy((void *)tPdpCtx.apnName, "CMNET");
            tPdpCtx.PdpType = GPRS_PDP_TYPE_IP;
            tPdpCtx.authtype = 1;
            nRet = ZYF_GprsConfig(chCtxId, &tPdpCtx);
            //nRet = ZYF_RIL_GprsConfig(chCtxId, &tPdpCtx);
            if (GPRS_PDP_SUCCESS == nRet) {
                ptNwStat->chTimeOut = 0;
                ptNwStat->chState = NW_PDP_ACTIVE;
            } else {
                if (++ ptNwStat->chTimeOut >= 10) {
                    ptNwStat->chTimeOut = 0;
                    ptNwStat->chState = NW_GET_SIMCARD_STATE;
                }
            }
            break;

        case NW_PDP_ACTIVE: 
            nRet = ZYF_GprsActivate(chCtxId);
            //nRet = ZYF_RIL_GprsActivate(chCtxId);
            if (GPRS_PDP_SUCCESS == nRet) {
                ptNwStat->chTimeOut = 0;
                ptNwStat->chState = NW_PDP_WAIT_ACTIVE;
            } else {
                if (++ ptNwStat->chTimeOut >= 120) {
                    ptNwStat->chTimeOut = 0;
                    ptNwStat->chState = NW_GET_SIMCARD_STATE;
                }
            }
            break;
            
        case NW_PDP_WAIT_ACTIVE:
            nRet = ZYF_GprsGetStatus(chCtxId, &nStatus);
            if (GPRS_PDP_SUCCESS == nRet && GPRS_ACTIVATED == nStatus) {
                ptNwStat->bIsActived = true;
                nRet = ZYF_GprsGetLocalIPAddress(chCtxId, &ipAddr[0]);
                if (GPRS_PDP_SUCCESS == nRet) {
                    ptNwStat->chTimeOut = 0;
                    if (ptNwStat->bIsActived) {
                        ptNwStat->chState = NW_GET_GPRS_STATE;
                    } else {
                        ptNwStat->chState = NW_GET_SIMCARD_STATE;
                    }
                    return NW_RET_PDP_ACTIVE;
                }
            }  else {
                if (++ ptNwStat->chTimeOut >= 10) {
                    ptNwStat->chTimeOut = 0;
                    ptNwStat->chState = NW_GET_SIMCARD_STATE;
                }
            } 
            break;
    }
    
    return NW_RET_ON_GOING;
}

static void ZYF_NetworkActiveReq(uint8_t chCtxId, bool bAuto)
{
    ZYF_NwStat_t *ptNwStat = &s_tNwState;
    ZYF_PdpCfg_t tPdpCtx;
    
    if (bAuto) {
        ZYF_NetworkActiveAuto(ptNwStat, chCtxId);
    } else {
        ptNwStat->chState = NW_GET_SIMCARD_STATE;
        ptNwStat->chTimeOut = 0;
            
        ZYF_GprsRegister(chCtxId, &s_tPdpCb);
        memset((void *)&tPdpCtx, 0, sizeof(ZYF_PdpCfg_t));
        strcpy((void *)tPdpCtx.apnName, "CMNET");
        tPdpCtx.PdpType = GPRS_PDP_TYPE_IP;
        ZYF_GprsConfig(chCtxId, &tPdpCtx);
        ZYF_GprsActivate(chCtxId);
    }
}

static void ZYF_NetworkThread(void *pvParam)
{
    ZYF_LOG("thread enter!");
    
    while (1) {
        ZYF_NetworkActiveReq(1, true);
        ZYF_ThreadSleep(500);
    }
}

void ZYF_NetworkInit(void)
{
    ZYF_RIL_NetworkInit();
  
    memset((void *)&s_tNwState, 0, sizeof(ZYF_NwStat_t));
    s_tNwState.chState = NW_GET_SIMCARD_STATE;
    
    ZYF_ThreadCreate("ZYF_NetworkThread", ZYF_NetworkThread, NULL, ZYF_PRIORITY_NORMAL, 1024 * 16);
}