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

📄 sp30_drv.c

📁 仿真测试接口程序。根据电总《用户接入网管理功能与管理接口技术规范》之《与112集中受理系统接口规范》
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <poll.h>#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <ctype.h>#include "simdrv.h"#include "simu112.h"#include "simufunc.h"/* #include "sp30_drv.h" */#define MAX_FAIL_TIMES		4#define WAIT_TIME					5000#define RESULT_OTHER			-4#define RESULT_NULL				-5#define RESULT_BUSY				-6#define RESULT_TIMEOUT		-7#define BEGIN_PACK				0x00#define MIDDLE_PACK				0x01#define END_PACK					0x03#define MAX_RECEIVE_LEN		2048FILE *lp;int f_sp30_result_receive(int sock, unsigned char *szBuffer, int *len);int f_sp30_send_frame(int sock, unsigned char *buf, int len);int f_sp30_test_process(int port_fd, char *phone_number, TESTMSG * testmsg);void f_formulate(unsigned char *str, unsigned sno, unsigned rno, int len);void f_show_result(char *head, unsigned char *buf, int len);int f_link_switch(int port_fd);void f_send_ack(int port_fd);int f_sp30_access_line(int port_fd, char *phone_number, int max_retrys);int f_sp30_test_MLCT(int port_fd, int max_retrys);int f_sp30_test_V_R_CAP(int port_fd, int max_retrys, TESTMSG * testmsg);void f_sp30_stop_test(int port_fd);void f_sp30_release_line(int port_fd, char *phone_number);void f_sp30_make_phone_number(unsigned char *str, char *phone_number);void f_sp30_cal_result(unsigned char *result_str, TESTMSG * testmsg);int f_sp30_verify_package(unsigned char *str, int len);/*   unsigned char login_frame[43]=   {   0xFF,0xFF,0x41,0x30,0x22,0x00,0x00,0x00,0x27,0x00,   0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   0x02,0x00,0x91,0x79,0x00,0x00,0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   0x39,0xFF,0xFE   }; */unsigned char to_sno, to_rno, from_sno, from_rno;unsigned char receive_str[MAX_RECEIVE_LEN];int receive_len;int sp30_version;unsigned char manage_frame[9] ={0xff, 0xff, 0x00, 0x20, 0x00, 0x00, 0xe0, 0xff, 0xfe};unsigned char ack_frame[9] ={0xff, 0xff, 0x01, 0x10, 0x01, 0x00, 0x00, 0xff, 0xfe};unsigned char login_frame[43] ={	0xFF, 0xFF, 0x41, 0x30, 0x22, 0x00, 0x00, 0x00, 0x27, 0x00,	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	0x39, 0xFF, 0xFE};unsigned char access_line_frame[43] ={0xFF, 0xFF, 0x01, 0x30, 0x22, 0x00, 0x00, 0x00, 0x64, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x48, 0x58, 0xAA, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFE};/* pos:  2 - Sno|Rno      12 - start test(01) stop test(00)   13 - 00 */unsigned char test_frame[33] ={0xff, 0xff, 0x00, 0x30, 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe};/* pos:  2 - Sno|Rno      12 - cmd no.(0x10-MLCT;0x11-V,R,CAP;0x19-END)   13 - 00 *//*********************************************************Function:void write_msg(char *head, unsigned char *msg, int msg_len)Narrative:	Write vissible character to logfile.Param:	char *head - a pointer to head of message	unsigned char *msg - a pointer to recieved string	int msg_len - length of recieved stringReturn: None.*********************************************************/void write_msg(char *head, unsigned char *msg, int msg_len){#ifdef DEBUG	int i, j;	char disp_buf[2048] = "";	/*f_show_result(head,msg,msg_len); */	for (i = 0; i < msg_len; i++)	{		j = strlen(disp_buf);		sprintf(&disp_buf[j], "%02X,", (unsigned char) *(msg + i));	}	fprintf(lp, "%s%s\n", head, disp_buf);	fflush(lp);#endif}/*********************************************************Function:int sp30_proc(int port_fd, int version, char *phone_number, TESTMSG * testmsg)Narrative:	Called in simdrv.c. It is the main flow of sp30_drv driver.Param:	int port_fd	- socket id	int version - the software version of sp30 switch	char *phone_number - char pointer to accessed telephone number string	TESTMSG * testmsg - struct of test messageReturn: 0   OK or Null TelephoneNumber or Line Busy.	AM_UNREADY_ERROR	  	AM_NO_RESPONSE	AM_PORT_DOWN	AM_UNREADY_ERROR	AM_TIME_OUT*********************************************************/int sp30_proc(int port_fd, int version, char *phone_number, TESTMSG * testmsg){	int ret;	struct tm *ctime;	time_t lt;#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	lp = backup_log("./sp30_drv.log");	fprintf(lp, "\n>>> Start SP30 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	sp30_version = version;	ret = f_sp30_test_process(port_fd, phone_number, testmsg);	write_msg("ret=", (unsigned char *) &ret, 4);#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	fprintf(lp, "\n>>> Stop SP30 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);}/* end of sp30_proc *//* Function sp30_conn_switch()   Call by TST-QUERY Test   Return:  0   OK   -1   Can not connect Switch, or Switch no response   -2   This value can not be returned *//*********************************************************Function:int sp30_conn_switch(int port_fd)Narrative:	Detect if interface to switch runs well by sending a wakeup signal or a command.Param:	int port_fd	- socket id Return:	0	OK.	-1	Switch port no ready.*********************************************************/int sp30_conn_switch(int port_fd){	int ret, ret_val;	struct tm *ctime;	time_t lt;#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	lp = backup_log("./sp30_drv.log");	fprintf(lp, "\n>>> Start SP30 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	ret = f_link_switch(port_fd);	if (!ret)		ret_val = -1;	else		ret_val = 0;#ifdef DEBUG	lt = time(NULL);	ctime = localtime(&lt);	fprintf(lp, "\n>>> Stop SP30 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_val);}/*********************************************************Function:int f_sp30_test_process(int port_fd, char *phone_number, TESTMSG * testmsg)Narrative:	Send test command to switch and get test value.Param:	int port_fd	- socket id	char *phone_number - char pointer to accessed telephone number string	TESTMSG * testmsg	- struct of test messageReturn:	0   OK or line busy or invalid telephone number.	AM_NO_RESPONSE	Connect to switch port fail.	AM_UNREADY_ERROR	Unused.*********************************************************/int f_sp30_test_process(int port_fd, char *phone_number, TESTMSG * testmsg){	int i;	int ret, retval = AM_UNREADY_ERROR;	int flag;	unsigned char this_to_sno;	int max_retrys;	flag = 0;	to_sno = 0;	to_rno = 0;	from_sno = 0;	from_rno = 0;	/* send link frame -- "0xff 0xfe" */	flag = f_link_switch(port_fd);	if (!flag)	{		write_msg("Fail!", (unsigned char *) "", 0);		return (AM_NO_RESPONSE);	}	else	{		write_msg("Link Switch OK!", (unsigned char *) "", 0);	}	max_retrys = 12;	flag = f_sp30_access_line(port_fd, phone_number, max_retrys);	if (flag == 0)	{		write_msg("Access Line Fail!", (unsigned char *) "", 0);		retval = AM_NO_RESPONSE;		goto sp30_drv_exit1;	}	else if (flag == 1)		write_msg("Access Line Succeed. Now we start test!", (unsigned char *) "", 0);	else if (flag == 2)	{		write_msg("Line is NULL!", (unsigned char *) "", 0);		strcpy(testmsg->TestResult.TestConclusion, "V08");		retval = 0;		goto sp30_drv_exit1;	}	else	{		write_msg("Line Busy!", (unsigned char *) "", 0);		strcpy(testmsg->TestResult.TestConclusion, "V6");		retval = 0;		goto sp30_drv_exit1;	}	/* send link frame -- "0xff 0xfe" */	flag = f_link_switch(port_fd);	if (!flag)	{		write_msg("Fail!", (unsigned char *) "", 0);		retval = AM_NO_RESPONSE;		goto sp30_drv_exit1;	}	else	{		write_msg("Wakeup OK!", (unsigned char *) "", 0);	}	/* start test MLCT */	max_retrys = 15;	flag = f_sp30_test_MLCT(port_fd, max_retrys);	if (flag)	{		if (flag == 1)		{			write_msg("Test MLCT Succeed!", (unsigned char *) "", 0);		}		else		{			write_msg("Test MLCT: High Volt!", (unsigned char *) "", 0);			retval = 0;			strcpy(testmsg->TestResult.TestConclusion, "V13");			goto sp30_drv_exit;		}	}	else	{		write_msg("Test MLCT Fail!", (unsigned char *) "", 0);		retval = AM_NO_RESPONSE;		goto sp30_drv_exit;	}	/* send link frame -- "0xff 0xfe" */	flag = f_link_switch(port_fd);	if (!flag)	{		write_msg("Fail!", (unsigned char *) "", 0);		retval = AM_NO_RESPONSE;		goto sp30_drv_exit;	}	else	{		write_msg("Wakeup OK!", (unsigned char *) "", 0);	}	/* start test V_R_CAP */	max_retrys = 20;	flag = f_sp30_test_V_R_CAP(port_fd, max_retrys, testmsg);	if (flag)	{		write_msg("Test V_R_CAP Succeed!", (unsigned char *) "", 0);		retval = 0;	}	else	{		write_msg("Test V_R_CAP Fail!", (unsigned char *) "", 0);		retval = AM_NO_RESPONSE;		goto sp30_drv_exit;	}sp30_drv_exit:	f_sp30_stop_test(port_fd);sp30_drv_exit1:	f_sp30_release_line(port_fd, phone_number);	f_sp30_release_line(port_fd, phone_number);	sleep(2);	return retval;}/* end f_sp30_test_process *//*********************************************************Function:int f_sp30_result_receive(int sock, unsigned char *szBuffer, int *len)Narrative:	Recieve responded string after send command.Param:	int sock - socket id	unsigned char *szBuffer - a pointer to receive_str	int *len - a pointer to length of recieved stringReturn:	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.*********************************************************/int f_sp30_result_receive(int sock, unsigned char *szBuffer, int *len){	int p;	int retval, ret, rc;	unsigned char ch;	unsigned char previous_char;	struct pollfd pollfdsp[1];	int first_flag;	pollfdsp[0].fd = sock;	pollfdsp[0].events = POLLIN;	pollfdsp[0].revents = 0;	retval = 0;	p = 0;	previous_char = '\0';	memset(szBuffer, 0, MAX_RECEIVE_LEN);	first_flag = 1;	while (1)	{		ret = poll(pollfdsp, 1, WAIT_TIME);		if (ret < 0)		{			retval = -3;			break;		}		else if (ret == 0)		{			retval = -2;			break;		}		if (pollfdsp[0].revents & POLLIN)		{			rc = read(sock, &ch, 1);			if (rc < 0)			{				retval = -3;				break;			}			if (rc == 0)			{				retval = -1;				break;			}			switch (ch)			{			case 0xfe:				if (!first_flag)				{					szBuffer[p] = ch;					++p;					*len = p;					if (previous_char == 0xff)					{						if (f_sp30_verify_package(receive_str, receive_len) == 0)							return 0;						else						{							write_msg("Can not pass verify!\n", receive_str, receive_len);							return 1;					/* Can not pass verify */						}					}				}				break;			case 0xff:				if (first_flag)				{					first_flag = 0;				}				szBuffer[p] = ch;				++p;				*len = p;				break;			case 0x00:

⌨️ 快捷键说明

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