⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anet_q3_drv.c

📁 仿真测试接口程序。根据电总《用户接入网管理功能与管理接口技术规范》之《与112集中受理系统接口规范》
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <poll.h>#include <stdio.h>#include <stdlib.h>#include "simdrv.h"#include "simu112.h"#include "simufunc.h"#define MAX_FAIL_TIMES		4#define WAIT_TIME					120000#define RESULT_OTHER			-4#define RESULT_NULL				-5#define RESULT_BUSY				-6#define RESULT_TIMEOUT		-7#define PackageBegin			'$'#define PackageEnd				';'FILE *lp;int anet_q3_proc(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg);int f_anet_q3_result_receive(int sock, char *szBuffer, int times, int wait_time);int f_anet_q3_test_process(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg);int f_anet_q3_analysis(char *receive_str, TESTMSG * testmsg);void f_anet_q3_get_res(char *result, char *val_str);void f_anet_q3_get_cap(char *result, char *val_str);void f_anet_q3_get_vol(char *result, char *val_str);int f_anet_q3_get_result(char *str, char *result);int f_anet_q3_get_code(char *str);static char receive_str[2048];/*********************************************************Function:int anet_q3_proc(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg)Narrative:	Called in simdrv.c. It is the main flow of anet_q3_drv driver.Param:	int port_fd - socket id	char command_type - type of test command	char *phone_number - a pionter to accessed telephone number	char *v5en - a pointer to V5 equipment number	char *offhook - a pointer to type of offhook	char *num - a pointer to times of offhook	char *loop - a pointer to type of ISDN loop	char *channel - a pointer to ISDN channel	char usegrade - flag of using grade	char *grade - a pointer to flag of forced test	char *TSN - a pointer to test serial	TESTMSG * testmsg - struct of test messageReturn: 0	OK or Null TelephoneNumber or Line Busy.	AM_NO_RESPONSE	AM_PORT_DOWN	AM_UNREADY_ERROR	AM_TIME_OUT*********************************************************/int anet_q3_proc(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg){	int ret;	int test_stat = 1;	int fail_count;	struct tm *ctime;	time_t lt;#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	lp = backup_log("./anet_q3_drv.log");	/* lp=fopen("./anet_q3_drv.log","a+"); */	fprintf(lp, "\n>>> Start Access Net (Q3) Test at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec);	fflush(lp);#endif	poll(0, 0, 500);	ret = f_anet_q3_test_process(port_fd, command_type, phone_number, v5en, offhook, num, loop, channel, usegrade, grade, TSN, testmsg);#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	fprintf(lp, "\n>>> Stop Access Net Test (Q3) at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec);	fflush(lp);	fclose(lp);#endif	switch (ret)	{	case -1:		ret = AM_UNREADY_ERROR;		break;	case -2:		ret = AM_NO_RESPONSE;		break;	case -3:		ret = AM_PORT_DOWN;		break;	case RESULT_OTHER:		ret = AM_UNREADY_ERROR;		break;	case RESULT_NULL:		ret = 0;		strcpy(testmsg->TestResult.TestConclusion, "V08");		break;	case RESULT_BUSY:		ret = 0;		strcpy(testmsg->TestResult.TestConclusion, "V6");		break;	case RESULT_TIMEOUT:		ret = AM_TIME_OUT;		break;	}	return (ret);}/* end of anet_q3_proc *//*********************************************************Function:int anet_q3_conn_switch(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg)Narrative:	Detect if interface to switch runs well by sending a wakeup signal or a command.Param:	int port_fd	- socket id 	char command_type - type of test command	char *phone_number - a pionter to accessed telephone number	char *v5en - a pointer to 	char *offhook - 	char *num - 	char *loop - 	char *channel - 	char usegrade - 	char *grade - 	char *TSN - 	TESTMSG * testmsg - struct of test message Return:	0	OK.	-1	No fd ready when timeout.	-2	an error occur.*********************************************************/int anet_q3_conn_switch(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg){	int ret;	receive_str[0] = 0;	ret = anet_q3_proc(port_fd, command_type, phone_number, v5en, offhook, num, loop, channel, usegrade, grade, TSN, testmsg);	if (ret == 0)		return 0;	else if (strlen(receive_str) == 0)		return -1;	else		return -2;}/*********************************************************Function:int f_anet_q3_test_process(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg)Narrative:	Send test command to switch and get test value.Param:	int port_fd	- socket id 	char command_type - type of test command	char *phone_number - a pionter to accessed telephone number	char *v5en - a pointer to 	char *offhook - 	char *num - 	char *loop - 	char *channel - 	char usegrade - 	char *grade - 	char *TSN - 	TESTMSG * testmsg - struct of test messageReturn:	0   OK.	-1	An error of hangup occur when reading.	-2	No fd ready when timeout.	-3	An error occur when performing poll or read.	RESULT_OTHER	No expected string.	RESULT_BUSY	Line busy.	RESULT_NULL	Ivalid telephone number.********************************************************/int f_anet_q3_test_process(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg){	char test_str[120],package_str[120];	int ret;	int i;	int error_code;	char *p, *q;	char new_number[40];	char grade_str[10];	f_trim_space(phone_number);	if (v5en[0] != '\0')		sprintf(new_number, "%s V5EN=%s", phone_number, v5en);	else		strcpy(new_number, phone_number);	/* f_trim_space(grade); */#ifdef DEBUG	fprintf(lp, "Grade=%s\n", grade);	fflush(lp);#endif	if (usegrade == '1')	{		if (grade[0] == '1')			sprintf(grade_str, "GRADE=1 ");		else			sprintf(grade_str, "GRADE=0 ");	}	else		grade_str[0] = '\0';	switch (command_type)	{	case TST_FULL:		sprintf(test_str, "INVOKEID=%s FULLTEST %sTYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case TST_LOOP:	case TST_QUERY:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=0 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case CONN_TSTSIG_SOUNDER:		sprintf(test_str, "INVOKEID=%s HOWLER LONG=10:DN=%s", TSN, new_number);		break;	case MEAS_TN:		sprintf(test_str, "INVOKEID=%s DIALTONE %sOFFHOOK=%s NUM=%s:DN=%s", TSN, grade_str, offhook, num, new_number);		break;	case MEAS_FEEDVOL:		sprintf(test_str, "INVOKEID=%s FEEDVOL %sTYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_LOOPRING:		sprintf(test_str, "INVOKEID=%s LOOPRING %sTYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_OUTPLSE:		sprintf(test_str, "INVOKEID=%s DIGTEST NUM=%s TYPE=1:DN=%s", TSN, num, new_number);		break;	case MEAS_VG_DC:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=2 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_VG_AC:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=1 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_LOOP_CUREST:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=3 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_LOOP_RES:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=4 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_RES:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=5 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_CAPNC:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=6 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_IMPED:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=7 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_NSE:		sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=8 TYPE=1:DN=%s", TSN, grade_str, new_number);		break;	case MEAS_ISDN:		sprintf(test_str, "INVOKEID=%s ISDNTEST %sLOOP=%s CHANNEL=%s :DN=%s", TSN, grade_str, loop, channel, new_number);		break;	case TST_RINGSGNL:		sprintf(test_str, "INVOKEID=%s RING LONG=30:DN=%s", TSN, new_number);		break;	case CONN_MONEST:		sprintf(test_str, "INVOKEID=%s TALKSTART:DN=%s", TSN, new_number);		break;	case DISC_MON:		sprintf(test_str, "INVOKEID=%s TALKSTOP:DN=%s", TSN, new_number);		break;	case CONN_MONBRDGD:		sprintf(test_str, "INVOKEID=%s CONNECTUSER TYPE=0:DN=%s", TSN, new_number);		break;	case CONN_FMONBRDGD:		sprintf(test_str, "INVOKEID=%s CONNECTUSER TYPE=1:DN=%s", TSN, new_number);		break;	}	f_anet_q3_make_package(test_str, package_str);#ifdef DEBUG	fprintf(lp, "send:%s\ncommand:%d\n", package_str, command_type);	fflush(lp);#endif	writeport(port_fd, package_str);	if (command_type == MEAS_OUTPLSE)		ret = f_anet_q3_result_receive(port_fd, receive_str, atoi(num), 60000);	else                                                                 	{		ret = f_anet_q3_result_receive(port_fd, receive_str, 1, WAIT_TIME);		if (f_anet_q3_check_package(receive_str)<0)			return RESULT_OTHER;	}	p = (char *) strstr(receive_str, "STATE=");#ifdef DEBUG	if (p != NULL)	{		fprintf(lp, "p=:%s,p+6:%c\n", p, *(p + 6));		fflush(lp);	}#endif	if ((p == NULL) || ((p != NULL) && *(p + 6) == '0'))	{		switch (command_type)		{		case TST_FULL:		case TST_LOOP:		case TST_QUERY:		case MEAS_VG_DC:		case MEAS_VG_AC:		case MEAS_LOOP_CUREST:		case MEAS_LOOP_RES:		case MEAS_RES:		case MEAS_CAPNC:		case MEAS_IMPED:		case MEAS_NSE:			if (!ret)				ret = f_anet_q3_analysis(receive_str, testmsg);			break;		case CONN_TSTSIG_SOUNDER:		case MEAS_TN:		case MEAS_FEEDVOL:		case MEAS_LOOPRING:		case MEAS_OUTPLSE:		case MEAS_ISDN:		case TST_RINGSGNL:		case CONN_MONEST:		case DISC_MON:		case CONN_MONBRDGD:		case CONN_FMONBRDGD:			if (command_type == MEAS_OUTPLSE)			{				if (f_anet_q3_get_DIGIT(receive_str, testmsg->TestResult.TestConclusion) != 0)					ret = RESULT_OTHER;			}			else			{				if (command_type == CONN_MONEST || command_type == CONN_MONBRDGD || command_type == CONN_FMONBRDGD)				{					q = (char *) strstr(receive_str, "RESULT=");					p = (char *) strstr(receive_str, "TALKDN=");					if (p > q)						p = q;				}				else					p = (char *) strstr(receive_str, "RESULT=");				if (!p)					ret = RESULT_OTHER;				else				{					i = 0;					while (*p != '\0' && *p != ';' && i < 100)					{						testmsg->TestResult.TestConclusion[i] = *p;						++p;						++i;					}					testmsg->TestResult.TestConclusion[i] = '\0';				}			}			break;		}	}	else	{		p = (char *) strstr(receive_str, "ERROR=");		if (p == NULL)			ret = RESULT_OTHER;		else		{			ret = f_anet_q3_get_code(p + 6) + AM_ANET_ERR1 - 1;			if (command_type == TST_FULL || command_type == TST_LOOP || command_type == TST_QUERY)			{				if (ret == AM_ANET_ERR4 || ret == AM_ANET_ERR5)					ret = RESULT_BUSY;				else if (ret == AM_ANET_ERR3)					ret = RESULT_NULL;			}		}	}	return (ret);	/* This is a Demo for test results *//*   receive_str[0]='\0';   ret=0;   switch (command_type)   {   case TST_FULL:   strcpy(receive_str,"INVOKEID=10 FULLTEST DN=6114995:STATE=0 OUTRESULT=0 DIALTONERESULT=1 FEEDVOLRESULT=0 LOOPRINGRESULT=0 VBATVALUE=-51 ILOOPVALUE=-28 ABACVOL=0 AGACVOL=0 BGACVOL=0 ABDCVOL=0 AGDCVOL=0 BGDCVOL=0 ABINS=1830 AGINS=10000 BGINS=5020 ABCAPAC=1090;");   break;   case TST_LOOP:   strcpy(receive_str,"INVOKEID=7 TESTOUTSIDE DN=5896997 STARTTIME=19981130173928 STOPTIME=19981130173957:STATE=0 RESULT=0 AGDCVOL=0 BGDCVOL=0 ABDCVOL=0 AGINS=10000 BGINS=10000 ABINS=10000 AGCAPAC=11 BGCAPAC=11 ABCAPAC=713 AGACVOL=0 BGACVOL=0 ABACVOL=0;");   break;   case MEAS_VG_DC:   strcpy(receive_str,"INVOKEID=9 TESTOUTSIDE DN=5898338 STARTTIME=19981130174143 STOPTIME=19981130174153:STATE=0 RESULT=0 AGDCVOL=0 BGDCVOL=0 ABDCVOL=0;");   break;   case MEAS_VG_AC:   strcpy(receive_str,"INVOKEID=8 TESTOUTSIDE DN=5896995 STARTTIME=19981130174025 STOPTIME=19981130174026:STATE=0 RESULT=0 AGACVOL=0 BGACVOL=0 ABACVOL=0;");   break;   case MEAS_LOOP_CUREST:   strcpy(receive_str,"INVOKEID=12 TESTOUTSIDE DN=5891108 STARTTIME=19981130174309 STOPTIME=19981130174320:STATE=0 RESULT=0 AGINS=10000 BGINS=10000 ABINS=10000;");   break;   case MEAS_LOOP_RES:   strcpy(receive_str,"INVOKEID=11 TESTOUTSIDE DN=5890322:STATE=1 RESULT=2;");   break;   case MEAS_RES:   strcpy(receive_str,"INVOKEID=12 TESTOUTSIDE DN=5891108 STARTTIME=19981130174309 STOPTIME=19981130174320:STATE=0 RESULT=16 AGINS=10000 BGINS=10000 ABINS=10000;");   break;   case MEAS_CAPNC:   strcpy(receive_str,"INVOKEID=13 TESTOUTSIDE DN=5893523 STARTTIME=19981130174338 STOPTIME=19981130174354:STATE=0 RESULT=22 AGCAPAC=77 BGCAPAC=77 ABCAPAC=83;");   break;   case MEAS_IMPED:   strcpy(receive_str,"INVOKEID=14 TESTOUTSIDE DN=5895188 STARTTIME=19981130174413 STOPTIME=19981130174413:STATE=0 RESULT=0;");   break;   case CONN_TSTSIG_SOUNDER:   strcpy(receive_str,"INVOKEID=24 HOWLER DN=5899744 STARTTIME=19981130175310 STOPTIME=19981130175340:STATE=0 RESULT=1;");   break;   case MEAS_TN:   strcpy(receive_str,"INVOKEID=2 DIALTONE DN=5896215 STARTTIME=19981130173541 STOPTIME=19981130173543:STATE=0 RESULT=0;");   break;   case MEAS_FEEDVOL:   strcpy(receive_str,"INVOKEID=4 FEEDVOL DN=5893840 STARTTIME=19981130173652 STOPTIME=19981130173653:STATE=0 RESULT=1 VALUE=-0;");   break;   case MEAS_LOOPRING:   strcpy(receive_str,"INVOKEID=6 LOOPRING DN=5892352 STARTTIME=19981130173759 STOPTIME=19981130173804:STATE=1 RESULT=0 VALUE=20 ERROR=10;");   break;   case MEAS_OUTPLSE:   strcpy(receive_str,"INVOKEID=22 DIGTEST DN=2862551 STARTTIME=19981130175159 STOPTIME=19981130175229:STATE=0 RESULT=0 DIGTYPE=0 DIGIT=1256*# LOWLEVEL=12.5 HIGHLEVEL=2683.6 LOWFREQ=1234 HIGHFREQ=5678;");   break;   case TST_RINGSGNL:   strcpy(receive_str,"INVOKEID=20 RING DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;");   break;   case CONN_MONEST:   strcpy(receive_str,"INVOKEID=20 TALKSTART DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0 TALKDN=4110993;");   break;   case DISC_MON:   strcpy(receive_str,"INVOKEID=20 TALKSTOP DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;");   break;   case CONN_MONBRDGD:   strcpy(receive_str,"INVOKEID=20 CONNECTUSER DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;");   break;   case CONN_FMONBRDGD:   sprintf(receive_str,"INVOKEID=20 CONNECTUSER DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;");   break;   default:   receive_str[0]='\0';   break;   }   sleep(5);   p=(char *)strstr(receive_str,"STATE=");   if (p==NULL)   return AM_UNREADY_ERROR;   #ifdef DEBUG   if (p!=NULL)   {   fprintf(lp,"p=:%s,p+6:%c\n",p,*(p+6));   fflush(lp);   }   #endif    if (*(p+6)=='0')   {     switch (command_type)   {   case TST_FULL:   case TST_LOOP:   case MEAS_VG_DC:   case MEAS_VG_AC:   case MEAS_LOOP_CUREST:   case MEAS_LOOP_RES:   case MEAS_RES:   case MEAS_CAPNC:   case MEAS_IMPED:   case MEAS_NSE:   if (!ret)   ret=f_anet_q3_analysis(receive_str,testmsg);   break;   case CONN_TSTSIG_SOUNDER:   case MEAS_TN:   case MEAS_FEEDVOL:   case MEAS_LOOPRING:   case MEAS_OUTPLSE:   case MEAS_ISDN:   case TST_RINGSGNL:   case CONN_MONEST:   case DISC_MON:   case CONN_MONBRDGD:   case CONN_FMONBRDGD:   p = (char*)strstr(receive_str,"RESULT=");   if (!p)   ret=RESULT_OTHER;   else   {   i=0;   while (*p!='\0' && *p!=';' && i<100)   {   testmsg->TestResult.TestConclusion[i]=*p;   ++p;   ++i;   }   testmsg->TestResult.TestConclusion[i]='\0';   }   break;   }   }   else   {   p=(char *)strstr(receive_str,"ERROR=");   if (p==NULL)   ret=RESULT_OTHER;   else   {   ret=f_anet_q3_get_code(p+6)+AM_ANET_ERR1-1;   if (command_type==TST_FULL || command_type==TST_LOOP)   {   if (ret==AM_ANET_ERR4 || ret==AM_ANET_ERR5)   ret=RESULT_BUSY;   else if (ret==AM_ANET_ERR3)   ret=RESULT_NULL;   }   }   #ifdef DEBUG   fprintf(lp,"Error=%d\n",ret);   fflush(lp);   #endif    }   return(ret); */}/* end f_anet_q3_test_process *//*********************************************************Function:int f_anet_q3_make_package(char *inbuf,char *outbuf)Narrative:	Make package of Q3 format.Param:	char *inbuf - input buffer	char *outbuf - output bufferReturn:	0   OK.				-1	error*********************************************************/int f_anet_q3_make_package(char *inbuf,char *outbuf){	outbuf[0]=0;	sprintf(outbuf,"%c%4d%s%c",PackageBegin,strlen(inbuf)+1,inbuf,PackageEnd);	return 0;}/*********************************************************Function:int f_anet_q3_check_package(char *buf)Narrative:	Check package of Q3 format.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -