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, ...);