FreeSWITCH话单保存到MySQL

本文介绍如何在Windows环境下使用FreeSWITCH-1.6.19与VS2015编译并配置mod_odbc_cdr模块,通过MySQL保存通话记录。包括配置ODBC数据源、编译模块、配置文件odbc_cdr.conf.xml等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:Window/VS2015/FreeSWITCH-1.6.19源码

    1:配置ODBC数据源:控制面板-管理工具-ODBC数据源(32位)-系统DSN-添加MySQL ODBC Unicode Driver
    2:编译mod_odbc_cdr模块(源码src\mod\event_handlers目录中有mod_odbc_cdr模块)
    3:Win32\Debug\conf\autoload_configs\modules.conf.xml文件中添加<load module="mod_odbc_cdr"/>
    4:配置文件odbc_cdr.conf.xml:Win32\Debug\conf\autoload_configs目录下添加odbc_cdr.conf.xml文件,内容如下:

<configuration name="odbc_cdr.conf" description="ODBC CDR Configuration">
  <settings>
    <!-- <param name="odbc-dsn" value="database:username:password"/> -->
    <!-- ODBC数据源名称:数据库用户名:数据库密码 -->
    <param name="odbc-dsn" value="freeswitch:root:"/>
    <!-- global value can be "a-leg", "b-leg", "both" (default is "both") -->
    <param name="log-leg" value="both"/>
    <!-- value can be "always", "never", "on-db-fail" -->
    <param name="write-csv" value="on-db-fail"/>
    <!-- location to store csv copy of CDR -->
    <param name="csv-path" value="/usr/local/freeswitch/log/odbc_cdr"/>
    <!-- if "csv-path-on-fail" is set, failed INSERTs will be placed here as CSV files otherwise they will be placed in "csv-path" -->
    <param name="csv-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/>
    <!-- dump SQL statement after leg ends -->
    <param name="debug-sql" value="false"/>
  </settings>
  <tables>
    <!-- 三张表需要先手动创建 -->
    <!-- only a-legs will be inserted into this table -->
    <!-- 保存呼叫数据 -->
    <table name="cdr_table_a" log-leg="a-leg">
      <field name="uuid" chan-var-name="uuid"/>
      <field name="call_uuid" chan-var-name="call_uuid"/>
      <field name="caller_id_name" chan-var-name="caller_id_name"/>
      <field name="caller_id_number" chan-var-name="caller_id_number"/>
      <field name="destination_number" chan-var-name="destination_number"/>
      <field name="start_stamp" chan-var-name="start_stamp"/>
      <field name="answer_stamp" chan-var-name="answer_stamp"/>
      <field name="end_stamp" chan-var-name="end_stamp"/>
      <field name="uduration" chan-var-name="uduration"/>
      <field name="billsec" chan-var-name="billsec"/>
      <field name="hangup_cause" chan-var-name="hangup_cause"/>
    </table>
    <!-- only b-legs will be inserted into this table -->
    <!-- 保存接听数据 -->
    <table name="cdr_table_b" log-leg="b-leg">
      <field name="uuid" chan-var-name="uuid"/>
      <field name="call_uuid" chan-var-name="call_uuid"/>
      <field name="caller_id_name" chan-var-name="caller_id_name"/>
      <field name="caller_id_number" chan-var-name="caller_id_number"/>
      <field name="destination_number" chan-var-name="destination_number"/>
      <field name="start_stamp" chan-var-name="start_stamp"/>
      <field name="answer_stamp" chan-var-name="answer_stamp"/>
      <field name="end_stamp" chan-var-name="end_stamp"/>
      <field name="uduration" chan-var-name="uduration"/>
      <field name="billsec" chan-var-name="billsec"/>
      <field name="hangup_cause" chan-var-name="hangup_cause"/>
    </table>
    <!-- both legs will be inserted into this table -->
    <!-- 保存所有通话数据 -->
    <table name="cdr_table_ab">
      <field name="uuid" chan-var-name="uuid"/>
      <field name="call_uuid" chan-var-name="call_uuid"/>
      <field name="caller_id_name" chan-var-name="caller_id_name"/>
      <field name="caller_id_number" chan-var-name="caller_id_number"/>
      <field name="destination_number" chan-var-name="destination_number"/>
      <field name="start_stamp" chan-var-name="start_stamp"/>
      <field name="answer_stamp" chan-var-name="answer_stamp"/>
      <field name="end_stamp" chan-var-name="end_stamp"/>
      <field name="uduration" chan-var-name="uduration"/>
      <field name="billsec" chan-var-name="billsec"/>
      <field name="hangup_cause" chan-var-name="hangup_cause"/>
    </table>
  </tables>
</configuration>

        表字段说明:(三张表需要先手动创建)
            uuid: 唯一ID
            call_uuid: 关联ID,同主叫方UUID
            caller_id_name: 主叫方昵称
            caller_id_number: 主叫号码
            destination_number: 被叫号码
            start_stamp: 呼叫发起的日期/时间
            answer_stamp: 实际应答呼叫远端的日期/时间 如果未接听电话,则为空字符串
            end_stamp: 呼叫终止的日期/时间
            uduration: 总呼叫持续时间(以微秒为单位)
            billsec: 可计费的通话时长(秒)可计费时间不包括在远端接听电话之前在“早期媒体”中花费的通话时间
            hangup_cause: 挂断原因
    5:重启FreeSWITCH后即可保存通话记录到到表中

### FreeSWITCH 通话记录查询与生成方法 #### 1. 数据库存储通话记录 为了实现详细的通话记录管理,可以配置 FreeSWITCH话单数据存入 MySQL 数据库。通过修改 `conf/autoload_configs/cdr_mysql.conf.xml` 文件来启用此功能[^1]。 ```xml <configuration name="cdr_mysql.conf" description="MySQL CDR"> <settings> <param name="hostname" value="localhost"/> <param name="username" value="root"/> <param name="password" value=""/> <param name="db-name" value="freeswitch"/> <!-- 更多参数设置 --> </settings> </configuration> ``` 当成功获取到发起方呼叫者资料时会触发相应操作: ```c if (switch_channel_get_originatee_caller_profile(channel)) { // 执行保存至数据库的动作 } ``` #### 2. 过滤特定类型的通话记录 对于需要筛选出外呼通话的情况,可以通过命令行工具 grep 对 CSV 格式的通话日志文件进行过滤处理[^2]。 ```bash grep "outbound" cdr202408-answer-billsec.csv > cdr202408-answer-billsec-B.csv ``` 这一步骤能够帮助管理员快速定位并提取所需的通话明细。 #### 3. HTTP 推送方式传输话单 除了本地存储之外,还可以利用 HTTP POST 请求的方式向第三方服务器发送实时更新的话单信息。这种方式适用于跨平台集成场景下的应用开发需求[^3]。 ```json { "billsec": 60, "duration": 90, "answer_epoch": 1672531199, "end_epoch": 1672531259 } ``` 以上 JSON 结构展示了如何定义一次完整的通话事件,其中包含了重要的时间戳字段用于计算实际通话费用。 #### 4. 录音文件关联 如果希望进一步增强服务体验,则可以在每次通话结束后自动生成对应的录音文件,并将其路径写入到相应的通话记录条目中以便后续查阅或审计用途[^4]。 ```python def generate_recording_filename(call_id, start_time): filename = f"{call_id}_{start_time}.wav" return filename ``` 该函数可以根据给定的唯一标识符和起始时刻创建标准化命名格式的音频文档名称。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值