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

📄 net_cmd.cpp

📁 实时监控
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}
	}
}

void net_cmd::check_connect_timeout()
{
	if(connected.empty() )
		return;

	for(int i=0;i<m_loginlength;i++)
	{
	  login_version *p = &login_if[i];
	  if( p->connecttime == -1)   continue;

      if(p->connecttime > timeout_connect)
	  {
         disconnect_timeout(p->ip , p->port);
		 p->connecttime = -1;
	  }
	  else p->connecttime++;
	}
}

 //连接超时处理
 void net_cmd::disconnect_timeout(ULONG ip, USHORT port)
 {
	POST_NOTIFY(cmdcb, NTM_CMD_DISCONNECT_TIMEOUT, ip, port);
	for( int i=0; i<max_channel; i++ )
	{
		if( av[i]->svr_ip() == ip && av[i]->svr_port() == port )
				close_local_channel(i);
	}
	remove_priv(ip,port);
 }

// 网络注销
void net_cmd::destroy()
{
	extern timer dec_pal_timer;
	extern timer dec_nst_timer;
	dec_pal_timer.stop();
	dec_nst_timer.stop();
	timer_vod_ctl_pal.stop();
	timer_vod_ctl_ntsc.stop();
	timer_shake_hand.stop();
	
	int  i ;
	for (i=0; i<MAX_BACKUP_THREAD_NUM; i++)  {
		if (pBackupTh[i])  {
			pBackupTh[i]->destroy() ;
			delete pBackupTh[i] ;
			pBackupTh[i] = NULL ;
		}
	}

	for (i=0; i<MAX_TALKING_THREAD_NUM; i++)  {
		if (ptalkTh[i])  {
			ptalkTh[i]->destroy() ;
			delete ptalkTh[i] ;
			ptalkTh[i] = NULL ;
		}
	}

	net_udp::destroy();
	
	for(int k=0;k<vod_window;k++)
	{
	 close_vod(k);
	}
	close_vod();
	
	for (i=0; i<max_channel; i++)
		av[i]->destroy();
	
	close_alarm_server();
	net_av::free_audio();	
}

// 登录
//##ModelId=3F9A1D230249

void net_cmd::initi_login_if(IPPORT,LPCTSTR user)
{
	login_version * p;
	for(int i=0;i<m_loginlength;i++)
	{
	  p = &login_if[i];
      if(rip == p->ip && rport == p->port)
	  {
		 if(!strcmp(user,"")) p->version=0;
		 else p->version=1;
		 return;
	  }
	}
	p = &login_if[m_loginlength];
	p->ip = rip;
	p->port = rport;
	p->connecttime = -1;                           //不一定登陆成功的ip的没有连接时间
	if(!strcmp(user,"")) p->version=0;        //old version
	else p->version=1;                         // new version
    m_loginlength++;
}

int net_cmd::get_login_version(IPPORT)
{
   for(int i=0;i<m_loginlength;i++)
   {
	   if(rip == login_if[i].ip && rport == login_if[i].port)
	  {
		 return login_if[i].version;
	  }
   }
  return 0;
}

BOOL net_cmd::login(IPPORT,LPCTSTR user, LPCTSTR password)
{
	int m_strlength=0;
	unsigned char logininformation[40];
	if(!strcmp(user,"")) 
	{
      m_strlength=strlen(password);
      memcpy(logininformation,password,strlen(password));
	}
	else
	{
	  m_strlength=strlen(user)+strlen(password)+2;
	  logininformation[0] = strlen(user) ;
	  memcpy(logininformation+1,user,strlen(user));
	  logininformation[strlen(user)+1] = strlen(password) ;
	  memcpy(logininformation+2+strlen(user),password,strlen(password));
	}
	initi_login_if(rip, rport, user);
	send_cmd(rip, rport, NETCOM_LOGIN, (char*)logininformation, m_strlength);
	return TRUE;
}

// 登出
//##ModelId=3F9A1D230267
BOOL net_cmd::logout(IPPORT, BOOL close_remote)
{
	remove_priv(rip, rport);
    POST_NOTIFY(cmdcb, NTM_CMD_LOGOUT_OK, rip, rport);

	for( int i=0; i<max_channel; i++ )
	{
		if( av[i]->svr_ip() == rip &&
			av[i]->svr_port() == rport )
		{
			if( close_remote )
				close_remote_channel(i);
			else
				close_local_channel(i);
		}
	}	
	send_cmd(rip, rport, NETCOM_LOGOUT, NULL, 0);

	if(ctlcmd)
		ctlcmd->delete_nettype(rip, rport);
	return TRUE;
}

// 打开主机视频通道
//##ModelId=3F9A1D230285
BOOL net_cmd::open_remote_channel(IPPORT, 
								  LONG channel_idx, 
								  LONG group, 
								  VIDEO_CALLEE cb)
{
	/*
	 *	禁止多次打开同一通道
	 */
	for( int i=0; i<max_channel; i++ )
	{
		if( !av[i]->is_opened() )
			continue;

		ULONG avip = av[i]->svr_ip();
		USHORT avport = av[i]->svr_port();
		int chnl = av[i]->svr_chnl();
		
		if( avip == rip &&
			avport == rport &&
			chnl == channel_idx )
		{
			return FALSE;
		}
	}

	/*
	 *	抄来得
	 */
	char portinfo[2] = {(char)channel_idx, 0};

	last_group = group;
	
	av[group]->set_cb(cb, rip, rport, channel_idx);

	send_cmd(rip, rport, NETCOM_OPEN_REALIMAGE_REQ, portinfo, 2);
	return TRUE;
}

// 关闭主机视频通道
//##ModelId=3F9A1D2302AD
BOOL net_cmd::close_remote_channel(LONG group)
{
	if( group >= max_channel )
		return FALSE;

	if( !av[group]->is_opened() )
		return FALSE;

	int chnl = av[group]->svr_chnl();
	char portinfo = (char)chnl;
	ULONG rip = av[group]->svr_ip();
	USHORT rport = av[group]->svr_port();
	send_cmd(rip, rport, NETCOM_CLOSE_REALIMAGE_REQ, &portinfo, 1);

	return close_local_channel(group);
}

/*
 *	关闭客户端(本地)视频通道
 */
//##ModelId=3F9A1D2302C1
BOOL net_cmd::close_local_channel(LONG group)
{
	pcallback[group] = NULL;
	pdrawcallback[group] = NULL;

	pcallback_user1[group] = 0;
	pcallback_user2[group] = 0;

	pdrawcallback_user1[group] = 0;
	pdrawcallback_user2[group] = 0;

	if(is_voding(group)) 
	{
		close_vod(group);
		return TRUE;
	}
	
	av[group]->leave();
	return TRUE;
}

NET_OPTIONS trans_net_com(DWORD netcom)
{
	switch(netcom)
	{
	case NETCOM_SETSYSTIME_CTRL:
	case NETCOM_GETSYSTIME_CTRL:
		return OPT_SYS_TIME;
	case NETCOM_SETNETADDR_CTRL:
	case NETCOM_GETNETADDR_CTRL:
		return OPT_SYS_IP;
	case NETCOM_SETRECPARA_CTRL:
	case NETCOM_GETRECPARA_CTRL:
		return OPT_REC;
	case NETCOM_SETSCHDREC_CTRL:
	case NETCOM_GETSCHDREC_CTRL:
		return OPT_SCHED;
	case NETCOM_SETMOVEREC_CTRL:
	case NETCOM_GETMOVEREC_CTRL:
		return OPT_MD;
	case NETCOM_SETALARMREC_CTRL:
	case NETCOM_GETALARMREC_CTRL:
		return OPT_ALARM;
	case NETCOM_SETRECPORT_CTRL:
	case NETCOM_GETRECPORT_CTRL:
		return OPT_REC_ENABLE;
	case NETCOM_SETPORTTITLE_CTRL:
	case NETCOM_GETPORTTITLE_CTRL:
		return OPT_TITLE;
	case NETCOM_SETDEFAULT_CTRL:
		return OPT_DEFAULT;
	case NETCOM_RECORD_DATE:
		return OPT_VOD_DATE;
	case NETCOM_RECORD_FILE:
		return OPT_VOD_FILE;
	case NETCOM_RECORD_DATE_EXT:
		return OPT_VOD_DATE_EXT;
	case NETCOM_RECORD_FILE_EXT:
		return OPT_VOD_FILE_EXT;
	case NETCOM_VOD_RECFILE_END:
		return OPT_VOD_END;
	case NETCOM_GET_VIDEO:
	case NETCOM_SET_VIDEO:
		return OPT_VIDEO;
	case NETCOM_GET_BAUDRATE:
	case NETCOM_SET_BAUDRATE:
		return OPT_BAUDRATE;
	case NETCOM_GET_VIDEOPARA:
	case NETCOM_SET_VIDEOPARA:
		return OPT_VIDEOPARA;
	default:	// 未知参数
		return OPT_INVALID;
	}
	return OPT_INVALID;
}

USHORT trans_camera_cmd(CAMERA_CMD ccmd)
{
static const USHORT ACT_CAMERA_CMD[] =
{
0x1704, //上
0x1708, //下
0x1710, //左
0x1714, //右
0x1a30, //摄像头变焦近(ZOOM+)
0x1a34, //摄像头变焦远(ZOOM-)
0x1aa2, //摄像头光圈+
0x1aa3, //摄像头光圈-
0x1aa1, //摄像头远
0x1aa0, //摄像头近
0x1aaa,
0x1aac,
0x1aa6, //摄像头自动
0x1ac0,
0x1aa4, //摄像头预置
0x1aa5, //摄像头调用
0x1aab, //F1+1
0x1aa7 //AUTO+1   
};

	return ACT_CAMERA_CMD[ccmd];

/*
enum ACT_CAMERA_CMD
{
   TM_R_KEYPAD_UP           = 0x1704, //上
   TM_R_KEYPAD_DOWN         = 0x1708, //下
   TM_R_KEYPAD_LEFT         = 0x1710, //左
   TM_R_KEYPAD_RIGHT        = 0x1714, //右
	
   TM_R_KEYPAD_ZOOMIN       = 0x1a30, //摄像头变焦近(ZOOM+)
   TM_R_KEYPAD_ZOOMOUT      = 0x1a34, //摄像头变焦远(ZOOM-)
   TM_R_KEYPAD_APERTURN_INC = 0x1aa2, //摄像头光圈+
   TM_R_KEYPAD_APERTURN_DEC = 0x1aa3, //摄像头光圈-
   TM_R_KEYPAD_FAR          = 0x1aa1, //摄像头远
   TM_R_KEYPAD_NEAR         = 0x1aa0, //摄像头近
   TM_R_KEYPAD_F1           = 0x1aaa,
   TM_R_KEYPAD_F2           = 0x1aac,
   TM_R_KEYPAD_AUTO         = 0x1aa6, //摄像头自动
   TM_R_KEYPAD_STOP         = 0x1ac0,
   TM_R_KEYPAD_PRESET_SET   = 0x1aa4, //摄像头预置
   TM_R_KEYPAD_PRESET_GET   = 0x1aa5 //摄像头调用
};
*/

}
//##ModelId=3F9A1D230180
bool net_cmd::is_admin(ULONG ip, ULONG port)
{
	for(int i=0;i<vod_window;i++)
	{
		if(login_if[i].ip==ip)
			if(login_if[i].version) return true;
	}
	for( pit it=connected.begin(); it!=connected.end(); it++ )
	{
		privilege& ref = *it;
		if( ref == privilege(ip, port, privNONE) )
		{
			if( !ref.is_admin() )
			{
				MessageBox(NULL, 
_T("You are logged in as User and you do NOT have the permission to perform the action, \n\
which requires the Administrator privilege. \n\n\
The request is always denied and the remote settings remain unchanged before you are an Administrator."), 
_T("Privilege limited"), MB_OK | MB_ICONWARNING );
				return false;
			}
			return true;
		}
	}
	return false;
}

//##ModelId=3F9A1D2302DF
void net_cmd::set_option(IPPORT, NET_OPTIONS no, void* stuff, OPT_SET_CALLEE cb)
{
	int size = 0;
	int msg = 0;
	bytebuf send(256);
	
	switch(no)
	{
	case OPT_SYS_TIME:
		if( !is_admin(rip, rport) )
			return ;
		msg = NETCOM_SETSYSTIME_CTRL ;
		size = sizeof(TSYS_TIME) ;
		memcpy(send, stuff, size) ;
		break;
	case OPT_SYS_IP:
		msg = NETCOM_SETNETADDR_CTRL ;
		size = sizeof(TNET_ATTRIBUTE) ;
		memcpy(send, stuff, size) ;
		break ;
	case OPT_REC:
		msg = NETCOM_SETRECPARA_CTRL;
		size = sizeof(TREC_PARAMETER);
		memcpy(send, stuff, size);
		break;
	case OPT_SCHED:
		msg = NETCOM_SETSCHDREC_CTRL;
		size = sizeof(TREC_SCHEDULEPARA);
		memcpy(send, stuff, size);
		break;
	case OPT_MD:
		msg = NETCOM_SETMOVEREC_CTRL;
		size = sizeof(TREC_MOTIONRECPARA);
		memcpy(send, stuff, size);
		break;
	case OPT_ALARM_16_AREA:
		msg = NET_SET_16_MOTION_AREA;
		size = sizeof(TREC_MOTIONRECPARA_16);
		memcpy(send, stuff, size);
		break;
	case OPT_ALARM_4_AREA:
		msg = NET_SET_4_MOTION_AREA;
		size = sizeof(TREC_MOTIONRECPARA_4);
		memcpy(send, stuff, size);
		break;
	case OPT_ALARM:
		msg = NETCOM_SETALARMREC_CTRL;
		size = sizeof(TREC_ALARMRECPARA);
		memcpy(send, stuff, size);
		{
			TREC_ALARMRECPARA* a = (TREC_ALARMRECPARA*)send.data();
			shift(a->recchannel);
		}
		break;
	case OPT_REC_ENABLE:
		msg = NETCOM_SETRECPORT_CTRL;
		size = sizeof(DWORD);
		memcpy(send, stuff, size);
		break;
	case OPT_TITLE:
		if( !is_admin(rip, rport) )
			return;

		msg = NETCOM_SETPORTTITLE_CTRL;
		size = sizeof(TREC_CHANNELTITLE);
		memcpy(send, stuff, size);
		break;
	case OPT_DEFAULT:
		if( !is_admin(rip, rport) )
			return;
		msg = NETCOM_SETDEFAULT_CTRL;
		size = 0;
		break;
	case OPT_CAMERA:
		msg = NETCOM_CAMERA_CTRL;
		size = sizeof(TREC_CAMERA);
		memcpy(send, stuff, size);
		{
			TREC_CAMERA* c = (TREC_CAMERA*)send.data();
			c->cmd = trans_camera_cmd((CAMERA_CMD)c->cmd);
			if (c->cmd == 0x1aa4 || c->cmd == 0x1aa5)  {
				c->preset ++ ;
			}
		}
		break;
	case OPT_VIDEO:
		msg = NETCOM_SET_VIDEO;
		size = sizeof(TREC_VIDEO);
		memcpy(send, stuff, size);
		break;

	case OPT_BAUDRATE:
		msg = NETCOM_SET_BAUDRATE;
		size = sizeof(TREC_BAUDRATE);
		memcpy(send, stuff, size);
		break;

	case OPT_VIDEOPARA :
		msg = NETCOM_SET_VIDEOPARA ;
		size = sizeof(TREC_VIDEOPARA) ;
		memcpy(send, stuff, size) ;
		break ;

	default:	// 未知参数
		return;
	}
//	last_ip = rip;
//	last_port = rport;
	/*
	 *	添加回调, 以备客户能够得到消息
	 */
	if( cb )
		sc = cb;
	send_cmd(rip, rport, msg, (char*)send.data(), size) ;
	//fprintf(fppppp, "set_option cmd=%ld, size=%ld...\n", msg, size) ;
}

//##ModelId=3F9A1D230307
void net_cmd::get_option(IPPORT, NET_OPTIONS no, int channel, OPT_GET_CALLEE cb)
{
	int msg = 0;
	int chnl = channel;
	/*
	 *	如果chnl == -1, size 为0

⌨️ 快捷键说明

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