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

📄 dms10_drv.c

📁 仿真测试接口程序。根据电总《用户接入网管理功能与管理接口技术规范》之《与112集中受理系统接口规范》
💻 C
字号:
#include <poll.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include "simu112.h"#include "simufunc.h"#include "simdrv.h"void get_three_item(char *ptr, char *dest1, char *dest2, char *dest3, int len);char *get_one_cmd(char *exk_number, char *phone_number);char *get_one_item(char *ptr, int position, int len);int dms10_conn_switch(int port_fd, char *password);int recv_msg_from_dms10(int port_fd, char *msg, int delay);int send_msg_to_dms10(int port_fd, char *msg);FILE *lp;static void f_writelog(FILE * lp, char *str){#ifdef DEBUG	fprintf(lp, "%s\n", str);#endif}/*********************************************************Function:int dms10_proc(int port_fd, char *exk_number, char *phone_number, char *password, TESTMSG * testmsg)Narrative:	Called in simdrv.c. It is the main flow of dms10_drv driver.Param:  int port_fd     - socket id	char *exk_number - char pointer to exk_number stirng	char *phone_number - char pointer to accessed telephone number string	char *password - char pointer to switch port password	TESTMSG * testmsg - struct of test messageReturn: 0   OK or Null TelephoneNumber or Line Busy.	AM_UNREADY_ERROR          	AM_NO_RESPONSE	AM_PORT_DOWN	M_UNREADY_ERROR	AM_TIME_OUT*********************************************************/int dms10_proc(int port_fd, char *exk_number, char *phone_number, char *password, TESTMSG * testmsg){	char msg_from_test[BUFSIZE];	char cmd_buf[81], line_buffer[81], temp1[20], temp2[20], temp3[20];	char *fptr, *ptr, *ptr_start;	int len = 0, ret, i = 0;	struct tm *ctime;	time_t lt;#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	lp = backup_log("./dms10_drv.log");	/* lp=fopen("./dms10_drv.log","a+"); */	fprintf(lp, "\n>>> Start DMS10 Test at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year > 90 ? ctime->tm_year + 1900 : ctime->tm_year + 2000, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec);	fflush(lp);#endif	if ((ret = dms10_conn_switch(port_fd, password)) != AM_SUCCESS)	{		f_writelog(lp, "sorry,failed");		goto dms10_drv_exit;	}	f_writelog(lp, "link right!");	/*send command to switch port_fd */	f_writelog(lp, "Send TEST string!");	if ((ret = send_msg_to_dms10(port_fd, "TEST\r\n")) != AM_SUCCESS)		goto dms10_drv_exit;	sleep(3);	if ((ret = recv_msg_from_dms10(port_fd, msg_from_test, 2000)) != AM_NO_RESPONSE)		goto dms10_drv_exit;	if (strstr(msg_from_test, "DN ") == NULL)		goto dms10_drv_exit;	/*send command to switch port_fd */	f_writelog(lp, "Send TelePhone Number string!");	strcpy(cmd_buf, get_one_cmd(exk_number, phone_number));	if ((ret = send_msg_to_dms10(port_fd, cmd_buf)) != AM_SUCCESS)		goto dms10_drv_exit;	/*receive the test data and process them */	sleep(4);	if ((ret = recv_msg_from_dms10(port_fd, msg_from_test, 3000)) != AM_NO_RESPONSE)	{		if (strstr(msg_from_test, "LIT") == NULL)		{			sleep(1);			f_writelog(lp, "The second time!");			if ((ret = recv_msg_from_dms10(port_fd, msg_from_test, 3000)) != AM_NO_RESPONSE)				goto dms10_drv_exit;		}	}	f_writelog(lp, "result:");	f_writelog(lp, msg_from_test);	if (strstr(msg_from_test, "LIT") == NULL)	{		ret = AM_NO_RESPONSE;		goto dms10_drv_exit;	}	ptr_start = msg_from_test;	do	{		if ((fptr = ptr = strstr(ptr_start, "\r\n")) != NULL)		{			*ptr = '\0';			strcpy(line_buffer, ptr_start);			ptr_start = ptr + 2;			/*next line */			if (strstr(line_buffer, "LIT ") != NULL)			{				if (strstr(line_buffer, "FAIL") != NULL)					strcpy(testmsg->TestResult.TestConclusion, "999");			}			if (strstr(line_buffer, "LIT030") != NULL)			{				strcpy(testmsg->TestResult.TestConclusion, "V6");		/* Line Busy */				ret = AM_SUCCESS;				break;			}			else if (strstr(line_buffer, "LIT300") != NULL)			{				strcpy(testmsg->TestResult.TestConclusion, "V08");	/* Line is NULL */				ret = AM_SUCCESS;				break;			}			if ((ptr = strstr(line_buffer, "AC(VRMS)")) != NULL)			{				get_three_item(line_buffer, temp1, temp2, temp3, 2);				strcpy(testmsg->TestResult.TG_ACvol, temp2);				strcpy(testmsg->TestResult.RG_ACvol, temp3);				continue;			}			if ((ptr = strstr(line_buffer, "DC(VOLTS)")) != NULL)			{				get_three_item(line_buffer, temp1, temp2, temp3, 2);				strcpy(testmsg->TestResult.TG2_DCvol, temp2);				strcpy(testmsg->TestResult.RG2_DCvol, temp3);				continue;			}			if ((ptr = strstr(line_buffer, "RES(KOHM)")) != NULL)			{				get_three_item(line_buffer, temp1, temp2, temp3, 3);				strcpy(testmsg->TestResult.TR2_DCres, temp1);				strcpy(testmsg->TestResult.TG2_DCres, temp2);				strcpy(testmsg->TestResult.RG2_DCres, temp3);				continue;			}			if ((ptr = strstr(line_buffer, "CAP(UF)")) != NULL)			{				get_three_item(line_buffer, temp1, temp2, temp3, 2);				strcpy(testmsg->TestResult.TR_cap, temp1);				strcpy(testmsg->TestResult.TG_cap, temp2);				strcpy(testmsg->TestResult.RG_cap, temp3);			}		}	}	while (fptr != NULL);	ret = AM_SUCCESS;dms10_drv_exit:	sleep(1);	f_writelog(lp, "Send **** for end!");	send_msg_to_dms10(port_fd, "****");	sleep(2);	f_writelog(lp, "Send LOGO for exit!");	send_msg_to_dms10(port_fd, "LOGO\r\n");	sleep(3);#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	fprintf(lp, "\n>>> Stop DMS10 Test at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year > 90 ? ctime->tm_year + 1900 : ctime->tm_year + 2000, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec);	fflush(lp);	fclose(lp);#endif	return ret;}/*********************************************************Function:char *get_one_cmd(char *exk_number, char *phone_number)Narrative:	Trim exk_number and generate test string.Param:  char *exk_number - char pointer to exk_number stirng	char *phone_number - char pointer to accessed telephone number string Return: a pointer to char array cmd_buf.*********************************************************/char *get_one_cmd(char *exk_number, char *phone_number){	int len = 0, i = 0;	static char cmd_buf[81];	while (len < strlen(exk_number))	{		if (*(exk_number + len) != ' ')			break;		else			len++;	}	while (i < strlen(exk_number))	{		if (*(exk_number + len + i) != ' ')		{			*(exk_number + i) = *(exk_number + len + i);			i++;		}		else			break;	}	*(exk_number + i) = '\0';	sprintf(cmd_buf, "%s %s\r\n", exk_number, phone_number + i);	return cmd_buf;}/*********************************************************Function:void get_three_item(char *ptr, char *dest1, char *dest2, char *dest3, int len)Narrative:	Get and transfer test value.Param:  char *ptr - a pointer to recieved test result from switch.	char *dest1 - a pointer to testing value.	char *dest2 - a pointer to testing value.	char *dest3 - a pointer to testing value.	int len - lable of output format.Return: None.*********************************************************/void get_three_item(char *ptr, char *dest1, char *dest2, char *dest3, int len){	strcpy(dest1, get_one_item(ptr, 15, len));	strcpy(dest2, get_one_item(ptr, 23, len));	strcpy(dest3, get_one_item(ptr, 31, len));}/*********************************************************Function:char *get_one_item(char *ptr, int position, int len)Narrative:	Get test value from recieved string from switch.Param:  char *ptr - a pointer to recieved test result from switch.	int position - query starting position.	int len - lable of output format.Return:  a pointer to testing value.*********************************************************/char *get_one_item(char *ptr, int position, int len){	static char item[20];	char temp[10];	float val;	item[0] = '\0';	strncpy(temp, ptr + position, 8);	temp[8] = '\0';	val = atof(temp);	if (len = 2)		sprintf(item, "%8.3f", val);	else		sprintf(item, "%9.3f", val);	return (item);}/*********************************************************Function:int dms10_conn_switch(int port_fd, char *password)Narrative:	Detect if interface to switch runs well by sending a wakeup signal or a command.Param:  int port_fd     - socket id	char *password - char pointer to switch port passwordReturn: AM_SUCCESS      OK.	AM_NO_RESPONSE  No fd ready when timeout.	AM_MESSAGE_ERROR        No expected string.	AM_UNREADY_ERROR        System busy.*********************************************************/int dms10_conn_switch(int port_fd, char *password){	char str[512], link_str[3][5] =	{"****", "####", "!!!!"};	char passwd[64], disp[81];	int len, rc, ret, i;	/* link to switch port_fd */	len = 0;	do	{		sprintf(disp, "len:%d", len);		f_writelog(lp, disp);		for (i = 0; i < 3; i++)		{			write(port_fd, link_str[i], 4);			f_writelog(lp, link_str[i]);			if ((ret = recv_msg_from_dms10(port_fd, str, 2000)) == AM_NO_RESPONSE)			{				if (strlen(str) == 0)				{					len++;					continue;				}				if (((strstr(str, "  ! ") != NULL) && (strstr(str, "\r\n") == NULL)) || ((strstr(str, "  # ") != NULL) && (strstr(str, "\r\n") == NULL)) || ((strstr(str, "  > ") != NULL) && (strstr(str, "\r\n") == NULL)))					break;			}			len++;		}														/*end for */		if (len < 20)			break;	}	while (len < 20);	if (i >= 3)		return AM_NO_RESPONSE;	if (strstr(str, "  ! ") != NULL)	{		/* login and send password to switch port_fd for next step */		strcpy(passwd, password);		strcat(passwd, "\r\n");		if ((ret = send_msg_to_dms10(port_fd, "LOGI\r\n")) != AM_SUCCESS)			return ret;		if ((ret = recv_msg_from_dms10(port_fd, str, 2000)) == AM_NO_RESPONSE)		{			if (strstr(str, "PASS?") != NULL)			{				if ((ret = send_msg_to_dms10(port_fd, passwd)) != AM_SUCCESS)					return ret;				if ((ret = recv_msg_from_dms10(port_fd, str, 2000)) == AM_NO_RESPONSE)				{					if (strstr(str, "LIT") == NULL)						return AM_NO_RESPONSE;				}				else					return AM_MESSAGE_ERROR;			}			else				return AM_MESSAGE_ERROR;		}		else			return AM_NO_RESPONSE;	}	if (strstr(str, "  # ") != NULL)	{		/*begin the test function */		if ((ret = send_msg_to_dms10(port_fd, "OVLY LIT IMED\r\n")) != AM_SUCCESS)			return ret;		/*find the state of test,if '>',can execute test */		poll(0, 0, 4000);						/*wait for 2 seconds */		ret = recv_msg_from_dms10(port_fd, str, 3000);		if (ret != AM_NO_RESPONSE || !(strstr(str, "BUSY") != NULL || (strstr(str, " > ") != NULL) && (strstr(str, "LIT") != NULL)))		{			f_writelog(lp, "The second time!");			poll(0, 0, 1000);			ret = recv_msg_from_dms10(port_fd, str, 3000);		}		if (ret == AM_NO_RESPONSE)		{			if (strstr(str, "BUSY") != NULL)				return AM_UNREADY_ERROR;			if ((strstr(str, "  > ") != NULL) && (strstr(str, "LIT") != NULL))				return AM_SUCCESS;		}	}	f_writelog(lp, "Link switch error!");	return AM_UNREADY_ERROR;}/*********************************************************Function:int recv_msg_from_dms10(int port_fd, char *msg, int delay)Narrative:	Recieve return stirng from switch after sending command.Param:  int port_fd - socket id	char *msg - a pointer to array storing reciecved string from switch	int delay - poll system call waiting timeReturn: 0   OK.	AM_TIME_OUT     An error of hangup occur when reading.	AM_NO_RESPONSE  No fd ready when timeout.	AM_PORT_DOWN    An error occur when performing poll or read.*********************************************************/int recv_msg_from_dms10(int port_fd, char *msg, int delay){	struct pollfd pollfdsp[1];	char ch, line_buffer[128], disp[81];	int len = 0, ret, rc;	int line_count = 0;	pollfdsp[0].fd = port_fd;	pollfdsp[0].events = POLLIN;	pollfdsp[0].revents = 0;	*msg = '\0';	line_buffer[0] = '\0';	while (1)	{		ret = poll(pollfdsp, 1, delay);		if (ret < 0)		{			return (AM_PORT_DOWN);		}		else if (ret == 0)		{			strcat(msg, line_buffer);			if (strlen(line_buffer) > 0)				f_writelog(lp, line_buffer);			return (AM_NO_RESPONSE);		}		if (pollfdsp[0].revents & POLLIN)		{			rc = read(port_fd, &ch, 1);			if (rc < 0)			{				return AM_PORT_DOWN;			}			if (rc == 0)			{				f_writelog(lp, "AM_TIME_OUT");				return AM_TIME_OUT;			}			if (ch != '\0')			{				line_buffer[len++] = ch;				line_buffer[len] = '\0';			}			else			{				len = 0;			}			if (ch == '\n')			{				line_count++;				if (line_count > 30)				{					send_msg_to_dms10(port_fd, "!!!!");					return AM_TIME_OUT;				}				/*f_writelog(lp,line_buffer); */				if (strstr(line_buffer, "NO CARRIER") || strstr(line_buffer, "DISCONNECT") || strstr(line_buffer, "LOSS CD"))					return AM_PORT_DOWN;				if (strstr(line_buffer, "LIT"))					strcat(msg, line_buffer);				if (strstr(line_buffer, "AC(VRMS)"))					strcat(msg, line_buffer);				if (strstr(line_buffer, "DC(VOLTS)"))					strcat(msg, line_buffer);				if (strstr(line_buffer, "RES(KOHM)"))					strcat(msg, line_buffer);				if (strstr(line_buffer, "CAP(UF)"))					strcat(msg, line_buffer);				if (strstr(line_buffer, "BUSY"))					strcat(msg, line_buffer);				if (strstr(line_buffer, "PASS"))					strcat(msg, line_buffer);				if (strstr(line_buffer, "DN"))					strcat(msg, line_buffer);			}		}	}	/*return AM_SUCCESS; */}/*********************************************************Function:int send_msg_to_dms10(int port_fd, char *msg)Narrative:	Send command string to switch.Param:  int port_fd - socket id	char *msg - a pointer to array storing sending string to switchReturn: 0	OK.	-1      Write error********************************************************/int send_msg_to_dms10(int port_fd, char *msg){	int i, ret;	for (i = 0; i < strlen(msg); i++)	{		poll(0, 0, 5);		ret = write(port_fd, (msg + i), 1);		if (ret != 1)		{			f_writelog(lp, "write_error!");			return (ret);		}	}	f_writelog(lp, "send:");	f_writelog(lp, msg);	return (0);}

⌨️ 快捷键说明

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