笔者在FreeSWITCH中有一个网关配置:
<include>
<gateway name="pstn">
<param name="realm" value="10.18.2.18"/>
<param name="register" value="false"/>
<param name="username" value="022xxxxxxxx"/>
</gateway>
</include>
这个网关是用来外呼的,realm里的IP是OpenSIPS的havip,FreeSWITCH将外呼路由到OpenSIPS,由其中继到运营商。username是向运营商申请的固话号码。
现在由于业务上的需求,我们有多个固话号码,给不同的APP使用,所以在这里不能hard code 022xxxxxxxx,需要根据外呼APP的不同动态改变。
外呼是由OpenSIPS通过ESL发起的,命令如下:
bgapi originate {origination_caller_id_number=010xxxxxxx}sofia/gateway/pstn/a1%s xxxxxxx XML public
然而这个新号码010xxxxxxxx并没有生效,INVITE里的from user仍然是022xxxxxxxx(如果网关配置里去掉username,那么from user就是代码里hard code的"FreeSWITCH")。
吐槽下网上FS的讨论真的很少,自己追了下FreeSWITCH的代码,终于发现网关配置里要把caller-id-in-from设置为true,这样sofia模块在创建channel的时候,就不会用网关配置里的from-user了,而是用通道变量设置的from user(见mod_sofia.c的sofia_outgoing_channel函数)。
最终网关配置如下:
<include>
<gateway name="pstn">
<param name="realm" value="10.18.2.18"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
</gateway>
</include>