📄 mgcp_test.c
字号:
ptnotify_event = (MGCP_OBSERVED_EVENT *)calloc(1, sizeof(MGCP_OBSERVED_EVENT)); if (ptnotify_event == NULL) { printf("\r\n %s : L%d", __FILE__, __LINE__); break; } ptnotify_event->ePkgID = MGCP_PKG_LINE; ptnotify_event->eEventID = L_OFF_HOOK_TRANSITION; // 发送挂机通知 if (MgcpEndpointNotifyEvent((H_ENDPOINT)ptmgcp_endpoint_handle, ptnotify_event, NULL) != OK) { printf("\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MgcpEndpointNotifyEvent( ... ) : FAIL\r\n"); free(ptnotify_event); break; } printf("\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MgcpEndpointNotifyEvent( ... ) : OK\r\n"); free(ptnotify_event); break; } case USER_HOOK_FLUSH: { H_MGCP_ENDPOINT ptmgcp_endpoint_handle = NULL; MGCP_OBSERVED_EVENT *ptnotify_event = NULL; char pch_local_name[MGCP_MAX_LOCAL_NAME_LEN+1]; int iname_len = 0; printf("\r\n\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MGCP_USER_MSG : USER_HOOK_ON"); iname_len = ptinternal_msg->u.pch_user_msg[1]; if (iname_len < 1) { printf("\r\n %s : L%d\r\n", __FILE__, __LINE__); break; } // 复制端点名称 memcpy(pch_local_name, &(ptinternal_msg->u.pch_user_msg[2]), iname_len); pch_local_name[iname_len] = 0; printf("\r\n pch_local_name == %s\r\n", pch_local_name); ptmgcp_endpoint_handle = FindEptHdByLocalName(pch_local_name); if (ptmgcp_endpoint_handle == NULL) { printf("\r\n %s : L%d\r\n", __FILE__, __LINE__); break; } ptnotify_event = (MGCP_OBSERVED_EVENT *)calloc(1, sizeof(MGCP_OBSERVED_EVENT)); if (ptnotify_event == NULL) { printf("\r\n %s : L%d", __FILE__, __LINE__); break; } ptnotify_event->ePkgID = MGCP_PKG_LINE; ptnotify_event->eEventID = L_FLASH_HOOK; // 发送挂机通知 if (MgcpEndpointNotifyEvent((H_ENDPOINT)ptmgcp_endpoint_handle, ptnotify_event, NULL) != OK) { printf("\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MgcpEndpointNotifyEvent( ... ) : FAIL\r\n"); free(ptnotify_event); break; } printf("\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MgcpEndpointNotifyEvent( ... ) : OK\r\n"); free(ptnotify_event); break; } case USER_SEND_CODE: { H_MGCP_ENDPOINT ptmgcp_endpoint_handle = NULL; MGCP_OBSERVED_EVENT *ptnotify_event = NULL; char pch_local_name[MGCP_MAX_LOCAL_NAME_LEN+1]; char pch_code[MGCP_MAX_CODE_LEN+1]; int iname_len = 0; int icode_len = 0; int i = 0; printf("\r\n\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MGCP_USER_MSG : USER_SEND_CODE"); iname_len = ptinternal_msg->u.pch_user_msg[1]; if (iname_len < 1) { printf("\r\n %s : L%d\r\n", __FILE__, __LINE__); break; } // 复制端点名称 memcpy(pch_local_name, &(ptinternal_msg->u.pch_user_msg[3]), iname_len); pch_local_name[iname_len] = 0; printf("\r\n pch_local_name == %s", pch_local_name); icode_len = ptinternal_msg->u.pch_user_msg[2]; if (icode_len < 1) { printf("\r\n %s : L%d\r\n", __FILE__, __LINE__); break; } // 复制要呼叫的号码 memcpy(pch_code, &(ptinternal_msg->u.pch_user_msg[3+iname_len]), icode_len); pch_code[icode_len] = 0; printf("\r\n pch_code == %s\r\n", pch_code); ptmgcp_endpoint_handle = FindEptHdByLocalName(pch_local_name); if (ptmgcp_endpoint_handle == NULL) { printf("\r\n %s : L%d\r\n", __FILE__, __LINE__); break; } ptnotify_event = (MGCP_OBSERVED_EVENT *)calloc(1, sizeof(MGCP_OBSERVED_EVENT)); if (ptnotify_event == NULL) { printf("\r\n %s : L%d", __FILE__, __LINE__); break; } ptnotify_event->ePkgID = MGCP_PKG_DTMF; for (i=0; i<icode_len; i++) { if (pch_code[i] >= '0' && pch_code[i] <= '9') { ptnotify_event->eEventID = D_DTMF_0 + pch_code[i] - '0'; } else if (pch_code[i] == '#') { ptnotify_event->eEventID = D_DTMF_POUND; } else if (pch_code[i] == '*') { ptnotify_event->eEventID = D_DTMF_ASTERISK; } else if (pch_code[i] >= 'a' && pch_code[i] <= 'd') { ptnotify_event->eEventID = D_DTMF_A + pch_code[i] - 'a'; } else if (pch_code[i] >= 'A' && pch_code[i] <= 'D') { ptnotify_event->eEventID = D_DTMF_A + pch_code[i] - 'A'; } // 号码通知 if (MgcpEndpointNotifyEvent((H_ENDPOINT)ptmgcp_endpoint_handle, ptnotify_event, NULL) != OK) { printf("\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MgcpEndpointNotifyEvent( ... ) : FAIL\r\n"); free(ptnotify_event); break; } printf("\r\n %s : L%d", __FILE__, __LINE__); printf("\r\n MgcpEndpointNotifyEvent( ... ) : OK\r\n"); printf("\r\n ptnotify_event->eEventID == %d", ptnotify_event->eEventID); printf("\r\n D_DTMF_0 == %d", D_DTMF_0); usleep(1000*30); // 让系统调度其他线程运行 } free(ptnotify_event); break; } } break; } } return OK;}// 在端口 6666 上收消息int main(int argc, char * argv[]){ int i = 0; struct sockaddr_in sock_temp; char recv_buffer[MAX_MGCP_DATAGRAM] = {0}; socklen_t sock_len = sizeof(struct sockaddr_in); struct timeb ttimeb; memset(&ttimeb, 0, sizeof(ttimeb)); if (ftime(&ttimeb) != 0) { printf("\r\n ftime( ... ) fail \r\n"); return FAIL; } srand(ttimeb.millitm + 1); memset(&gsock_main_recv, 0, sizeof(gsock_main_recv)); memset(&gsock_cbk_send, 0, sizeof(gsock_cbk_send)); // 创建日志套接口并绑定 gmain_recv_fd = socket(AF_INET, SOCK_DGRAM, 0); if (gmain_recv_fd <= 0) { printf("\r\n\t socket gmain_recv_fd fail!\r\n\r\n"); return FAIL; } gsock_main_recv.sin_family = AF_INET; gsock_main_recv.sin_port = htons(6666); gsock_main_recv.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(gmain_recv_fd, (struct sockaddr*)&gsock_main_recv, sizeof(gsock_main_recv)) < 0 ) { printf("\r\n\t bind gmain_recv_fd fail!\r\n"); close(gmain_recv_fd); return FAIL; } ginternal_send_fd = socket(AF_INET, SOCK_DGRAM, 0); if (ginternal_send_fd <= 0) { printf("\r\n\t socket ginternal_send_fd fail!\r\n\r\n"); close(gmain_recv_fd); return FAIL; } gsock_cbk_send.sin_family = AF_INET; gsock_cbk_send.sin_port = htons(7777); gsock_cbk_send.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(ginternal_send_fd, (struct sockaddr*)&gsock_cbk_send, sizeof(gsock_cbk_send)) < 0 ) { printf("\r\n\t bind ginternal_send_fd fail!\r\n"); close(gmain_recv_fd); close(ginternal_send_fd); return FAIL; } Debug_On(LOG_ABNF_MSG); Debug_On(LOG_TASK_MSG); Debug_On(LOG_ERROR); // 创建协议栈 // 设置协议栈控制参数 // 注册端点并设置端点控制参数 // 启动协议栈 if (MgcpStackCreate(&gpStack, Cbk_MGCP_Stack, Cbk_Get_Connec_Params) == OK) { printf("\r\n\t MgcpStackCreate(...) success\r\n"); } else { printf("\r\n\t MgcpStackCreate(...) fail\r\n"); return FAIL; } if (MgcpStackSetNetwork(gpStack, ntohl(inet_addr("192.168.7.40")), 2427) == OK) { printf("\r\n\t MgcpStackSetNetwork(...) success\r\n"); } else { printf("\r\n\t MgcpStackSetNetwork(...) fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } if (MgcpStackSetDomainName(gpStack, "MG100.ZXD1000.COM") == OK) { printf("\r\n\t MgcpStackSetDomainName(...) success\r\n"); } else { printf("\r\n\t MgcpStackSetDomainName(...) fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } // 设置命令的初始最大重发时长 if (MgcpStackSetMaxInitRTO(gpStack, 5000) == OK) { printf("\r\n\t MgcpStackSetMaxInitRTO(...) success\r\n"); } else { printf("\r\n\t MgcpStackSetMaxInitRTO(...) fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } // 设置命令的最大重发时长 if (MgcpStackSetMaxRTO(gpStack, 5000) == OK) { printf("\r\n\t MgcpStackSetMaxRTO(...) success\r\n"); } else { printf("\r\n\t MgcpStackSetMaxRTO(...) fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } if (MgcpStackSetRestartMaxDelay(gpStack, 50) == OK) { printf("\r\n\t MgcpStackSetRestartMaxDelay(...) success\r\n"); } else { printf("\r\n\t MgcpStackSetRestartMaxDelay(...) fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } // 注册 ENDPOINT_TOTALL_CNT 个端点( 端点注册要在协议栈启动之前进行 ) for (i=0; i<ENDPOINT_TOTALL_CNT; i++) { char pch_temp[32]; memset(pch_temp, 0, 32); sprintf(pch_temp, "aaln/%d", i+1); if (MgcpStackRegisterEndpoint(gpStack, &gpEndpoint[i], pch_temp, Cbk_Sig_Check) != OK) { printf("\t register endpoint %s fail\r\n", pch_temp); MgcpStackDestroy(gpStack); return FAIL; } if (MgcpEndpointSetCallAgent(gpEndpoint[i], "192.168.6.38", 2727) != OK) { printf("\t MgcpEndpointSetCallAgent(...) fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } // 设置本端点支持的包类型 // G if (MgcpEndpointSetDefaultPackage(gpEndpoint[i], MGCP_PKG_GENERIC_MEDIA) != OK) { printf("\t MgcpEndpointSetDefaultPackage(...) : MGCP_PKG_GENERIC_MEDIA fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } // D if (MgcpEndpointSetDefaultPackage(gpEndpoint[i], MGCP_PKG_DTMF) != OK) { printf("\t MgcpEndpointSetDefaultPackage(...) : MGCP_PKG_DTMF fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } // L if (MgcpEndpointSetDefaultPackage(gpEndpoint[i], MGCP_PKG_LINE) != OK) { printf("\t MgcpEndpointSetDefaultPackage(...) : MGCP_PKG_LINE fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } } printf("\r\n\t register endpoints success\r\n"); if (MgcpStackStart(gpStack) == OK) { printf("\r\n\t MgcpStackStart(...) success\r\n"); } else { printf("\r\n\t MgcpStackStart(...) fail\r\n"); MgcpStackDestroy(gpStack); return FAIL; } /* i = 0; while(i<ENDPOINT_TOTALL_CNT) { char pch_local_name[16] = {0}; H_MGCP_ENDPOINT ptmgcp_endpoint_handle = NULL; sprintf(pch_local_name, "aaln/%d", i + 1); ptmgcp_endpoint_handle = FindEptHdByLocalName(pch_local_name); if (ptmgcp_endpoint_handle != NULL) { printf("\r\n pch_local_name == %s", pch_local_name); printf("\r\n ptmgcp_endpoint_handle->pcEndpointName == %s", ptmgcp_endpoint_handle->pcEndpointName); } i++; }*/ while (TRUE) { TInternal_Msg tinternal_msg; int recv_len = 0; memset(&tinternal_msg, 0, sizeof(tinternal_msg)); memset(&sock_temp, 0, sizeof(sock_temp)); memset(recv_buffer, 0, sizeof(MAX_MGCP_DATAGRAM)); // 收消息 if ((recv_len = recvfrom(gmain_recv_fd, recv_buffer, MAX_MGCP_DATAGRAM, 0, (struct sockaddr *)&sock_temp, (socklen_t *)&sock_len)) <= 0) { printf("\r\n recieve internal message fail\r\n"); continue; } // 处理消息 if (recv_len >= 4) { memcpy(&tinternal_msg, recv_buffer, sizeof(tinternal_msg)); Deal_Msg(&tinternal_msg); } } printf("\r\n\t shall destroy the stack\r\n"); MgcpStackDestroy(gpStack); printf("\r\n\t Destroying MGCP stack success\r\n"); printf("\r\n\t The End\r\n\r\n"); return OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -