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

📄 net_cmdtcp.cpp

📁 实时监控
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "net_cmdtcp.h"
#include "../NetDef.h"
#include "net_avtcp.h"
#include "../thrd/thrd_decoder.h"
#include "../decoder/g722/G722Player.h"
#include "../../AudioRCVtcp.h"
#include "../notif/notif_alarm.h"
#include "net_factory.h"
#include "ip_port.h"

extern FILE  *fppppp ;
#define vod_window			256
extern int	  nvodtype[vod_window];
extern int    nCurVodGroup[vod_window], nVodLostVideoNum[vod_window] ;
extern unsigned char   nVodDelayList[10][vod_window] ;
extern unsigned char   nVodListRr[vod_window], nVodListWr[vod_window] ;

extern PCALLBACKSTREAMPROD pcallback[vod_window];
extern PCALLBACKDECODEDSTREAMPROD pdecodedcallback[vod_window];
extern pDraw_Add_Image     pdrawcallback[vod_window];

extern DWORD pcallback_user1[vod_window], pcallback_user2[vod_window];
extern DWORD pdecodedcallback_user1[vod_window], pdecodedcallback_user2[vod_window];
extern DWORD pdrawcallback_user1[vod_window], pdrawcallback_user2[vod_window];

CSoundintcp m_psoundtcp;

#define HEADER_SIZE	4
#define ID_SIZE		4
#define LEN_SIZE	2
#define CMD_SIZE	1

#define CMD_POS		10
#define DATA_POS	11

#define LOCAL_PORT	8101
#define REMOTE_PORT	8102

#define CMD_OF(x) ((x)[CMD_POS])
#define DATA_OF(x) ((x)+DATA_POS)

#define IPPORT ULONG rip, USHORT rport
#define IPP rip, rport

#define SAFE_DELETE(x) {delete (x); (x)=NULL;}

#define is ==
#define isnot !=

extern void shift(SHORT& s);
extern NET_OPTIONS trans_net_com(DWORD netcom);
extern USHORT trans_camera_cmd(CAMERA_CMD ccmd);
extern PRIVILEGE get_login_station_version(int m_id);

#define vod_interval_pal	40
#define vod_interval_ntsc	33
 
#define VOD_WINDOWS_COUNTS  8	
extern bool vod_mute[vod_window] ;
extern int time_vod_nub ;

extern net_factory *   ctlcmd;

bool is_cmd_data(byte* buf)
{
	if(buf[0] == 'S' && buf[1] == 'D')
		if(buf[2] == 'V' && buf[3] == 'R')
			return true;

	return false;
}

void set_cmdtcp_header(unsigned char* cmdbuf)
{
	cmdbuf[0] = 'S';
	cmdbuf[1] = 'D';
	cmdbuf[2] = 'V';
	cmdbuf[3] = 'R';
}

void set_idtcp(ULONG id, unsigned char * cmdbuf )
{
	cmdbuf[4] = id;
	cmdbuf[5] = id >> 8;
	cmdbuf[6] = id >> 16;
	cmdbuf[7] = id >> 24;
}

void set_cmdtcp(unsigned char* cmdbuf, char cmd)
{
	cmdbuf[CMD_POS] = cmd;
}

int set_datatcp(unsigned char* cmdbuf, const char* data, int datalen )
{
	cmdbuf[8] = datalen +1;
	cmdbuf[9] = (datalen +1)>>8;
	if( data )
	{
		memcpy(cmdbuf + DATA_POS, data, datalen);
		return datalen;
	}
	return 0;
}
//##ModelId=3F9A1D230162


DWORD CALLBACK shake_hand_tcp(LPVOID dwUser)
{
	net_cmdtcp* cmd = (net_cmdtcp*)dwUser;
	if(!cmd) return 0;
	while(1)
	{
		if(cmd->shake_exit)
			break;
		cmd->tcp_bitrate = 0;
		for(int i=0;i<vod_window;i++)
		{
			cmd->avtcp[i]->bitrate = 0;
			if(cmd->avtcp[i]->is_opened())
			{
				cmd->avtcp[i]->bitrate_1 = cmd->avtcp[i]->bitrate_2;
				cmd->avtcp[i]->bitrate_2 = cmd->avtcp[i]->bitrate_3;
				cmd->avtcp[i]->bitrate_3 = cmd->avtcp[i]->bitrate_4;
				cmd->avtcp[i]->bitrate_4 = cmd->avtcp[i]->bits;
				cmd->avtcp[i]->bitrate = (cmd->avtcp[i]->bitrate_1 + cmd->avtcp[i]->bitrate_2
					+ cmd->avtcp[i]->bitrate_3+ cmd->avtcp[i]->bitrate_4)>>2;// >>2 = ÷4;
				cmd->avtcp[i]->bits = 0;
			}
			cmd->tcp_bitrate += cmd->avtcp[i]->bitrate;
		}
		POST_NOTIFY(cmd->cmdcb, NTM_REFRESH_BITRATE, NULL, NULL);
		cmd->shake_hand();
		Sleep(1000);
	}
	return 0;
}

bool net_cmdtcp::creat_shakehand_thread()
{
	unsigned long id ;

	shake_handle = CreateThread(NULL, 0, shake_hand_tcp, this,	0, &id) ;
	if (!shake_handle)  
		return false;

	SetThreadPriority(shake_handle, THREAD_PRIORITY_NORMAL) ;
	return true;
}

void net_cmdtcp::close_shake_handle()
{
	shake_exit = true;
	if(!shake_handle) return;

	WaitForSingleObject(shake_handle, INFINITE) ;
	CloseHandle(shake_handle);
	shake_handle = NULL;
}


void net_cmdtcp::shake_hand()
{
	if (login_list.empty())
		return ;
	
	for (kit it = login_list.begin(); it != login_list.end(); it++)  
	{
		login_information ref = *it ;
		ULONG channels = send_open_channel(ref.ip, ref.port);
        
		unsigned char portinfo[14];
		portinfo[12] = channels & 0x00ff;
		portinfo[13] = channels >> 8;
		send_cmd(ref.ip, ref.port, NETCOM_SHAKE_HAND, (char *)portinfo, 14);	
	}
}

ULONG net_cmdtcp::send_open_channel(IPPORT)
{
	ULONG m_channels = 0;

     for( int i=0; i<max_channel; i++ )
	 {
		if(!avtcp[i]) continue;

		if( avtcp[i]->svr_ip() == rip && avtcp[i]->svr_port() == rport && avtcp[i]->svr_chnl() != VOD_GROUP)
		{
			m_channels = m_channels | operation_btye(avtcp[i]->svr_chnl());
		}

	 }
	 return m_channels;
}

ULONG net_cmdtcp::operation_btye(int m)
{
	ULONG k = 1;
	return k<<m;
}

//##ModelId=3F9A1D23013A

void net_cmdtcp::send_cmd(ULONG rip, USHORT rport, char cmd, const char* data, int datalen)
{
	int buflen = 0;
	unsigned char cmdbuf[100];
	
	set_cmdtcp_header(cmdbuf);			buflen += HEADER_SIZE;

	kit kkit = find_login(rip, rport);
	if(!kkit)return;

	set_idtcp(kkit->m_id, cmdbuf);		

	set_cmdtcp(cmdbuf, cmd);			buflen += CMD_SIZE;

	buflen += LEN_SIZE;	buflen += ID_SIZE;

	buflen += set_datatcp(cmdbuf, data, datalen);
	
	if(kkit->p)
		kkit->p->send_something((char *)cmdbuf, buflen);	
}

void net_cmdtcp::send_cmd_data(int group, char cmd, const char* data, int datalen)
{
	int buflen = 0;
	unsigned char cmdbuf[100];
	
	kit kkit = find_login(avtcp[group]->svr_ip(), avtcp[group]->svr_port());
	if(!kkit)
		return;

	set_cmdtcp_header(cmdbuf);			buflen += HEADER_SIZE;
	set_idtcp(kkit->m_id, cmdbuf);		buflen += ID_SIZE;

	set_cmdtcp(cmdbuf, cmd);			buflen += CMD_SIZE;
	buflen += LEN_SIZE;

	buflen += set_datatcp(cmdbuf, data, datalen);

	avtcp[group]->send_something((char *)cmdbuf, buflen) ;
}

void net_cmdtcp::send_cmd_bak(ULONG rip, USHORT rport, char cmd, const char* data, int datalen,  bak_talk_list & list)
{
	int buflen = 0;
	unsigned char cmdbuf[100];
	
	kit kkit = find_login(rip, rport);
	if(!kkit)
		return;

	dbit ddit = find_bak_talk_inf(rip, rport, list);
	if(!ddit)
		return;

	set_cmdtcp_header(cmdbuf);			buflen += HEADER_SIZE;
	set_idtcp(kkit->m_id, cmdbuf);		buflen += ID_SIZE;

	set_cmdtcp(cmdbuf, cmd);			buflen += CMD_SIZE;
	buflen += LEN_SIZE;

	buflen += set_datatcp(cmdbuf, data, datalen);

	ddit->p->send_something((char *)cmdbuf, buflen) ;
}
	
void net_cmdtcp::send_vodcmd_data(int group, char cmd, const char* data, int datalen)
{
	ULONG ip = avtcp[group]->svr_ip();
	USHORT port = avtcp[group]->svr_port();

	ULONG id = avtcp[group]->get_vod_id();
	if(!id) return;

	unsigned char cmdbuf[50];
	int length = 0;

	cmdbuf[0] = id;
	cmdbuf[1] = id >> 8;
	cmdbuf[2] = id >> 16;
	cmdbuf[3] = id >> 24;
	length += 4;
	
	memcpy(cmdbuf+length, data, datalen);
	length += datalen;

	send_cmd(ip, port, cmd, (char *)cmdbuf, length);
}

void net_cmdtcp::close_vod(int group)
{
	if(!avtcp[group]->is_vod())
		return ;

	pcallback[group] = NULL;
	pdrawcallback[group] = NULL;

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

	pdrawcallback_user1[group] = 0;
	pdrawcallback_user2[group] = 0;
	send_vodcmd_data(group, NETCOM_VOD_RECFILE_END, NULL, 0);

	avtcp[group]->leave();
	nVodLostVideoNum[group] = nVodListRr[group] = nVodListWr[group] = 0 ;
}

void net_cmdtcp::close_vod()
{
	vod_group = -1 ;
	for(int i=0;i<max_channel;i++)
	{
		nCurVodGroup[i] = -1 ;
		avtcp[i]->destroy();
	}
}

//////////////////////////////////////////////////////////////////////////
// 网络初始化

net_cmdtcp * net_cmdtcp::m_netcmdp = NULL;

net_cmdtcp::net_cmdtcp():  bkcb(NULL) ,vod_group(-1), 
last_group(0), cmdcb(NULL), shake_exit(false)
{
	m_netcmdp = this;
	palarmserver = NULL;
	tcp_bitrate = 0;
	for( int i=0; i<max_channel; i++ )
	{
		avtcp[i] = new net_avtcp(i) ;
		vod_mute[i] = false ;
	}
}

//##ModelId=3F9A1D230217
net_cmdtcp::~net_cmdtcp()
{
	destroy();

	for(int i=0; i<max_channel; i++)
	{
		SAFE_DELETE(avtcp[i]);
	}
	
}


UINT net_cmdtcp::get_bitrate(int group)
{
	return avtcp[group]->bitrate;
}

UINT net_cmdtcp::tcp_get_bitrate()
{
	return tcp_bitrate;
}

//##ModelId=3F9A1D230221
BOOL net_cmdtcp::create(IPPORT, CMD_CALLEE cb)
{
	cmdcb = cb ;
	if(!creat_shakehand_thread())
		return false;

	return true;
}

// 网络注销
void net_cmdtcp::destroy()
{
	extern timer dec_pal_timer;
	extern timer dec_nst_timer;
	dec_pal_timer.stop();
	dec_nst_timer.stop();
	
	for(kit bbit = login_list.begin(); bbit!= login_list.end(); bbit++)
	{
		login_information & ref = *bbit ;
		if(delete_login(ref.ip, ref.port))
			bbit--;
	}

	for(dbit bit = bak_list.begin(); bit != bak_list.end(); bit++)
	{
		bak_talk_information & ref = *bit ;
		if(delete_bak_talk_inf(ref.ip, ref.port, bak_list, true))
			bit--;
	}

	for(bit = talk_list.begin(); bit != talk_list.end(); bit++)
	{
		bak_talk_information & ref = *bit ;
		if(delete_bak_talk_inf(ref.ip, ref.port, talk_list, true))
			bit--;
	}
	
	close_alarm_server();
	close_vod();
	close_shake_handle();
	m_netcmdp = NULL;		
}

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

BOOL net_cmdtcp::login(IPPORT,LPCTSTR user, LPCTSTR password)
{
	unsigned char logstr[100];

	int m_userlen = strlen(user);
	int m_passlen = strlen(password);
	int m_length = m_userlen + m_passlen + 2;

	logstr[0] = m_userlen ;
	memcpy(logstr+1, user, m_userlen);

	logstr[m_userlen+1] = m_passlen ;
	memcpy(logstr + 2 + m_userlen, password, m_passlen);

	kit ppt = find_login(rip, rport);
	if(!ppt)
	{
		net_logintcp *p = new net_logintcp ;
		if(!p->create(rip, rport, LOCAL_PORT))
		{
			delete p;
			return FALSE;
		}
		
		insert_login(rip, rport, (ULONG)p);
	}

	send_cmd(rip, rport, NETCOM_LOGIN, (char*)logstr, m_length);
	return TRUE;
}

// 登出
//##ModelId=3F9A1D230267
BOOL net_cmdtcp::logout(IPPORT, BOOL close_remote)
{
	for( int i=0; i<max_channel; i++ )
	{
		if( avtcp[i]->svr_ip() == rip && avtcp[i]->svr_port() == rport )
		{
			close_remote_channel(i);
		}
	}

	send_cmd(rip, rport, NETCOM_LOGOUT, NULL, 0);
	delete_login(rip, rport);

	if(ctlcmd)
		ctlcmd->delete_nettype(rip, rport);

	POST_NOTIFY(cmdcb, NTM_CMD_LOGOUT_OK, rip, rport);
	return TRUE;
}

void net_cmdtcp::on_disconnect(ULONG ip, USHORT port)
{
	for( int i=0; i<max_channel; i++ )
	{
		if( avtcp[i]->svr_ip() == ip && avtcp[i]->svr_port() == port )
		{
			close_remote_channel(i);
		}
	}
	delete_login(ip, port);

	if(ctlcmd)
		ctlcmd->delete_nettype(ip, port);
	
	POST_NOTIFY(cmdcb, NTM_CMD_DISCONNECT_TIMEOUT, ip, port);
}

// 打开主机视频通道
//##ModelId=3F9A1D230285
BOOL net_cmdtcp::open_remote_channel(IPPORT, 
								  LONG channel_idx, 
								  LONG group, 
								  VIDEO_CALLEE cb,BOOL bUdpav)
{

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

	for( int i=0; i<max_channel; i++ )
	{
		if( !avtcp[i]->is_opened() )
			continue;

		ULONG ip = avtcp[i]->svr_ip();
		USHORT port = avtcp[i]->svr_port();
		int chnl = avtcp[i]->svr_chnl();
		
		if( ip == rip && port == rport && chnl == channel_idx )
		{
			return FALSE;
		}
	}
	
	avtcp[group]->set_cb(cb);

⌨️ 快捷键说明

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