1つのネットワークAPI
1.1使用法
GPRS PDPコンテキストプログラミングプロセスは次のとおりです。
手順1:PDPコールバック関数を登録します。ZYF_GprsRegister関数を呼び出して、GPRSのコールバック関数を登録します。
ステップ2:PDPコンテキストを設定します。ZYF_GprsConfig関数を呼び出して、APRS名、ユーザー名、パスワードを含むGPRS PDPコンテキストを構成します。
ステップ3:PDPをアクティブ化します。ZYF_GprsActivate関数を呼び出して、GPRS PDPコンテキストをアクティブにします。アクティベーションの結果は通常、コールバック関数Callback_GPRS_Activedに通知メッセージがあり、同期的にクエリすることもできます。PDPの最大アクティベーションは約180秒です。
手順4:PDPが正常にアクティブ化されているかどうかを確認します。ZYF_GprsGetStatusを呼び出して、PDPアクティベーションステータスを問い合わせます。
手順5:ローカルIPアドレスを取得します。ZYF_GprsGetLocalIPAddressを呼び出して、ローカルIPアドレスを取得します。GPRS_ACTIVATEDは、アクティブ化が成功したことを意味します。
ステップ6:PDP非アクティブ化。ZYF_GprsDeactivateを呼び出して、GPRS PDPコンテキストを閉じます。非アクティブ化の結果は通常、コールバック関数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コンテキスト。0または1に設定できます。
callback_func:[output]は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コンテキスト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コンテキストID。これは、ZYF_GprsActivateの呼び出しに使用されるものと同じで、次のように設定できます0または1
errCode:GPRS非アクティブ化の結果。
・戻り値
NONE
1.2.4 ZYF_GprsConfig
この関数は、APNパラメータを設定するために使用されます。APNパラメータには、APN名、パスワード、認証方法(PAP / CHAP)が含まれます
関数プロトタイプ
ZYF_GprsConfig int32_t(uint8_t CONTEXTID、ZYF_PdpCfg_t * CFG);
typedefは構造体{ apnName [MAX_GPRS_APN_LEN] uint8_t; uint8_t apnUserId [MAX_GPRS_USER_NAME_LEN]; uint8_t apnUserId [MAX_GPRS_USER_NAME_LEN]; uint8_t GPRS_USER_NAME_LEN ]; uint8_t GPRS_USER_NAME_LEN ]; GPRS_USER_t8 uint8_t; uint8_t 。 // Qos void * Reserved2; // } ZYF_PdpCfg_t; ・パラメータ contextId:PDPコンテキスト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コンテキストをアクティブ化するために使用されます。アクティブ化プロセスには、現在のネットワーク状況にもよりますが、最大で約150秒かかります。ZYF_PdpActiveCallbackコールバック関数には、アクティブ化または失敗の通知メッセージがあります。
・関数プロトタイプ
int32_t ZYF_GprsActivate(uint8_t contextId);
・パラメータ
contextId:PDPコンテキスト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コンテキストID。
pdp_status:GPRS_ACTIVATEDはアクティブ化されたことを意味し、GPRS_DEACTIVATEDは非アクティブ化されたことを意味し
ます・戻り値
GPRS_PDP_SUCCESS:成功
GPRS_PDP_ERROR:エラー、GPRSの登録およびAPNパラメータの設定など。
1.2.7 ZYF_GprsDeactivatePDP
この関数は、PDPコンテキストを非アクティブ化するために使用され、非アクティブ化プロセスには、現在のネットワーク状況にもよりますが、最大で約90秒かかります。ZYF_PdpDeactiveCallbackコールバック関数には、非アクティブ化の成功または失敗に関する通知メッセージがあります。
*関数プロトタイプ
(* pdp_status int32_t CONTEXTID uint8_t)ZYF_GprsGetStatus int32_t;
・パラメータは
CONTEXTID:PDPコンテキストID、コールが0または1に設定することができ、同様に使用ZYF_GprsActivateと
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:ZYF_GprsActivateの呼び出しに使用されるものと同じPDPコンテキストIDは、0または1に設定できます
。ipAddr:ローカルIPアドレス(IPv4タイプ)を格納する配列へのポイントポインタ
・戻り値
GPRS_PDP_SUCCESS:成功
GPRS_PDP_ERROR:エラー
2ネットワークルーチンの概要
この章では、主にSDKでapp_network.cを使用する方法を紹介します。
コンパイル方法:。\ examples \ build \は、ダブルクリックして実行するか、ファイルを開いてコンパイルすると、.batファイルに対応します。
生成されたファイル:。\ out \ corresponding directory \ hex \ M601_example _ **。pac
ルーチンでは、まずATコマンドを送信してZYF_RIL_NetworkInit()を介してネットワーク接続の基本パラメーターを構成し、次にZYF_NetworkThread()のZYF_NetworkActiveReq()を介してGPRSパラメーターを構成します。GPRS登録中に使用する必要があるいくつかの関数は、ZYF_NetworkActiveReq()で使用されます。詳細については、上記の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);
}