知识点

originate命令调用switch_ivr_originate的时候, 第一个参数传的是NULL,而第一个参数对应的是主叫session。
也就是说,单腿呼叫,只有b腿,没有a腿。(a腿一般代表的是呼入的那条腿)

switch_state_handler_table_t参数为空,该参数为状态机回调,暂时用不到。

谁调用该函数?

image.png
根据上面查找的所有引用信息可以看出,callcenter、conference、fifo、dptools等模块在需要外呼的时候,都有调用。
如果是单腿呼叫,第一个参数session(也就是a腿)都为空。如果是桥接的话,比如conference里面呼叫参会者的时候,session都不为空。

originate命令的调用:

  1. switch_ivr_originate(NULL, &caller_session, &cause, aleg, timeout, NULL, cid_name, cid_num, NULL, NULL, SOF_NONE, NULL

vs

  1. SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *session,
  2. switch_core_session_t **bleg,
  3. switch_call_cause_t *cause,
  4. const char *bridgeto,
  5. uint32_t timelimit_sec,
  6. const switch_state_handler_table_t *table,
  7. const char *cid_name_override,
  8. const char *cid_num_override,
  9. switch_caller_profile_t *caller_profile_override,
  10. switch_event_t *ovars, switch_originate_flag_t flags, switch_call_cause_t *cancel_cause)

对比之后发现:

  1. 不存在a腿,所以session为空。
  2. switch_call_cause_t是挂机原因,该挂机原因是freeswitch自己产生,也就是说在发起呼叫的时候出错通知调用者
  3. bridgeto:为具体的dialString
  4. timeout: originate命令默认为60秒, 该值可以被参数覆盖
  5. switch_state_handler_table_t: 用于注册各种回调钩子,具体可以看下面的数据结构。originate传了null
  6. caller_profile_override:主叫变量,originate都没有a腿,所以此处为空
  7. ovars:通道变量,此处也是传了null。

这边有一个要说明的是,originate命令的时候,并不是没有传递通道变量,比如下面的命令形式:
originate {ignore_early_media=true, xxx=yyy}sofia/internal/186xxxxx@192.168.1.1 &echo
通道变量被包含在了bridgeto变量中,所以在ovars为null也没有太大的影响。

而在另一个调用这fifo中,可以看到下面的代码:
image.png
这里就是将absolute_codec_string保存到了ovars中,然后传递给switch_ivr_originate。
至于这两者的细微区别,等待后面再追究吧。

数据结构

状态机回调

  1. struct switch_state_handler_table {
  2. switch_state_handler_t on_init;
  3. switch_state_handler_t on_routing;
  4. switch_state_handler_t on_execute;
  5. switch_state_handler_t on_hangup;
  6. switch_state_handler_t on_exchange_media;
  7. switch_state_handler_t on_soft_execute;
  8. switch_state_handler_t on_consume_media;
  9. switch_state_handler_t on_hibernate;
  10. switch_state_handler_t on_reset;
  11. switch_state_handler_t on_park;
  12. switch_state_handler_t on_reporting;
  13. switch_state_handler_t on_destroy;
  14. ...
  15. };

代码逻辑分析

1.判断呼叫的串中是否含有”:_”,含有的话,就转到switch_ivr_enterprise_originate函数中进行处理