📄 net_cmd.cpp
字号:
* 也即发送的数据为TMVD + CMD, 共5字节 (例如取得系统时间,与通道无关)
* 否则发送的数据为TMVD + CMD + chnl, 共6字节
*/
int size = (chnl==-1)?0:1;
switch(no)
{
case OPT_SYS_TIME:
msg = NETCOM_GETSYSTIME_CTRL;
break;
case OPT_SYS_IP:
msg = NETCOM_GETNETADDR_CTRL;
break;
case OPT_REC:
msg = NETCOM_GETRECPARA_CTRL;
break;
case OPT_SCHED:
msg = NETCOM_GETSCHDREC_CTRL;
break;
case OPT_MD:
msg = NETCOM_GETMOVEREC_CTRL;
break;
case OPT_ALARM:
msg = NETCOM_GETALARMREC_CTRL;
break;
case OPT_REC_ENABLE:
msg = NETCOM_GETRECPORT_CTRL;
break;
case OPT_TITLE:
msg = NETCOM_GETPORTTITLE_CTRL;
break;
case OPT_VOD_DATE:
msg = NETCOM_QUERY_RECDATE;
break;
case OPT_VOD_BACKUP_DATE:
msg = NETCOM_QUERY_BACKUP_DATE;
break;
case OPT_VOD_FILE:
msg = NETCOM_QUERY_RECFILE;
size = sizeof(DWORD);
break;
case OPT_VOD_BACKUP_FILE:
msg = NETCOM_QUERY_BACKUP_FILE;
size = sizeof(DWORD);
break;
case OPT_VIDEO:
msg = NETCOM_GET_VIDEO;
break;
case OPT_BAUDRATE:
msg = NETCOM_GET_BAUDRATE;
break;
case OPT_VIDEOPARA:
msg = NETCOM_GET_VIDEOPARA;
break;
default: // 未知参数
return;
}
// last_ip = rip;
// last_port = rport;
if( cb )
gc = cb ;
send_cmd(rip, rport, msg, (char*)&chnl, size) ;
}
void net_cmd::get_options_file(IPPORT, byte * m_byte, OPT_GET_CALLEE cb)
{
if( cb ) gc = cb ;
send_cmd(rip, rport, NETCOM_QUERY_RECFILE, (char*)m_byte, 5) ;
}
void net_cmd::get_options_backup_file(IPPORT, byte * m_byte, OPT_GET_CALLEE cb)
{
if( cb ) gc = cb ;
send_cmd(rip, rport, NETCOM_QUERY_BACKUP_FILE, (char*)m_byte, 5) ;
}
//##ModelId=3F9A1D23032F
void net_cmd::switch_audio(int group)
{
net_av::switch_audio(group);
}
//##ModelId=3F9A1D23034E
VOD_SPEED net_cmd::get_vod_speed(ULONG ip,int group)
{
return (VOD_SPEED)vod_if[group].speed;
}
//##ModelId=3F9A1D230357
void net_cmd::request_vod(ULONG rip, LONG rport,
const TREC_FILETIME* ft,
VOD_CMD cmd,
int group,
VIDEO_CALLEE cb)
{
if( cmd == VOD_REQ )
{
vod_group = group;
nCurVodGroup[group] = group ;
av[group]->set_cb(cb);
av[group]->set_play_mode(VS_PLAYx1);
vod_if[group].ip = rip;
vod_if[group].port = rport;
vod_if[group].speed = VS_PLAYx1;
vod_if[group].group = group;
//fprintf(fppppp, "send the request vod cmd group = %d\n", group);
send_cmd(rip, rport, NETCOM_VOD_RECFILE_REQ, (char*)ft, sizeof(TREC_FILETIME));
}
if( cmd == VOD_SET_SPEED )
{
if(!is_voding(group))
return;
if( cb )
POST_NOTIFY(cb, NTM_VOD_SET_SPEED, rip, rport);
if (rport == VS_PLAYx1)
{
vod_mute[group] = false ;
nVodLostVideoNum[group] = nVodListRr[group] = nVodListWr[group] = 0 ;
}
else
{
vod_mute[group] = true ;
}
if (rport == VS_FRAME)
{
vod_if[group].speed = VS_FRAME;
av[group]->set_play_mode(VS_FRAME) ;
request_vod_frame(rip, vod_if[group].port, vod_if[group].mport,VS_FRAME,group) ;
return ;
}
vod_if[group].speed = rport;
av[group]->set_play_mode(rport) ;
}
if (cmd == VOD_END)
{
if(!is_voding(group))
return;
int m_version = get_login_version(rip, rport);
if(m_version)
{
unsigned char m_str[2];
if(m_version == 1)
{
m_str[0] = vod_if[group].mport;
m_str[1] = (vod_if[group].mport>>8);
}
else if(m_version == 2)
{
m_str[0] = 0;
m_str[1] = 0;
}
send_cmd_data(rip, rport, NETCOM_VOD_RECFILE_END, (char *)m_str, 2, group);
}
else
send_cmd_data(rip, rport, NETCOM_VOD_RECFILE_END, NULL, 0, group);
close_vod(group) ;
nVodLostVideoNum[group] = nVodListRr[group] = nVodListWr[group] = 0 ;
}
}
//##ModelId=3F9A1D230393
void net_cmd::start_local_record(int group, TCHAR drive)
{
// if( av[group]->lc.lr_is_recording() )
// return;
if (group == VOD_GROUP)
group = vod_group ;
// av[group]->lr_begin(group, drive);
av[group]->lr_begin(drive);
}
//##ModelId=3F9A1D2303A7
void net_cmd::stop_local_record(int group)
{
if( group == VOD_GROUP )
group = vod_group;
av[group]->lr_end();
}
//##ModelId=3F9A1D2303BB
void net_cmd::get_local_record(int group, TCHAR* drive)
{
if( group == VOD_GROUP )
group = vod_group;
av[group]->lr_get_drive(drive);
// if( av[group]->lr_is_recording() )
// *drive = av[group]->lr_get_drive();
// else
// *drive = 0;
}
//##ModelId=3F9A1D2303CF
void net_cmd::start_talk(IPPORT,int channel, BACKUP_CALLEE cb)
{
int i ;
for (i=0;i<MAX_TALKING_THREAD_NUM;i++) {
if (talk_ip[i] == rip && talk_port[i] == rport) {
return ;
}
}
for (i=0;i<MAX_TALKING_THREAD_NUM;i++)
{
if (ptalkTh[i] == NULL)
break ;
}
if (i >= MAX_TALKING_THREAD_NUM)
return ;
talkcb = cb ;
ptalkTh[i] = new net_bk ;
if(ptalkTh[i] == NULL)
{
stop_talk(rip, rport);
return;
}
talk_timeout[i] = 0 ;
ptalkTh[i]->bkcb = cb ;
talk_ip[i] = rip ;
talk_port[i] = rport ;
talk_channel[i] = channel;
char temchannel[1]={(char)channel};
send_cmd(rip, rport, NETCOM_TALK_REQ, temchannel, 1) ;
}
void net_cmd::stop_talk(ULONG rip, USHORT rport)
{
for (int i=0;i<MAX_TALKING_THREAD_NUM;i++)
{
if (talk_ip[i] == rip && talk_port[i] == rport)
{
if(ptalkTh[i] && ptalkTh[i]->backup_is_start)
{
clear_talk(rip, rport) ;
send_cmd(rip, rport, NETCOM_TALK_END, NULL, 0) ;
}
break;
}
}
}
void net_cmd::clear_talk(ULONG rip, USHORT rport)
{
for (int i=0;i<MAX_TALKING_THREAD_NUM;i++) {
if (talk_ip[i] == rip)
{
talk_ip[i] = 0 ; talk_port[i] = 0 ;talk_channel[i]=0;
if (ptalkTh[i])
{
ptalkTh[i]->destroy() ;
delete (ptalkTh[i]) ;
ptalkTh[i] = NULL ;
}
talk_timeout[i] = 0 ;
break ;
}
}
}
void net_cmd::check_talk()
{
for (int i=0;i<MAX_TALKING_THREAD_NUM;i++) {
if (ptalkTh[i] && ptalkTh[i]->IsExit()) {
if (++talk_timeout[i] > 5) {
send_cmd(talk_ip[i], talk_port[i], NETCOM_TALK_END, NULL, 0) ;
POST_NOTIFY(talkcb, NTM_TALK_FAILED, talk_ip[i], talk_port[i])
clear_talk(talk_ip[i], talk_port[i]) ;
}
}
}
}
void net_cmd::get_disk_info(ULONG rip, ULONG rport)
{
send_cmd(rip, rport, NETCOM_GET_DISKINFO, NULL, 0) ;
}
void net_cmd::start_backup(ULONG rip, USHORT rport, TREC_BACKUPTIME* opt, BACKUP_CALLEE cb)
{
int i ;
for (i=0;i<MAX_BACKUP_THREAD_NUM;i++) {
if (bk_ip[i] == rip) {
return ;
}
}
for (i=0;i<MAX_BACKUP_THREAD_NUM;i++) {
if (pBackupTh[i] == NULL)
break ;
}
if (i >= MAX_BACKUP_THREAD_NUM)
return ;
//may backup...
bkcb = cb ;
pBackupTh[i] = new net_bk ;
timeout[i] = 0 ;
pBackupTh[i]->bkcb = cb ;
bk_ip[i] = rip ;
bk_port[i] = rport ;
pBackupTh[i]->set_path(opt->sBackDir) ;
send_cmd(rip, rport, NETCOM_BACKUP_RECFILE_REQ, (char*)opt, 10) ;
}
//##ModelId=3F9A1D240005
void net_cmd::stop_backup(ULONG rip, USHORT rport)
{
for (int i=0;i<MAX_TALKING_THREAD_NUM;i++)
{
if (bk_ip[i] == rip && bk_port[i] == rport)
{
if(pBackupTh[i] && pBackupTh[i]->backup_is_start)
{
clear_backup(rip, rport) ;
send_cmd(rip, rport, NETCOM_BACKUP_STOP_REQ, NULL, 0) ;
}
break;
}
}
}
void net_cmd::clear_backup(ULONG rip, USHORT rport)
{
for (int i=0;i<MAX_BACKUP_THREAD_NUM;i++) {
if (bk_ip[i] == rip) {
bk_ip[i] = 0 ; bk_port[i] = 0 ;
if (pBackupTh[i]) {
pBackupTh[i]->destroy() ;
delete (pBackupTh[i]) ;
pBackupTh[i] = NULL ;
}
timeout[i] = 0 ;
break ;
}
}
}
void net_cmd::check_backup()
{
for (int i=0;i<MAX_BACKUP_THREAD_NUM;i++) {
if (pBackupTh[i] && pBackupTh[i]->IsExit()) {
if (++timeout[i] > 5) {
if(!pBackupTh[i]->IsFinished())
send_cmd(bk_ip[i], bk_port[i], NETCOM_BACKUP_STOP_REQ, NULL, 0) ;
clear_backup(bk_ip[i], bk_port[i]) ;
//fprintf(fppppp, "check_backup clear no=%d ... ip=%08x\n", i, bk_ip[i]) ;
}
}
}
}
//##ModelId=3F9A1D230339
void net_cmd::mute(BOOL mute)
{
if (mute)
net_av::mute();
else
net_av::unmute();
}
/*
* 断开连接, 删除该主机的特权信息
*/
//##ModelId=3F9A1D2301BC
void net_cmd::remove_priv(ULONG ip, ULONG port)
{
connected.remove(privilege(ip, port, privNONE));
}
/*
* 连接上, 保存该主机的特权信息
*/
//##ModelId=3F9A1D23019E
void net_cmd::add_priv(ULONG ip, ULONG port, PRIVILEGE priv)
{
/* for( pit it=connected.begin(); it!=connected.end(); it++ )
{
privilege& ref = *it;
if( ref == privilege(ip, port, privNONE) )
{
ref.set_priv(priv);
return;
}
}
*/
for( pit it=connected.begin(); it!=connected.end(); it++ )
{
privilege& ref = *it;
if((ref.get_ip() == ip)&&(ref.get_port() == port))
if(ref.get_priv() == priv) break;
else
{
remove_priv(ip,port);
break;
}
}
connected.push_back(privilege(ip, port, priv));
connected.unique();
}
//##ModelId=3F9A1D2300F4
void net_cmd::on_net_udp_recv(byte* buf, int length, net_addr* from)
{
#define IPPORT_PARAM last_ip, last_port
//last_port = htons(from->port());
// 登录成功
if( CMD_OF(buf) is NETCOM_LOGIN_OK )
{
nt_cmd_login_ok clo;
clo.ip = from->ip();
clo.port = last_port;
clo.channel_count = DATA_OF(buf)[0];
if(!get_login_version(from->ip(),last_port))
{
clo.privilege = (PRIVILEGE)DATA_OF(buf)[1];
clo.version=false;
}
else
{
if(length == 15)
clo.privilege = get_login_station_version(DATA_OF(buf)[9]);
else
clo.privilege=privNEWVERSION;
clo.version=true;
clo.portpopedom=*(DWORD*)DATA_OF(buf+1);
clo.actionpopedom=*(DWORD*)DATA_OF(buf+5);
}
for(int i=0;i<m_loginlength;i++)
{
if(from->ip()==login_if[i].ip && last_port == login_if[i].port)
{
if(DATA_OF(buf)[9] == 66)
login_if[i].version = 2;
login_if[i].connecttime = 0;
break;
}
}
if(ctlcmd)
ctlcmd->insert_nettype(clo.ip, clo.port, TRUE);
add_priv(clo.ip, clo.port, clo.privilege);
SEND_NOTIFY(cmdcb, NTM_CMD_LOGIN_OK, (WPARAM)&clo, 0);
}
// 登出成功
if( CMD_OF(buf) is NETCOM_LOGOUT_OK )
{
POST_NOTIFY(cmdcb, NTM_CMD_LOGOUT_OK, last_ip, last_port);
}
// 请求实时图像成功
if( CMD_OF(buf) is NETCOM_OPEN_REALIMAGE_OK )
{
ULONG mip = 0;
USHORT mport = 0;
int channel = DATA_OF(buf)[0];
mip = *(ULONG*)DATA_OF(buf+1);
mport = *(USHORT*)DATA_OF(buf+1+sizeof(ULONG));
if(av[last_group]->svr_ip() != from->ip() || av[last_group]->svr_chnl() != channel)
return;
//fprintf(fppppp, "open_channel : ip = %ld, mport = %u, channel = %u\n",from->ip(), mport, channel) ;
if(!av[last_group]->open_channel(from->ip(), last_port, mip, mport, channel))
return;
//fprintf(fppppp, "net_cmd open_channel ip: %ld mip: %ld mport: %ld channel: %ld group: %ld \n", from->ip(), mip, mport, channel, last_group) ;
//for man net
if(m_real_mport) mport = m_real_mport;
m_real_mport = 0;
unsigned char SndBuf[30] ;
set_cmd_header((char *)SndBuf) ;
SndBuf[4] = NET_CLIENT_BURROW1 ;
SndBuf[5] = (mport>>8);
SndBuf[6] = mport & 0x00ff;
net_addr ad(from->ip(), htons(last_port)) ;
av[last_group]->send(SndBuf, 7, ad) ;
//cmdcb是发向rightlogin的消息句柄
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -