# 一键拨号 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 功能概述 一键拨号功能内部集成多个网络和数据拨号接口,可一站式完成PDP Profile配置、数据拨号发起、断线自动重连等流程,旨在为用户提供一套方便快捷的数据拨号与自动重连Open API接口。 # 一键拨号API ## 头文件 *easy_datacall.h* ## 函数概览 | **函数** | **说明** | | --- | --- | | *qapp_easy_datacall()* | 启动一键拨号流程 | | *qapp_easy_datacall_reconnect_stop()* | 关闭一键拨号内置的自动重连机制 | ## 函数详解 ### qapp_easy_datacall - **功能描述** 启动一键拨号流程。此函数封装完整数据拨号流程,可根据传入的配置参数自动完成PDP上下文配置、鉴权参数配置、等待网络附着、发起数据拨号等流程,并且配置开启时附带断线自动重连逻辑。用户可通过回调函数获取拨号成功、失败、断开、重连及网络未注册等事件。 - **函数原型** ```c qapp_easy_datacall_error_e qapp_easy_datacall(qapp_easy_datacall_config_t config,qapp_easy_datacall_cb_ptr easy_datacall_cb); ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *config* | 输入 | *qapp_easy_datacall_config_t* | 一键拨号配置参数;详见 [*qapp_easy_datacall_config_t*](#qappeasydatacallconfigt) | | *easy_datacall_cb* | 输入 | *qapp_easy_datacall_cb_ptr* | 回调函数指针,拨号全流程状态变更时触发回调;详见 [*qapp_easy_datacall_cb_ptr*](#qappeasydatacallcbptr) | - **返回值说明** *QAPP_EASY_DATACALL_OK*:函数执行成功 其他值:函数执行失败;详见 [*qapp_easy_datacall_error_e*](#qappeasydatacallerrore) ```{note} 1. 此函数同时承载一键拨号与可选自动重连能力。 2. 业务不再需要自动重连时,建议调用 *qapp_easy_datacall_reconnect_stop()* 关闭自动重连机制。 3. 停止重连仅关闭重试逻辑,不会主动断开当前已建立的数据链路。 ``` #### qapp_easy_datacall_cb_ptr - **函数原型** ```c typedef void (*qapp_easy_datacall_cb_ptr)(qapp_easy_datacall_event_e event_id, void *ctx); ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *event_id* | 输入 | *qapp_easy_datacall_event_e* | 一键拨号事件标识;详见 [*qapp_easy_datacall_event_e*](#qappeasydatacallevente) | | *ctx* | 输入 | void | 业务自定义上下文 | - **返回值说明** 无 ### **qapp_easy_datacall_reconnect_stop** - **功能描述** 关闭一键拨号内置的自动重连机制。调用此函数后,系统将结束内部创建的重连定时器、消息队列、任务等运行资源,停止由 *qapp_easy_datacall()* 开启的自动重连流程,后续不会再继续执行断线重连处理。 - **函数原型** ```c qapp_easy_datacall_error_e qapp_easy_datacall_reconnect_stop(void); ``` - **参数说明** 无 - **返回值说明** *QAPP_EASY_DATACALL_OK*:函数执行成功 其他值:函数执行失败;详见 [*qapp_easy_datacall_error_e*](#qappeasydatacallerrore) ```{note} 1. 此函数仅用于停止一键拨号内置的自动重连机制,不用于主动断开已建立的数据连接。 2. 如需重新启用一键拨号流程和自动重连能力,需要重新调用 *qapp_easy_datacall()*。 3. 建议在不再需要自动重连或应用退出相关业务流程前调用此函数,避免继续占用内部资源。 ``` ## 结构体定义 ### qapp_easy_datacall_config_t 一键拨号配置参数结构体定义如下: ```c typedef struct { qapp_easy_datacall_pdp_config_t pdp_config; qapp_easy_datacall_reconnect_config_t retry_config; } qapp_easy_datacall_config_t; ``` | **参数** | **类型** | **说明** | | --- | --- | --- | | *pdp_config* | *qapp_easy_datacall_pdp_config_t* | PDP配置参数;详见 [*qapp_easy_datacall_pdp_config_t*](#qappeasydatacallpdpconfig_t) | | *retry_config* | *qapp_easy_datacall_reconnect_config_t* | 断线重连配置参数;详见 [*qapp_easy_datacall_reconnect_config_t*](#qappeasydatacallreconnectconfig_t) | ### qapp_easy_datacall_pdp_config_t PDP配置参数结构体定义如下: ```cpp typedef struct { qosa_uint8_t simid; qosa_uint8_t pdpid; qosa_datacall_conn_type_e conn_type; char apn[QOSA_APN_MAX_LEN + 1]; qosa_pdp_ip_type_e ip_type; qosa_pdp_auth_type_e auth_type; char auth_username[QOSA_PDP_USER_NAME_MAX_LEN + 1]; char auth_password[QOSA_PDP_USER_PWD_MAX_LEN + 1]; } qapp_easy_datacall_pdp_config_t; ``` | **参数** | **类型** | **说明** | | --- | --- | --- | | *simid* | qosa_uint8_t | SIM ID | | *pdpid* | qosa_uint8_t | PDP上下文ID | | *conn_type* | *qosa_datacall_conn_type_e* | 数据拨号连接类型;详见 [*qosa_datacall_conn_type_e*](#qosadatacallconntypee) | | *apn* | char | APN | | *ip_type* | *qosa_pdp_ip_type_e* | IP类型;详见 [*qosa_pdp_ip_type_e*](#qosapdpiptypee) | | *auth_type* | *qosa_pdp_auth_type_e* | 鉴权类型;详见 [*qosa_pdp_auth_type_e*](#qosapdpauthtypee) | | *auth_username* | char | 用户名 | | *auth_password* | char | 密码 | ### qapp_easy_datacall_reconnect_config_t 断线重连配置参数结构体定义如下: ```cpp typedef struct { qosa_bool_t reconnect; qosa_uint32_t reg_timeout; qosa_uint8_t datacall_reconnect_max_count; qosa_uint8_t datacall_timeout; } qapp_easy_datacall_reconnect_config_t; ``` | **参数** | **类型** | **说明** | | --- | --- | --- | | *reconnect* | qosa_bool_t | 是否开启断线重连功能
*QOSA_TRUE*:开启
*QOSA_FALSE*:关闭 | | *reg_timeout* | qosa_uint32_t | 网络注册超时时间;单位:秒 | | *datacall_reconnect_max_count* | qosa_uint8_t | 重连最大尝试次数 | | *datacall_timeout* | qosa_uint8_t | 单次拨号最大超时时间;单位:秒 | ## 枚举定义 ### qapp_easy_datacall_error_e 一键拨号功能结果码枚举定义如下: ```c typedef enum { QAPP_EASY_DATACALL_OK = 0, QAPP_EASY_DATACALL_ERR_INVALID_PARAM, QAPP_EASY_DATACALL_ERR_NETWORK_ISSUE, QAPP_EASY_DATACALL_ERR_EXECUTE_FAIL, QAPP_EASY_DATACALL_ERR_MEMORY_FAILURE, QAPP_EASY_DATACALL_ERR_REPEAT_ACT, } qapp_easy_datacall_error_e; ``` | **成员** | **说明** | | --- | --- | | *QAPP_EASY_DATACALL_OK* | 函数执行成功 | | *QAPP_EASY_DATACALL_ERR_INVALID_PARAM* | 非法参数 | | *QAPP_EASY_DATACALL_ERR_NETWORK_ISSUE* | 网络异常 | | *QAPP_EASY_DATACALL_ERR_EXECUTE_FAIL* | 函数执行失败 | | *QAPP_EASY_DATACALL_ERR_MEMORY_FAILURE* | 内存分配失败 | | *QAPP_EASY_DATACALL_ERR_REPEAT_ACT* | 重复操作 | ### qapp_easy_datacall_event_e 一键拨号事件标识枚举定义如下: ```c typedef enum { QAPP_EASY_DATACALL_SUCC = 0, QAPP_EASY_DATACALL_FAIL, QAPP_EASY_DATACALL_DISCONNECT, QAPP_EASY_DATACALL_RECONNECT, QAPP_EASY_DATACALL_NETWORK_NOT_REG, } qapp_easy_datacall_event_e; ``` | **成员** | **说明** | | --- | --- | | *QAPP_EASY_DATACALL_SUCC* | 数据拨号成功 | | *QAPP_EASY_DATACALL_FAIL* | 数据拨号失败 | | *QAPP_EASY_DATACALL_DISCONNECT* | 连接断开 | | *QAPP_EASY_DATACALL_RECONNECT* | 断线重连 | | *QAPP_EASY_DATACALL_NETWORK_NOT_REG* | 网络未注册 | ### qosa_datacall_conn_type_e 数据拨号连接类型枚举定义如下: ```java typedef enum { QOSA_DATACALL_CONN_USBNET = 1, QOSA_DATACALL_CONN_PPP, QOSA_DATACALL_CONN_TCPIP, QOSA_DATACALL_CONN_UNDEFINED, QOSA_DATACALL_CONN_MAX, } qosa_datacall_conn_type_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_DATACALL_CONN_USBNET* | USBNET | | *QOSA_DATACALL_CONN_PPP* | PPP | | *QOSA_DATACALL_CONN_TCPIP* | TCP/IP | | *QOSA_DATACALL_CONN_UNDEFINED* | 未定义 | | *QOSA_DATACALL_CONN_MAX* | 最大连接类型数量 | ### qosa_pdp_ip_type_e IP类型枚举定义如下: ```cpp typedef enum { QOSA_PDP_INVALID = 0, QOSA_PDP_IPV4 = 1, QOSA_PDP_IPV6 = 2, QOSA_PDP_IPV4V6 = 3 } qosa_pdp_ip_type_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_PDP_INVALID* | 无效IP类型 | | *QOSA_PDP_IPV4* | IPv4 | | *QOSA_PDP_IPV6* | IPv6 | | *QOSA_PDP_IPV4V6* | IPv4v6 | ### qosa_pdp_auth_type_e 鉴权类型枚举定义如下: ```cpp typedef enum { QOSA_PDP_AUTH_TYPE_NONE = 0, QOSA_PDP_AUTH_TYPE_PAP = 1, QOSA_PDP_AUTH_TYPE_CHAP = 2, } qosa_pdp_auth_type_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_PDP_AUTH_TYPE_NONE* | 无鉴权 | | *QOSA_PDP_AUTH_TYPE_PAP* | PAP | | *QOSA_PDP_AUTH_TYPE_CHAP* | CHAP | # 应用逻辑流程图 ```{figure} images/board_Y08swDZmQhUZpXb0quKcAawingd.jpg :align: center :alt: image ``` # 示例代码 完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/application/one_touch/datacall.c