【问题标题】:Replacing GotoIfTime in Asterisk Lua在 Asterisk Lua 中替换 GotoIfTime
【发布时间】:2013-12-22 18:46:29
【问题描述】:

我正在使用 Asterisk 在 Lua 中开发一个数据库驱动的拨号方案项目。我在替换 .conf 拨号方案格式的 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 应用程序的时区参数。

【问题讨论】:

  • 1) 为什么将所有内容都设为varchar,而不是使用更合理的数据类型? 2)您根本没有明确说明您要对时区做什么。通常,在查询期间需要考虑时区,而不是事后考虑。 3)请退后一步,从陌生人的角度阅读这篇文章。我不知道您将哪些数据放入这些列中,我也不知道您是如何将这些数据加载到变量中的,或者其他很多事情。你需要更简洁。谢谢。
  • 与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。见Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?。
  • @MattJohnson 1) 已更正。 2) 我添加了几行代码,试图以更清晰和简洁的格式解释时区正在做什么。 3) 当我写这个问题时,我假设读者会熟悉星号,并且会理解 GotoIfTime 应用程序的功能,因为它是 Asterisk 的主要内容。 GotoIftime 应用程序正在被替换为 Asterisk 的 Lua diaplan 格式。坦率地说,我还没有将这些数据加载到 Lua 变量中的方法,因为我还没有做到这一点。

标签: sql lua timezone asterisk


【解决方案1】:

如果您选择了 lua,您可以通过 lua 本身解析日期,然后比较星期几。

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

一般来说,你不应该使用 LUA,除非你熟悉那种语言。如果您不是 lua 专家,请使用您熟悉的语言(Perl、php 等)使用 dialplan 或 fastAGI

有关 lua 中日期解析的更多信息,您可以查看此链接 http://lua-users.org/wiki/DateAndTime

【讨论】:

  • 我很欣赏这些指针,但按照你的逻辑,如果你不熟悉一种语言,你不应该尝试学习它。我觉得这不是一个好的答案。
  • 当然你的观点是正确的,但是如果你的目标是学习 lua,你需要去 lua 文档/论坛站点。这样会更快,质量更高。对不起,我不能说如何在 LUA 中完成这项任务,我只能说你不能使用星号领域的东西来帮助在 LUA 中完成这项任务。对不起,我曾经使用 perl/php/c++。如果您更了解任何一种语言,那么 LUA - 使用该语言。如果你觉得你一无所知 - 学习星号拨号方案或 AEL。在星号中使用像 lua 这样的解释器并不是最好的选择,真的。
【解决方案2】:

在修补并查看 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,mon-fri,,,/usr/share/zoneinfo/America/Chicago?Set(open=1)"

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2010-12-27
    • 2014-10-12
    • 1970-01-01
    • 2012-10-01
    • 2014-11-15
    • 2011-05-16
    • 2017-03-24
    • 2017-12-24
    相关资源
    最近更新 更多