Asterisk® SCF™ + LUA: Configuração do LUA Dialplan (parte 03) - Final.

Criado por Matthew Nicholson, modificado pela última vez por Rusty Newton, tradução técnica e adaptação para o Brasil por Angelo Delphini.


Dialplan LUA: Hints

No Asterisk® SCF™ versão 10 e superiores, as dicas (HINTS) do Dialplan (extensions.lua) podem ser especificadas de maneira semelhante à maneira como as extensões são especificadas em Dialplan CONF e AEL.
 
extensions.lua
hints = {
   default = {
      ["100"] = "SIP/100";
   };
 
   office = {
      ["500"] = "SIP/500";
   };
 
   home = {
      ["200"] = "SIP/200";
      ["201"] = "SIP/201";
   };
}
.

Dialplan LUA: Exemplos

Na sequencia alguns exemplos de Dialplan LUA em Asterisk® SCF™ versão 10 e superiores, o objetivo é as varias formas de organizar as extensões no Dialplan LUA.

Menos desordem

Em vez de definir cada extensão em linha, você pode usar este método para criar um arquivo extensions.lua mais organizado. Uma vez que a tabela de extensões e cada contexto são tabelas LUA normais, você pode tratá-las como tal e construí-las peça por peça.

extensions.lua
-- esta função serve como uma função de extensão diretamente --
function call_user(c, user)
   app.dial("SIP/" .. user, 60)
end
 
-- esta função retorna uma função de extensão --
function call_sales_queue(queue)
  return function(c, e)
      app.queue(queue)
   end
end
 
e = {}
 
e.default = {}
e.default.include = {"users""sales"}
 
e.users = {}
e.users["100"] = call_user
e.users["101"] = call_user
 
e.sales = {}
e.sales["5000"] = call_sales_queue("sales1")
e.sales["6000"] = call_sales_queue("sales2")
 
extensions = e

Less Clutter v2

Neste exemplo, usamos uma função sofisticada para registrar extensões.

extensions.lua
function register(context, extension, func)
   if not extensions then
      extensions = {}
   end
 
   if not extensions[context] then
      extensions[context] = {}
   end
 
   extensions[context][extension] = func
end
 
function include(context, included_context)
   if not extensions then
      extensions = {}
   end
 
   if not extensions[context] then
      extensions[context] = {}
   end
 
   if not extensions[context].include then
      extensions[context].include = {}
   end
 
   table.insert(extensions[context].include, included_context)
end
 
-- this function serves as an extension function directly
function call_user(c, user)
   app.dial("SIP/" .. user, 60)
end
 
-- this function returns an extension function
function call_sales_queue(queue)
  return function(c, e)
      app.queue(queue)
   end
end
 
include("default""users")
include("default""sales")
 
register("users""100", call_user)
register("users""101", call_user)
 
register("sales""5000", call_sales_queue("sales1"))
register("sales""6000", call_sales_queue("sales2"))
register("sales""7000", function()
   app.queue("sales3")
end)

Tópicos avançados em pbx_lua

Nos bastidores, uma série de coisas acontecem para tornar a integração de LUA ao Asterisk® SCF™ a mais perfeita possível. Alguns detalhes de como funciona essa integração podem ser encontrados a seguir.

extensions.lua Processo de carga

O arquivo extensions.lua é carregado na memória uma vez quando o módulo pbx_lua é carregado ou recarregado. O arquivo é então lido da memória e executado uma vez para cada canal que procura ou executa uma extensão baseada em LUA. Visto que o arquivo é executado uma vez para cada canal, pode não ser sábio fazer coisas como conectar-se a serviços externos diretamente do script principal ou construir sua tabela de extensões a partir de um serviço da web ou banco de dados.

Provavelmente é uma má ideia.
-- minha fantasia em extensions.lua --
 
extensions = {}
extensions.default = {}
 
-- pode ser uma má ideia, isto será executado sempre que um canal for criado --
data = query_webservice_for_extensions_list("site1")
 
for _, e in ipairs(data) do
   extensions.default[e.exten] = function()
      app.dial("SIP/" .. e.sip_peer, e.dial_timeout)
   end
end

A mesa de extensions

A tabela extensions é uma tabela LUA padrão e pode ser definida como você quiser. O módulo pbx_lua carrega e classifica a tabela quando necessário. As chaves na tabela são nomes de contexto e cada valor é outra tabela LUA contendo extensões. Cada chave na tabela de contexto é um nome de extensão e cada valor é uma função de extensão.

extensions = {
   context_table = {
      extension1 = function()
      end;
      extension2 = function()
      end;
   };
}

Para onde foram as prioridades?

Não há prioridades. O Asterisk® SCF™ usa prioridades para definir a ordem em que ocorrem as operações do Dialplan. O módulo pbx_lua usa funções para definir extensões e a execução ocorre dentro do interpretador LUA, as prioridades não fazem sentido neste contexto. Para o Asterisk® SCF™, cada extensão em pbx_lua aparece como uma extensão com uma prioridade. As extensões em LUA podem ser referenciadas usando o nome do contexto, extensão e prioridade 1, por exemplo GoTo(default,1234,1). Você só faria referência a extensões desta forma de fora de pbx_lua (ou seja, de extensions.conf ou extensions.ael). Com pbx_lua você pode apenas executar a função dessa extensão.

extensions.default["1234"]("default""1234")

Lua Script Lifetime

O mesmo estado de LUA é usado durante o tempo de vida do canal do Asterisk® SCF™ em que está sendo executado, portanto, efetivamente, o script tem o tempo de vida do canal. Isso significa que você pode definir variáveis ​​globais no estado de LUA e recuperá-las posteriormente de uma extensão diferente, se necessário.

Aplicativos, funções e variáveis

Detalhes sobre como acessar aplicações e funções do Dialplan LUA e variáveis ​​de canal podem ser encontrados na página Interagindo com o Asterisk® SCF™ LUA (aplicativos, variáveis ​​e funções) .

Ao acessar um aplicativo ou função dialplan ou uma variável de canal, um objeto de espaço reservado é gerado que fornece os métodos :get( ) e :set( ).

Variável de canal (channel): var é o objeto do espaço reservado
var = channel.my_variable
var:set("my value")
value = var:get("my value")
Função Dialplan: fax_modems é o objeto placeholder
fax_modems = channel.FAXOPT("module")
 
-- the function arguments are stored in the placeholder
 
fax_modems:set("v17")
value = fax_modems:get()
Aplicação Dialplan: Dial é o objeto placeholder
dial = app.dial
 
-- the only thing we can do with it is execute it
dial("SIP/100")

Há um pequeno custo na criação de objetos de espaço reservado, portanto, o armazenamento de objetos de espaço reservado usados ​​com frequência pode ser usado como uma micro otimização. No entanto, isso nunca deve ser necessário e só fornece benefícios se você estiver executando micro benchmarks.

Tkat's All Folks! (É por hoje é só, pessoal!).

 
Temos uma comunidade, ainda pequena no Telegram, para estudos exclusivos em Dialplan com LUA no Asterisk® SCF™, você é bem vindo! (Telegram: https://t.me/asteriskluabr).

Nenhum comentário

Toda vez que um homem supera os reveses, torna-se mentalmente e espiritualmente mais forte!

Tecnologia do Blogger.