You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改源码为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:00:00