freeswitch的v_xml_cdr 详细呼叫记录表通话详情解析-FusionPBX
以下是 v_xml_cdr 表的字段含义注释(基于 FusionPBX 开源 PBX 系统的 CDR 逻辑):
表注释
表名: v_xml_cdr
作用: 存储 FusionPBX 的详细呼叫记录(CDR),包含呼叫元数据、状态、媒体信息和扩展功能集成。
字段注释
| 字段名 | 类型 | 说明 |
|---|---|---|
| xml_cdr_uuid | uuid | 主键,CDR 记录的唯一标识符 |
| domain_uuid | uuid | 关联的域名/租户 UUID(多租户隔离) |
| provider_uuid | uuid | 关联的网关提供商 UUID(用于出局呼叫) |
| extension_uuid | uuid | 关联的分机 UUID(主叫或被叫分机) |
| sip_call_id | text | SIP 呼叫的唯一标识(Call-ID 头字段) |
| domain_name | text | 域名(如 example.com) |
| accountcode | text | 计费账号(用于 CDR 计费关联) |
| direction | text | 呼叫方向(inbound/outbound/local) |
| default_language | text | 默认语音提示语言(如 en) |
| context | text | FreeSWITCH 拨号计划上下文 |
| caller_id_name | text | 主叫显示名称 |
| caller_id_number | text | 主叫号码 |
| caller_destination | text | 主叫原始目标号码 |
| source_number | text | 实际主叫号码(可能被改写前) |
| destination_number | text | 被叫号码 |
| start_epoch | numeric | 呼叫开始时间(Unix 时间戳,秒) |
| start_stamp | timestamptz | 呼叫开始时间(带时区) |
| answer_stamp | timestamptz | 呼叫应答时间(带时区) |
| answer_epoch | numeric | 呼叫应答时间(Unix 时间戳,秒) |
| end_epoch | numeric | 呼叫结束时间(Unix 时间戳,秒) |
| end_stamp | timestamptz | 呼叫结束时间(带时区) |
| duration | numeric | 总时长(秒,从开始到结束) |
| mduration | numeric | 媒体流时长(秒) |
| billsec | numeric | 计费时长(秒)(从应答到结束) |
| billmsec | numeric | 计费时长(毫秒) |
| hold_accum_seconds | numeric | 累计保持时间(秒) |
| bridge_uuid | text | 关联的桥接 UUID(用于连接 A/B 腿) |
| read_codec | text | 接收的编解码(如 PCMU) |
| read_rate | text | 接收的采样率(如 8000) |
| write_codec | text | 发送的编解码 |
| write_rate | text | 发送的采样率 |
| remote_media_ip | text | 远端媒体 IP 地址 |
| network_addr | text | 网络地址(呼叫来源 IP) |
| record_path | text | 录音文件存储路径 |
| record_name | text | 录音文件名 |
| record_length | numeric | 录音时长(秒) |
| record_transcription | text | 录音转文本内容 |
| leg | char(1) | 呼叫腿标识(A=主叫腿,B=被叫腿) |
| originating_leg_uuid | uuid | 原始呼叫腿 UUID |
| pdd_ms | numeric | Post-Dial Delay(毫秒)(拨号到回铃的延迟) |
| rtp_audio_in_mos | numeric | 接收音频的 MOS 值(1-5,语音质量评分) |
| last_app | text | 最后执行的拨号计划应用(如 bridge) |
| last_arg | text | 最后应用的参数 |
| voicemail_message | bool | 是否转到语音信箱 |
| missed_call | bool | 是否未接来电 |
| call_center_queue_uuid | uuid | 关联的呼叫中心队列 UUID |
| cc_side | text | 在呼叫中心中的角色(agent/member) |
| cc_member_uuid | uuid | 呼叫中心成员 UUID(来电者) |
| cc_queue_joined_epoch | numeric | 加入队列的时间戳 |
| cc_queue | text | 呼叫中心队列名称 |
| cc_member_session_uuid | uuid | 成员会话 UUID |
| cc_agent_uuid | uuid | 座席 UUID |
| cc_agent | text | 座席标识(通常为分机号) |
| cc_agent_type | text | 座席类型(如 callback) |
| cc_agent_bridged | text | 座席是否被桥接 |
| cc_queue_answered_epoch | numeric | 队列被应答的时间戳 |
| cc_queue_terminated_epoch | numeric | 队列终止的时间戳 |
| cc_queue_canceled_epoch | numeric | 队列取消的时间戳 |
| cc_cancel_reason | text | 队列取消原因 |
| cc_cause | text | 呼叫中心呼叫结束原因 |
| waitsec | numeric | 在队列中等待的秒数 |
| conference_name | text | 会议名称 |
| conference_uuid | uuid | 会议 UUID |
| conference_member_id | text | 会议成员 ID |
| digits_dialed | text | 拨打的按键(DTMF) |
| pin_number | text | 会议 PIN 码 |
| status | text | 呼叫状态(如 active/completed) |
| hangup_cause | text | 挂机原因(如 NORMAL_CLEARING) |
| hangup_cause_q850 | numeric | Q.850 标准挂机原因码(如 16=正常拆线) |
| sip_hangup_disposition | text | SIP 挂机处置(如 send_bye) |
| call_flow | jsonb | 呼叫流程的 JSON 数据 |
| xml | text | 原始 CDR 的 XML 格式 |
| json | jsonb | CDR 的 JSON 格式(便于解析) |
| insert_date | timestamptz | 记录创建时间 |
| insert_user | uuid | 创建者 UUID |
| update_date | timestamptz | 记录最后更新时间 |
| update_user | uuid | 最后更新者 UUID |
关键字段说明
呼叫标识
sip_call_id+bridge_uuid唯一标识一次呼叫leg区分主被叫腿(同一通话有 A/B 两条记录)
时间维度
start_stamp:呼叫发起时间answer_stamp:被叫应答时间end_stamp:呼叫结束时间billsec:实际通话时长(计费基础)
质量分析
pdd_ms:拨号后延迟(>300ms 可能影响体验)rtp_audio_in_mos:语音质量评分(>4.0 为良好)hangup_cause:故障诊断关键(如NO_ANSWER/USER_BUSY)
高级功能集成
录音:
record_path+record_name定位录音文件呼叫中心:
cc_*字段跟踪队列性能(放弃率/等待时间)会议:
conference_*字段关联会议系统
原始数据
xml:原始 CDR XML(完整细节)json:结构化 CDR 数据(便于分析)call_flow:可视化呼叫路径(JSON 格式)
FusionPBX CDR 特点:
每通通话生成两条记录(A 腿和 B 腿),通过
bridge_uuid关联missed_call=true时配合hangup_cause分析未接原因呼叫中心相关字段需启用
mod_callcenter模块MOS 值依赖
mod_rtp_quality模块计算
查询通话记录sql:
select
c.domain_uuid,
c.sip_call_id,
e.extension,
e.effective_caller_id_name as extension_name,
c.start_stamp,
c.end_stamp,
to_char(timezone('UTC', start_stamp), 'DD Mon YYYY') as start_date_formatted,
to_char(timezone('UTC', start_stamp), 'HH12:MI am') as start_time_formatted,
c.start_epoch,
c.hangup_cause,
c.billsec as duration,
c.billmsec,
c.missed_call,
c.record_path,
c.record_name,
c.xml_cdr_uuid,
c.bridge_uuid,
c.direction,
c.billsec,
c.caller_id_name,
c.caller_id_number,
c.caller_destination,
c.source_number,
c.destination_number,
c.leg,
c.read_codec,
c.write_codec,
c.cc_side,
c.answer_stamp,
c.status,
c.sip_hangup_disposition,
c.pdd_ms,
c.rtp_audio_in_mos,
(c.answer_epoch - c.start_epoch) as tta from v_xml_cdr as c
left join v_extensions as e on e.extension_uuid = c.extension_uuid
inner join v_domains as d on d.domain_uuid = c.domain_uuid
where c.domain_uuid = 'f4039128-965b-4d71-9673-778b6345b07f'
and hangup_cause != 'LOSE_RACE'
and leg = 'a'
order by start_stamp desc limit 0 offset 0
查询通话记录的 sql
通话时长计算字段:(c.answer_epoch - c.start_epoch) AS tta


评论