如何修改源码为Kemi编写Kamailio原生模块及相关疑问
为Kamailio原生模块添加Kemi支持 & Xlog模块无API文件却可用的原因
一、给未适配Kemi的模块(如Secfilter)添加Kemi支持
要让原生模块在Kemi环境中可用,核心是在模块代码中实现Kemi函数绑定逻辑,具体步骤如下:
- 1. 引入Kemi依赖
在模块的主源码文件(比如secfilter.c)顶部添加Kemi头文件引用:
#include "../../core/kemi/kemi.h"
- 2. 定义Kemi函数映射表
创建模块的Kemi导出函数表,将模块的C API函数映射为Kemi脚本可调用的名称:
static str secfilter_kemi_modname = str_init("secfilter"); static struct kemi_func_t secfilter_kemi_exports[] = { // 绑定secfilter_check函数,脚本中可通过secfilter.check()调用 { str_init("check"), (void*)secfilter_check, 0, 0, 0, 0 }, // 按需求添加其他需要暴露的API函数 { str_init(NULL), NULL, 0, 0, 0, 0 } // 必须以空条目结尾 };
- 3. 实现Kemi注册函数
编写模块的Kemi加载函数,向Kamailio核心注册导出的函数表:
int secfilter_kemi_load(struct kemi_mod* km) { km->modname = secfilter_kemi_modname; km->exports = secfilter_kemi_exports; return 0; }
- 4. 在模块初始化中注册Kemi
修改模块的mod_init()函数,添加Kemi注册逻辑:
int mod_init(void) { // 原有初始化代码... if (kemi_mod_register(secfilter_kemi_load) != 0) { LM_ERR("Failed to register Kemi bindings for secfilter module\n"); return -1; } return 0; }
- 5. 重新编译Kamailio
重新编译Kamailio及目标模块,确保编译过程包含Kemi相关代码。
二、Xlog模块无API文件却能在Kemi中使用的原因
Kamailio的Kemi支持不强制要求模块拥有单独的API文件,核心判断依据是模块是否在初始化时注册了Kemi函数映射表:
- Xlog模块的Kemi绑定逻辑直接写在
xlog.c中,没有抽离到单独的API文件,但它通过kemi_mod_register()完成了函数映射表的注册,因此能被Kemi识别。 - 部分模块的API文件是为了统一管理模块对外暴露的C语言API(供其他Kamailio模块调用),和Kemi脚本绑定没有必然关联。只要模块实现了Kemi注册逻辑,无论是否有单独的API文件,都能在Kemi中使用。
内容的提问来源于stack exchange,提问作者Moheb
相关产品推荐
相关产品推荐

