替换Asterisk Lua中的GotoIfTime

时间:2013-12-22 18:46:29

标签: sql lua timezone asterisk

我正在使用Asterisk在Lua上开发一个数据库驱动的拨号方案项目。我在.conf dialplan格式中替换GotoIfTime()应用程序时遇到了很大的麻烦。正如Asterisk Lua Reference中所列,Goto Asterisk主要不应该在Lua中使用,这对我来说很有意义。

我检查时间条件的方法与GotoIfTime应用程序完全相同,因为它将符合一周中的某一天,按小时和分钟计算时间,然后按帐户时区限定。该系统将有许多位于不同时区的帐户。帐户的营业时间将取决于帐户定义的时区内的时间。

我的数据库结构如下:

CREATE TABLE IF NOT EXISTS `hours` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account_id` int(11) NOT NULL,
`day_start` varchar(3) NOT NULL,
`day_end` varchar(3) NOT NULL,
`hour_start` int(3) NOT NULL,
`minute_start` int(3) NOT NULL,
`hour_end` int(3) NOT NULL,
`minute_end` int(3) NOT NULL,
`closed_dest_type` varchar(20) NOT NULL,
`closed_dest_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timezone` varchar(40) NOT NULL,
);

以下是Lua中此操作的一些非常简化的用法:

if (open == true) then
    dial(dest_type, dest_id)
else
    dial(closed_dest_type, closed_dest_id)
end

以下是我的麻烦点:

  1. 星期几由范围指定。如何验证日期范围以字符串格式存储的星期几?

  2. 此系统将使用多个服务器,并且可能在操作系统上设置了不同的时区。使用GotoIfTime可以轻松验证帐户的时区,因为我唯一需要做的就是将帐户的时区数据库条目的结果指向GotoIfTime应用程序的时区参数。

2 个答案:

答案 0 :(得分:1)

如果你选择了lua,你可以通过lua本身解析日期,然后比较一周的比较日期。

或者你可以使用默认的GotoIftime,但它会跳出这个lua函数,所以你需要写其他的。

一般情况下,除非您熟悉该语言,否则不应使用LUA。如果您不是lua专家,请使用您熟悉的语言(Perl,php等)的dialplan或fastAGI

有关lua中日期分析的详细信息,请查看此链接http://lua-users.org/wiki/DateAndTime

答案 1 :(得分:0)

在修补并浏览Asterisk源代码之后,我发现Asterisk内置了ExecIfTime应用程序。我没有在lua中编写自己的时间条件库,而是使用Asterisk中内置的函数来完成我需要做的事情。这是一个更简单的方法。

local zone_dir = "/usr/share/zoneinfo/"

if (resHour.id[1] ~= nil) then
    for i=1,#resHour.id do

        local a = resHour.hour_start[i] .. ":"
        a = a .. resHour.minute_start[i] .. "-"
        a = a .. resHour.hour_end[i] .. ":"
        a = a .. resHour.minute_end[i] .. ","
        a = a .. resHour.day_start[i] .. "-"
        a = a .. resHour.day_end[i] .. ",*,*,"
        a = a .. zone_dir .. resAccount.timezone

        app.execiftime(a .. "?Set(open=1)")
     end

     if (channel.open:get() ~= "1") then
         closed()
     end
end

Asterisk调试看起来像这样:

  

执行[blah @ from-external:1] execiftime(“SIP / 102-00000211”,   “9:0-19:0,周一至周五,的,在/ usr / share / zoneinfo中/美/芝加哥集(打开= 1)”