知识点
originate命令调用switch_ivr_originate的时候, 第一个参数传的是NULL,而第一个参数对应的是主叫session。
也就是说,单腿呼叫,只有b腿,没有a腿。(a腿一般代表的是呼入的那条腿)
switch_state_handler_table_t参数为空,该参数为状态机回调,暂时用不到。
谁调用该函数?
根据上面查找的所有引用信息可以看出,callcenter、conference、fifo、dptools等模块在需要外呼的时候,都有调用。
如果是单腿呼叫,第一个参数session(也就是a腿)都为空。如果是桥接的话,比如conference里面呼叫参会者的时候,session都不为空。
originate命令的调用:
switch_ivr_originate(NULL, &caller_session, &cause, aleg, timeout, NULL, cid_name, cid_num, NULL, NULL, SOF_NONE, NULL
vs
SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *session,
switch_core_session_t **bleg,
switch_call_cause_t *cause,
const char *bridgeto,
uint32_t timelimit_sec,
const switch_state_handler_table_t *table,
const char *cid_name_override,
const char *cid_num_override,
switch_caller_profile_t *caller_profile_override,
switch_event_t *ovars, switch_originate_flag_t flags, switch_call_cause_t *cancel_cause)
对比之后发现:
- 不存在a腿,所以session为空。
- switch_call_cause_t是挂机原因,该挂机原因是freeswitch自己产生,也就是说在发起呼叫的时候出错通知调用者
- bridgeto:为具体的dialString
- timeout: originate命令默认为60秒, 该值可以被参数覆盖
- switch_state_handler_table_t: 用于注册各种回调钩子,具体可以看下面的数据结构。originate传了null
- caller_profile_override:主叫变量,originate都没有a腿,所以此处为空
- ovars:通道变量,此处也是传了null。
这边有一个要说明的是,originate命令的时候,并不是没有传递通道变量,比如下面的命令形式:originate {ignore_early_media=true, xxx=yyy}sofia/internal/186xxxxx@192.168.1.1 &echo
通道变量被包含在了bridgeto变量中,所以在ovars为null也没有太大的影响。
而在另一个调用这fifo中,可以看到下面的代码:
这里就是将absolute_codec_string保存到了ovars中,然后传递给switch_ivr_originate。
至于这两者的细微区别,等待后面再追究吧。
数据结构
状态机回调
struct switch_state_handler_table {
switch_state_handler_t on_init;
switch_state_handler_t on_routing;
switch_state_handler_t on_execute;
switch_state_handler_t on_hangup;
switch_state_handler_t on_exchange_media;
switch_state_handler_t on_soft_execute;
switch_state_handler_t on_consume_media;
switch_state_handler_t on_hibernate;
switch_state_handler_t on_reset;
switch_state_handler_t on_park;
switch_state_handler_t on_reporting;
switch_state_handler_t on_destroy;
...
};
代码逻辑分析
1.判断呼叫的串中是否含有”:_”,含有的话,就转到switch_ivr_enterprise_originate函数中进行处理