[ English | 简体中文 ]
Telephony API
Telephony 提供蜂窝通信能力,framework/telephony 是 openvela 蜂窝通信对应用层提供的接口层,又称为 TAPI(Telephony API)。封装的接口涵盖了蜂窝通信业务:网络服务、通话、短信、数据、SIM 双卡和 modem 配置管理等。
TAPI 独立于 openvela telephony core stack,内部逻辑基于 DBUS LIB 对 Core Stack 进行业务逻辑封装,屏蔽掉 D-Bus 的复杂操作,对外以标准 C 的方式提供标准化统一的 Telephony API 接口定义,方便 openvela 应用层 APP 的使用,让 openvela APP 实现 openvela 系统版本间复用。
openvela 实现说明
- 架构:TAPI 基于 D-Bus 对 Telephony Core Stack(oFono)进行封装,以标准 C 接口对外提供
- SIM 卡标识:通过
slot_id参数区分不同 SIM 卡槽 - 异步模型:大部分操作通过回调函数异步返回结果
模块代码介绍
| 模块 | 源码 | API 文档 | 说明 |
|---|---|---|---|
| 对外统一头文件 | tapi.h |
公共工具 | 公共类型定义、字符串/枚举转换 utils |
| Radio 接口 | tapi_manager.c/h |
管理 | Telephony 初始化、状态查询、事件注册 |
| Call 接口 | tapi_call.c/h |
通话 | 语音通话控制 |
| 补充业务 | tapi_ss.c/h |
补充业务 SS | 呼叫转移/呼叫限制/呼叫等待/CLIR/USSD |
| 简化电话服务 | tapi_phone.c/h |
简化电话服务 | 轻量客户端封装 |
| Network 接口 | tapi_network.c/h |
网络 | 网络注册、信号、运营商 |
| Data 接口 | tapi_data.c/h |
数据 | 蜂窝数据连接 |
| SIM 接口 | tapi_sim.c/h |
SIM 卡 | SIM 卡管理 |
| SIM Toolkit | tapi_stk.c/h |
SIM Toolkit | STK Agent 与 SIM 卡主动命令 |
| 电话簿 | tapi_phonebook.c/h |
电话簿 | ADN/FDN 电话簿管理 |
| SMS 接口 | tapi_sms.c/h |
短信 | 短信收发 |
| Cell Broadcast | tapi_cbs.c/h |
小区广播 CBS | 小区广播消息 |
| IMS 接口 | tapi_ims.c/h |
IMS | VoLTE/VoWiFi |
TAPI 配置
完整的 Telephony 业务涉及模块众多,需要所有模块开启完整使用 Telephony 业务。
DBUS 配置
CONFIG_DBUS_DAEMON=y
CONFIG_DBUS_MONITOR=y
CONFIG_DBUS_SEND=y
CONFIG_LIB_DBUS=y
GLIB 配置
CONFIG_LIB_GLIB=y
OFONO 配置
CONFIG_LIB_ELL=y
CONFIG_OFONO=y
CONFIG_OFONO_RILMODEM=y # modem 类型选择,支持 rild 的选择 rilmodem
CONFIG_OFONO_ATMODEM=y # 支持串口、USB 的选择 atmodem
GDBUS 配置
CONFIG_LIB_DBUS=y
Telephony API 配置
CONFIG_TELEPHONY=y
CONFIG_TELEPHONY_TOOL=y # debug 工具,可选
TAPI 工作使用模型

TAPI 函数使用举例
获取 TAPI 工作上下文
先声明一个 callback 函数:
static void on_tapi_client_ready(const char* client_name, void* user_data)
{
if (client_name != NULL)
syslog(LOG_DEBUG, "tapi is ready for %s\n", client_name);
...
}
再调用 tapi_open 函数获取上下文。获取成功需要 oFono、D-Bus 等服务启动成功,当 ready 后会调用 callback 函数。
tapi_context context;
char* dbus_name = "vela.telephony.tool";
context = tapi_open(dbus_name, on_tapi_client_ready, NULL);
释放 TAPI 工作上下文
tapi_close(context);
查询当前的 radio power 状态
int slot_id = 0;
bool value = false;
tapi_get_radio_power(context, slot_id, &value);