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

📄 rc_ctl_data.c

📁 epoll机制的收发程序 只能在2.6内核上使用
💻 C
📖 第 1 页 / 共 3 页
字号:
	strcat(buf, tmp);
	
	bzero(tmp, sizeof(tmp));
	sprintf(tmp, "<address>%s</address>\r\n", msg.address);
	len += strlen(tmp);
	if(len > size)
		return -1;
	strcat(buf, tmp);
	
	bzero(tmp, sizeof(tmp));
	sprintf(tmp, "<camera ip=\"%s\" port=\"%u\" channel=\"%s\">%s</camera>\r\n", ip, port, msg.channel, msg.name_cam);
	len += strlen(tmp);
	if(len > size)
		return -1;
	strcat(buf, tmp);
	
	bzero(tmp, sizeof(tmp));
	sprintf(tmp, "</alarm>\r\n");
	len += strlen(tmp);
	if(len > size)
		return -1;
	strcat(buf, tmp);
	
	return len;
}

/*
 * 功  能:根据报警主机发送信息报警
 * 参  数:id:报警主机发送的id号码
 *         ctlinfo:链接相关信息
 * 返回值:成功返回值大于或者等于0,否则返回-1
 */
int rc_snd_alarm(unsigned short int id, struct_msg_con *ctlinfo)
{
	int						size = 1024;
	int						i;
	int						res;
	int						offset;
	int						len = 0;
#ifndef		XML_USED
	unsigned short int		len_s;//子包的长度
#endif
#ifndef		XML_LEN_TYPE_USED_NO
	unsigned int			len_f;//总包的长度
	unsigned short int		type;
#endif
	char					*buf;//要发送的信息缓冲区
	struct_msg_con			msg_cam;//摄像机的所有链接信息
	struct_msg_con			msg_cli;//报警客户端的所有链接信息
	struct_msg_alarm		alarm;//要报警的信息
	struct_task_net_w		*newsnd = NULL;
	
	
	/* 获取要报警的相关信息 */
	bzero(&alarm, sizeof(struct_msg_alarm));
	res = rc_msg_alarm(id, ctlinfo->serial, &alarm);
	if(res < 0)
	{
//		printf("\t\t\t ~~~~~~ %s %d ~~~~~~\n", __FILE__, __LINE__);
		return -1;
	}
	
	/* 获取报警客户端的所有链接信息 */
	bzero(&msg_cli, sizeof(struct_msg_con));
	pthread_mutex_lock(&mutex_con_t);
	res = rc_get_msg_all(alarm.ser_cli, head_con, TYPE_CONNECT_ALARM_CLIENT, &msg_cli);
	pthread_mutex_unlock(&mutex_con_t);
	if(res < 0)//报警客户端不在线
	{
	//	printf("\t\t\t ~~~~~~ %s %d serial : %s ~~~~~~\n", __FILE__, __LINE__, alarm.ser_cli);
		return -1;
	}
	
	/* 获取摄像机的相关信息 */
	bzero(&msg_cam, sizeof(struct_msg_con));
	pthread_mutex_lock(&mutex_con_t);
	res = rc_get_msg_all(alarm.ser_cam, head_con, TYPE_CONNECT_CAM, &msg_cam);
	pthread_mutex_unlock(&mutex_con_t);
	if(res < 0)//摄像机不在线
	{
	//	printf("\t\t ++++++ %s %d ++++++\n", __FILE__, __LINE__);
	//	bzero(&msg_cam, sizeof(struct_msg_con));
	}
	
	buf = malloc(size);
	if(buf == NULL)
	{
		return -1;
	}
	bzero(buf, size);
	offset = 0;
	
#ifndef		XML_LEN_TYPE_USED_NO
	/* 总包类型 */
	type = TYPE_P_F_MSG;
	offset += LEN_LEN_PACKET_FATHER;
	memcpy(buf + offset, &type, LEN_TYPE_PACKET_FATHER);
	offset += LEN_TYPE_PACKET_FATHER;
#endif

#ifdef		XML_USED
{
#ifndef		MYSQL_USED_YES
	msg_cam.local.ip.s_addr = inet_addr("169.254.2.114");
	msg_cam.local.port_nat = 8080;
#endif

#ifndef		XML_LEN_TYPE_USED_NO
	len_f = rc_xml_alarm(alarm, inet_ntoa(msg_cam.local.ip), msg_cam.local.port_nat, buf + offset, size - offset);
	len_f += LEN_TYPE_PACKET_FATHER;
	memcpy(buf, &len_f, LEN_LEN_PACKET_FATHER);
#else
	len = rc_xml_alarm(alarm, inet_ntoa(msg_cam.local.ip), msg_cam.local.port_nat, buf, size);
#endif

}
#else
{
	
	/* 子包长度 */
//	memcpy(buf + offset, &len_s, LEN_LEN_PACKET_CON);
	offset += LEN_LEN_PACKET_CON;
	
	/* 子包类型 */
	buf[offset] = TYPE_P_M_ALARM;
	offset += LEN_TYPE_PACKET_CON;
	len_s = LEN_TYPE_PACKET_CON;
	
	/* 填充ip */
	memcpy(buf + offset, &(msg_cam.address.sin_addr.s_addr), LEN_TYPE_UINT32);
	offset += LEN_TYPE_UINT32;
	len_s += LEN_TYPE_UINT32;
	
	/* 填充端口 */
	memcpy(buf + offset, &(msg_cam.local.port_nat), LEN_TYPE_UINT16);
	offset += LEN_TYPE_UINT16;
	len_s += LEN_TYPE_UINT16;
	
	/* 填充通道 */
	memcpy(buf + offset, &channel, LEN_TYPE_UINT16);
	offset += LEN_TYPE_UINT16;
	len_s += LEN_TYPE_UINT16;
	
	/* 填充地址 */
	len = strlen(address);
	memcpy(buf + offset, address, len);
	offset += len;
	len_s += len;
	
	
	
	/* 总包长度 */
	len_f = LEN_TYPE_PACKET_FATHER + LEN_TYPE_PACKET_FATHER + LEN_LEN_PACKET_CON + len_s;
	memcpy(buf, &len_f, LEN_LEN_PACKET_FATHER);
	offset = LEN_LEN_PACKET_FATHER + LEN_TYPE_PACKET_FATHER;
	
	/* 子包长度 */
	memcpy(buf + offset, &len_s, LEN_LEN_PACKET_CON);
	
	len = len_f + LEN_LEN_PACKET_FATHER;//信息总长度
}
#endif
	
#ifndef		XML_LEN_TYPE_USED_NO
	len = len_f + LEN_LEN_PACKET_FATHER;
#endif
	newsnd = rc_create_task_new_w(&msg_cli, TYPE_CONNECT_ALARM_CLIENT, NULL, buf, len);
	if(newsnd != NULL)
	{
		pthread_mutex_lock(&mutex_w_cam);
		for(i = 0; i < 10; i++)
		{
			res = rc_add_task_w(&task_w_cam, newsnd);
			if(res >= 0)
				break;
		}
		pthread_mutex_unlock(&mutex_w_cam);
		pthread_cond_broadcast(&cond_w_cam);
		if(i >= 10)
		{
			return -1;
		}
	}
	else
	{
		return -1;
	}
	
	return 0;
}

/*
 * 功  能:向摄像机发送要求延迟链接的命令
 * 参  数:ctlinfo:链接相关信息
 * 返回值:成功返回值大于或者等于0,否则返回-1
 */
int rc_reques_delay_cam(struct_msg_con *ctlinfo)
{
	int						res;
	char					type;
	unsigned short int		len_tmp;
	unsigned short int		len_con;
	unsigned int			len;
	unsigned char			temp[512];
	unsigned char			tmp_con[512];
	unsigned char			*buf = NULL;
	struct_msg_web			web;
	struct_task_net_w		*newsnd = NULL;
	
	
	
	bzero(&web, sizeof(struct_msg_web));
	web.action = TYPE_P_W_TOOL;
	web.web.tool.action = EVENT_TOOL_WEB_REQUEST_ALL;
	web.web.tool.space = space_delay;//要求space分钟后重新链接
	
	bzero(temp, sizeof(temp));
	len_tmp = 0;
	len_tmp = rc_create_packet_web(web, temp, getpid());
	if(len_tmp == 0)
	{
		return -1;
	}
	type = TYPE_P_C_WEB;
	
	bzero(tmp_con, sizeof(tmp_con));
	len_con = rc_create_packet_connect(temp, len_tmp, type, tmp_con);
	if(len_con == 0)
	{
		return -1;
	}
	
	buf = malloc(LEN_DATA_1024);
	if(buf == NULL)
		return -1;
	bzero(buf, LEN_DATA_1024);
	len = rc_create_packet(tmp_con, len_con, TYPE_P_F_CTL_CON, buf);
	if(len == 0)
	{
		free(buf);
		buf = NULL;
		return -1;
	}
	
	newsnd = rc_create_task_new_w(ctlinfo, TYPE_CONNECT_CAM, NULL, buf, len);
	pthread_mutex_lock(&mutex_w_cam);
	res = rc_add_task_w(&task_w_cam, newsnd);
	pthread_mutex_unlock(&mutex_w_cam);
	pthread_cond_broadcast(&cond_w_cam);
	
	return res;
}

/*
 * 功  能:创建网页相关的数据包
 * 参  数:webmsg:网页相关信息
 *         output:要输出的数据缓冲区
 *         pid:cgi进程的pid
 * 返回值:成功返回数据包的长度(包括包类型和长度),否则返回0
 */
unsigned short int rc_create_packet_web(struct_msg_web  webmsg, unsigned char *output, pid_t pid)
{
	int						offset;
	unsigned short int		temp;
	unsigned short int		len;
	
	unsigned char					temp1[6];
	
	offset = LEN_LEN_PACKET_WEB;
	
	output[offset] = webmsg.action;//网页类型
	offset += LEN_TYPE_PACKET_WEB;
	
	memcpy(output + offset, &pid, LEN_PID);//进程pid号码
	offset += LEN_PID;
	
	
	memcpy(temp1, &pid, LEN_PID);
	
	switch(webmsg.action)
	{
	case TYPE_P_W_INDEX://首页相关类型 1
		len = sizeof(struct_web_index);
		memcpy(output + offset, (unsigned char *)&webmsg.web.index, len);
		break;
	case TYPE_P_W_SYSTEM://系统相关类型 2
		len = sizeof(struct_web_sys);
		memcpy(output + offset, (unsigned char *)&webmsg.web.sys, len);
		break;
	case TYPE_P_W_SECURITY://安全相关类型 3
		len = sizeof(struct_web_security);
		memcpy(output + offset, (unsigned char *)&webmsg.web.security, len);
		break;
	case TYPE_P_W_NET://网络相关类型 4
		len = sizeof(struct_web_net);
		memcpy(output + offset, (unsigned char *)&webmsg.web.net, len);
		break;
	case TYPE_P_W_DDNS://DDNS相关类型 5
		len = sizeof(struct_web_ddns);
		memcpy(output + offset, (unsigned char *)&webmsg.web.ddns, len);
		break;
	case TYPE_P_W_MAILFTP://传输方式相关类型 6
		len = sizeof(struct_web_mailftp);
		memcpy(output + offset, (unsigned char *)&webmsg.web.mailftp, len);
		break;
	case TYPE_P_W_VIDEO://视音频相关类型 7
		len = sizeof(struct_web_video);
		memcpy(output + offset, (unsigned char *)&webmsg.web.application, len);
		break;
	case TYPE_P_W_TRIGGER://应用相关类型 8
		len = sizeof(struct_web_application);
		memcpy(output + offset, (unsigned char *)&webmsg.web.video, len);
		break;
	case TYPE_P_W_TOOL://工具相关类型 9
		len = sizeof(struct_web_tool);
		memcpy(output + offset, (unsigned char *)&webmsg.web.tool, len);
		break;
	case TYPE_P_W_UPDATE://软件更新相关类型 10
		len = sizeof(struct_web_update);
		memcpy(output + offset, (unsigned char *)&webmsg.web.update, len);
		break;
	default:
		return 0;
		break;
	}
	temp = len + LEN_TYPE_PACKET_WEB + LEN_PID;
	memcpy(output, (unsigned char *)&temp, LEN_LEN_PACKET_WEB);
	return (len + offset);//要加上数据包类型的长度和数据包的长度所占的长度
}


/*
 * 功  能:创建链接控制的数据包
 * 参  数:input:输入的数据
 *         len_input:输入的数据长度
 *         type:链接控制类型
 *         output:输出缓冲区
 * 返回值:成功返回数据包的长度(包括包类型和长度),否则返回0
 */
unsigned short int rc_create_packet_connect(unsigned char *input, unsigned short int len_input, unsigned char type, unsigned char *output)
{
	int						offset;
	unsigned short int		temp;
	unsigned short int		len;
	
	
	offset = LEN_LEN_PACKET_CON;
	output[offset] = type;
	
	offset += LEN_TYPE_PACKET_CON;
	switch(type)
	{
	case TYPE_P_C_WEB://网页相关包类型
		memcpy(output + offset, input, len_input);
		len = len_input;
		break;
	case TYPE_P_C_LINK_ASK://链接请求包类型
		memcpy(output + offset, input, len_input);
		len = len_input;
		break;
	case TYPE_P_C_RETURN://返回结果包类型
		return 0;
		break;
	case TYPE_P_C_HEART://心跳包类型
		return 0;
		break;
	case TYPE_P_C_EVENT://事件包类型
		return 0;
		break;
	default:
		return 0;
		break;
	}
	
	temp = len + LEN_TYPE_PACKET_CON;
	memcpy(output, (unsigned char *)&temp, LEN_LEN_PACKET_CON);
	
	return (len + offset);//要加上数据包类型的长度和数据包的长度所占的长度
}

/*
 * 功  能:向摄像机请求所有相关信息
 * 参  数:ctlinfo:链接相关信息
 * 返回值:成功返回值大于或者等于0,否则返回-1
 */
int rc_reques_data_all_cam(struct_msg_con *ctlinfo)
{
	int						res = 0;
	unsigned short int		len_tmp;
	unsigned short int		len_con;
	unsigned int			len;
	unsigned char			temp[512];
	unsigned char			tmp_con[512];
	unsigned char			*buf = NULL;
	char					type;
	struct_msg_web			web;
	struct_task_net_w		*newsnd = NULL;
	
	bzero(&web, sizeof(struct_msg_web));
	web.action = TYPE_P_W_TOOL;
	web.web.tool.action = EVENT_TOOL_WEB_REQUEST_ALL;
	
	bzero(temp, sizeof(temp));
	len_tmp = 0;
	len_tmp = rc_create_packet_web(web, temp, getpid());
	if(len_tmp == 0)
	{
		return -1;
	}
	type = TYPE_P_C_WEB;

	bzero(tmp_con, sizeof(tmp_con));
	len_con = rc_create_packet_connect(temp, len_tmp, type, tmp_con);
	if(len_con == 0)
	{
		return -1;
	}
	
	buf = malloc(LEN_DATA_1024);
	if(buf == NULL)
		return -1;
	bzero(buf, LEN_DATA_1024);
	len = rc_create_packet(tmp_con, len_con, TYPE_P_F_CTL_CON, buf);
	if(len == 0)
	{
		free(buf);
		buf = NULL;
		return -1;
	}
	
	newsnd = rc_create_task_new_w(ctlinfo, TYPE_CONNECT_CAM, NULL, buf, len);
	pthread_mutex_lock(&mutex_w_cam);
	res = rc_add_task_w(&task_w_cam, newsnd);
	pthread_mutex_unlock(&mutex_w_cam);
	
	return res;
}


/*
 * 功  能:解析并处理网络部分的网页相关数据
 * 参  数:data:数据
 *         len_d:数据长度
 *         serial:摄像机序列号
 * 返回值:成功返回值大于或者等于0,否则返回值小于0
 */
int rc_deal_web_net(unsigned char *data, int len_d, const unsigned char *serial, struct_lab_mysql *mysql_lab)
{
	int							res;
	unsigned short int			len;
	unsigned char				type;
	
	while(1)
	{
		len = 0;

⌨️ 快捷键说明

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