如何利用OpenSIPs快速搭建一个重定向服务器
利用OpenSIPs自带的脚本处理可以实现重定向服务器,例如通过脚本接口函数调用进行,但是在大多数
重定向服务器开发通常需自行编码实现,本文介绍通过:sl模块+mysql实现的一种重定向服务器方式。
实现如下:
1.在sl模块中增加db_mysql模块的加载处理,并在脚本中增加db_mysql.so的load;
2.当有新的呼叫或查询报文,在调用w_sl_send_reply处将从mysql localtion表中加载的AOR对应信息
存放在已经定义的类对象或结构体中,以便传入至w_sl_send_reply函数;
3.修改sl模块导出的sl_send_reply函数:在sl模块中定义了
{“sl_send_reply”, (cmd_function)w_sl_send_reply, 2, fixup_sl_send_reply, 0,
REQUEST_ROUTE | ERROR_ROUTE }
此时修改w_sl_send_reply函数使其能够兼容发送响应报文中,在msg_translator.c函数中有构造响应
报文的处理,可在对应增加contact字段,并将重定向结果通过contact字段携带给业务发起端。
1.请求消息:用于客户端为了激活按特定操作而发给服务器的SIP消息,包括INVITE, ACK,OPTIONS,BYE,CANCEL和REGISTER消息等。
请求消息 |
消息含义 |
INVITE |
发起会话请求 |
ACK |
证实已收到对于INVITE请求的*终响应。该消息仅和INVITE消息配套使用 |
BYE |
结束会话。 |
CANCEL |
取消未完成的请求,对于已完成的请求(既已收到*终响应的请求)则没影响。 |
REGISTER |
注册 |
OPTIONS |
查询服务器的能力 |
2. 响应消息: 用于对请求消息进行响应,指示呼叫的成功或失败状态。不同类的响应消息由状态码来区分。状态码包含三位整数,状态码的*位用于定义响应类型,另外两位用于进一步对响应进行更加详细的说明。
(1)1xx:信息响应(呼叫进展),表示已经接收到请求消息,正在对其进行处理;
序号 |
状态码 |
消息功能 |
1xx |
100 |
正在处理中(Trying) |
180 |
振铃(RINGING) |
181 |
呼叫前转(call being forwarder) |
182 |
排队(queue) |
181* |
会话进行(session progress) |
(2)2xx:成功响应,表示请求已被成功接收、处理;
序号 |
状态码 |
消息功能 |
2xx |
200 |
会话成功(OK) |
(3)3xx:重定向响应,表示需要采取进一步动作,以完成该请求;
序号 |
状态码 |
消息功能 |
3xx |
300 |
表示多重选择(multiple) |
301 |
表示永久迁移(moved permanently) |
302 |
表示临时迁移(moved temporaily) |
303 |
见其它 |
305 |
用户代理(user proxy) |
380 |
代换服务(alternative service) |
(4)4xx:客户端出错,表示请求消息中包含语法错误或SIP服务器不能完成对该请求的处理;
序号 |
状态码 |
消息功能 |
4xx |
400 |
错误请求(bad request) |
401 |
无权(unauthorized) |
402 |
要求付款(payment required ) |
403 |
禁止(forbidden) |
404 |
没有发现(not found) |
405 |
不允许的方法(method no allowed) |
406 |
不接受(not acceptable) |
407 |
代理需要验证(proxy authentication required) |
408 |
请求超时(request timeout) |
410 |
消失(gone) |
413 |
请求实体太大( request entity too large) |
414 |
请求URI太大(request-url too long) |
415 |
不支持的媒体类型(unsupported media type) |
416 |
不支持的URI方案(unsupported url scheme) |
420 |
分机无人接听(bad extension) |
421 |
要求转接( extension required) |
423 |
间隔太短( interval too brief) |
480 |
临时失效(temporarily unavailable) |
481 |
呼叫/事务不存在(call/transaction does not exist) |
482 |
发现环路(loop detected) |
483 |
跳数太多(too many hops) |
484 |
地址不完整(address incomplete) |
485 |
不明朗(ambiguous) |
486 |
这里忙(busy here) |
487 |
请求终止(request terminated) |
488 |
这里请求不可接受(not acceptable here) |
491 |
未决请求(request pending) |
493 |
不可辨识(undecipherable) |
(5)5xx:服务器出错,表示SIP服务器故障不能完成对正确消息的处理。
序号 |
状态码 |
消息功能 |
5xx |
500 |
服务器内部错误( server internal error) |
501 |
不可执行(not implemented) |
502 |
坏网关(bad gateway) |
503 |
服务器无效(service unavailable) |
504 |
服务器超时(server time-out) |
505 |
版本不支持(version not supported) |
513 |
消息太大(message too large) |
(6)6xx:全局错误,表示请求不能在任何SIP服务器上实现。
序号 |
状态码 |
消息功能 |
6xx |
600 |
全忙(busy everywhere) |
603 |
丢弃(decline) |
604 |
都不存在(does not exist anywhere) |
606 |
不接受(not acceptable) |