天天看點

Asterisk中如何添加AMI接口

Asterisk manager interface的應用及Asterisk中目前所擁有的AMI接口可以參考:http://www.voip-info.org/wiki/view/Asterisk+manager+API

那麼我們如何為自己添加一個AMI指令呢?

添加AMI的接口如下:

int ast_manager_register2(const char *action, int auth, int (*func)(struct mansession *s, const struct message *m), const char *synopsis, const char

*description)

{

struct manager_action *cur = NULL;

if (!(cur = ast_calloc(1, sizeof(*cur))))

return -1;

cur->action = action; //指令名稱

cur->authority = auth; //指令的執行權限,所有的AMI指令分為很多類

cur->func = func; //指令執行函數

cur->synopsis = synopsis; //指令摘要描述

cur->description = description; // 指令具體使用描述,在指令行檢視幫組時将看到

if (ast_manager_register_struct(cur)) {

ast_free(cur);

return -1;

}

return 0;

添加AMI指令使用該接口如下:

ast_manager_register2("MeetmeList", EVENT_FLAG_REPORTING,

action_meetmelist, "List participants in a conference", mandescr_meetmelist); 

動作函數的編寫方法: 

static int action_meetmelist(struct mansession *s, const struct message *m){

....

....

AMI協定以鍵值協定傳遞,那麼在AMI會話中通過鍵拿到值的接口:

const char *astman_get_header(const struct message *m, char *var);

對于指令的回複使用到下面接口:

static void astman_send_response_full(struct mansession *s, const struct message *m, char *resp, char *msg, char *listflag);

對于執行AMI指令的結果産生的事件使用到下面的接口:

int __manager_event(int category, const char *event, const char *file, int line, const char *func, const char *fmt, ...);

繼續閱讀