我正在使用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
以下是我的麻烦点:
星期几由范围指定。如何验证日期范围以字符串格式存储的星期几?
此系统将使用多个服务器,并且可能在操作系统上设置了不同的时区。使用GotoIfTime可以轻松验证帐户的时区,因为我唯一需要做的就是将帐户的时区数据库条目的结果指向GotoIfTime应用程序的时区参数。
答案 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)”