27 de set. de 2008

Escreva você mesmo

Alguma vez você já quis escrever um módulo Asterisk?

Enquanto alguns dos módulos Asterisk são bem complicados, a anatomia de um módulo Asterisk é bem simples। Vamos começar com um "HelloWord" nos Modulos do Asterisk: res_helloworld।c

Este exemplo é baseado em Asterisk-1.6. No entanto, a criação de módulos para o Asterisk-1.4 é quase a mesma coisa.

Crie o res_helloword.c no diretorio res/ do fonte asterisk..

A primeira coisa a fazer nos modulos é colocar o include da biblioteca do asterisk "asterisk.h "

ex: #include "asterisk.h"

Em seguida, incluir a macro ASTERISK_FILE_VERSION. Isto registra o arquivo com o "core show file version" na cli, e mostra a última revisão feita no svn.

ASTERISK_FILE_VERSION(__FILE__, "$Revision: $")

Incluir no cabeçaho do asterisk o module tb. Isto inclui as definições necessárias para implementar um módulo Asterisk
#include "asterisk/module.h"

Inclua tb o cabeçalho do arquivo que permite-nos utilizar a interface do Asterisk. Isto vai imprimir mensagens de log, para que o nosso novo módulo realmente faz alguma coisa.

#include "asterisk/logger.h"

agora hora de incluir as duas funções que cada módulo deve ter no Asterisk। são elas load_module () e unload_module () :-) । Estas funções são chamadas quando o Asterisk carrega e descarrega o módulo.

static int load_module(void)
{
ast_log(LOG_NOTICE, "Hello World!\n");
return AST_MODULE_LOAD_SUCCESS;
}


static int unload_module(void)
{
ast_log(LOG_NOTICE, "Goodbye World!\n");
return 0;
}

Por fim, cada módulo deve incluir um exemplo de uma das macros AST_MODULE_INFO. Esta macro inclui o código necessário para o módulo se registar adequadamente quando o Asterisk carregar.
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Hello World");

O resultado final deverá parecido com este: res_helloworld.c

Quando você executar o make para compilar Asterisk, o sistema de construção deve localizar automaticamente o seu módulo. Será compilado e instalado com o resto do Asterisk. Compilar, instalar e executar Asterisk. Em seguida, verifique se o módulo foi carregado:
*CLI> module show like helloworld
Module Description Use Count
res_helloworld.so Hello World 0
1 modules loaded

Você também pode descarregar e carregar o seu módulo, e ao ver a mensagem apropriada no Asterisk logger.
*CLI> module unload res_helloworld.so
[Jun 19 10:50:57] NOTICE[26612]: res_helloworld.c:35 unload_module: Goodbye World!
*CLI> module load res_helloworld.so
[Jun 19 10:51:05] NOTICE[26612]: res_helloworld.c:42 load_module: Hello World!
Loaded res_helloworld.so => (Hello World)