如何转换 URI 中的字符串

How to convert string in URI

我设置了 OpenSips 2.3 代理服务器,所以任何调用都来自服务器,我的脚本从数据库中获取 sip URI,并将调用转发到该 uri。当我获得价值时,我使用 AVP 获得价值并将其保存在 $avp(didnumber) 中,如果我使用 rewrite 并手动指定 uri 它正在工作,但是当我从 DB 中获取该值并分配它时,它不起作用重写uri() 方法。

$ru = "sip:"+$avp(didnumber)

如果我写

rewriteuri("[$ru]")

它抛出以下错误

ERROR:core:parse_sip_msg_uri: bad uri <[$ru>
ERROR:tm:new_t: uri invalid
ERROR:tm:t_newtran: new_t failed

我认为此方法不接受普通变量,所以我添加了引号使其成为字符串变量,现在它在日志中显示正常但似乎我必须使用 AVP 或转换来转换变量,我尝试了很多语法但仍然无法做吧。请提出建议。

rewrite_uri() 已被弃用,取而代之的是简单地使用 $ru。您的 R-URI 已被此语句完全重写:

$ru = "sip:" + $avp(didnumber);

但是,请注意上面的内容是不正确的,因为根据 SIP RFC 3261,您没有向 uri 提供 "hostport" 部分:

SIP-URI          =  "sip:" [ userinfo ] hostport
                    uri-parameters [ headers ]

解析器可能会报错。有两个修复方法:

  • 或者只重写 R-URI "userinfo" 部分,像这样:

    $rU = $avp(didnumber);
    
  • 提供目标主机名:

    $ru = "sip:" + $avp(didnumber) + "@" + $var(destination);
    

从这里开始,您可以 t_relay() 使用新的 R-URI。

编辑: OpenSIPS URI 解析器实际上可以容忍 "sip:44776772882" 这样的 URI,但它会将 DID 解释为主机名,因此可能会开始出现错误稍后,如果脚本作者尝试将消息中继到无效的“44776772882”主机名。