11. M601 network的使用

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 的最大激活约为 180s。
步骤 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 消息的回调函数
· 函数原型
int32_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)(uint8_t contextId, int32_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)(uint8_t contextId, int32_t errCode);
· 参数
contextId:PDP context ID,跟调用 ZYF_GprsActivate 使用的为同一个,可设置为 0 或 1
errCode:GPRS 去激活结果。
· 返回值
NONE

1.2.4 ZYF_GprsConfig
此函数用于配置 APN 参数。APN 参数包括 APN 名称,密码和授权方式(PAP/CHAP)

· 函数原型
int32_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回调函数中有通知消息。
· 函数原型
int32_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 的激活状态
· 函数原型
int32_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 回调函数中有通知消息。
· 函数原型
int32_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
此函数用于查询本机地址

· 函数原型
int32_t ZYF_GprsGetLocalIPAddress(uint8_t contextId, uint8_t *ipAddr);
· 参数
contextId:PDP context ID,跟调用 ZYF_GprsActivate 使用的为同一个,可设置为 0 或 1
ipAddr:指向存储本地 IP 地址(IPv4 类型)的数组指针
· 返回值
GPRS_PDP_SUCCESS:成功
GPRS_PDP_ERROR:错误

2 network 例程介绍

本章节主要介绍如何在 SDK 中使用 app_network.c。
编译方法:.\examples\build\对应的.bat 文件双击执行或打开就可以编译。
生成文件:.\out\对应目录\hex\M601_example_**.pac

例程中先通过 ZYF_RIL_NetworkInit()发送 AT 命令配置网络连接的基本参数,再通过ZYF_NetworkThread() 中 的 ZYF_NetworkActiveReq() 进行GPRS的参数配置 。 在ZYF_NetworkActiveReq()中用到了关于 GPRS 注册时需要使用的部分函数,具体可以参考上面的 API 介绍部分。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#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);
}

猜你喜欢

转载自blog.csdn.net/w_hizyf_m/article/details/107226598