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

📄 outdevicemanage.cpp

📁 学习java的经典教程源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//}

}



void    ManageOneDev::WriteRunLog(char* pinfo)
{
	FILE *fp = fopen("d:\\yk.txt","a+");
	if(fp)
	{
		char txt[512];
		sprintf(txt,"%s\r\n", pinfo);
		fputs(txt,fp);
		fclose(fp);
	}
}

void    ManageOneDev::SetCurState(OUDEV_CUR_STAT state)
{
	if (m_curstat != spoll)
		m_curstat = state;
}

void ManageOneDev:: GetBhOfRealId(int dsid, int fnid, int*temdsid, int* temfnid)
{		
	int nNum = GetPrivateProfileInt("ds", "num", 0, m_concmd.m_DCINIPath);//ds数量
	for (int i=1; i<nNum+1; i++)
	{
		char cnds[20];
		sprintf(cnds, "ds%d", i);
		int nDsNum = GetPrivateProfileInt("ds", cnds, 0, m_concmd.m_DCINIPath);	
		{
			char crealdsid[20];
			sprintf(crealdsid, "ds%d", i);
			int nRealDsId = GetPrivateProfileInt("ds", crealdsid, 0, m_concmd.m_DCINIPath); 
			if (nRealDsId == dsid)
			{
				// dsi
				*temdsid = i;
				char csubds[20];
				sprintf(csubds, "ds%d", i);
				int nFnCount = GetPrivateProfileInt(csubds, "num", 0, m_concmd.m_DCINIPath);
				for (int j=1; j<nFnCount+1; j++)
				{
					char cfnid[20];
					sprintf(cfnid, "fn%d", j);
					int nRealFnid = GetPrivateProfileInt(csubds, cfnid, 0, m_concmd.m_DCINIPath);
					if (nRealFnid == fnid)
					{
						*temfnid = j;
						break;
					}
				}
			break;
			}
		}
	}
}

void ManageOneDev::WriteCurStateToIni(int dsid, int fnid)//将当前的dsid、fnid写入配置文件
{
	DeviceControlCommand devicecontrolcommand;
	char dev[20];
	sprintf(dev, "DEV%d", m_bh);
	char cdsid[10], cfnid[10];
	sprintf(cdsid, "%d", dsid);
	sprintf(cfnid, "%d", fnid);
	WritePrivateProfileString(dev,"DSID",cdsid,devicecontrolcommand.m_DCINIPath);
	WritePrivateProfileString(dev,"FNID",cfnid,devicecontrolcommand.m_DCINIPath);		
}

bool    ManageOneDev::SendControlCommand(FN_CONTROL_TYPE cmdtype)
{
	bool bVal = false;
	
	int nSessionId = getIOpMedia().findSessionId(m_curDsId, m_curFnId);
	if (0 < nSessionId)
	{		
		ControlCommand Controlcmd;
		Controlcmd.id = getIOpFn().getDeviceId(nSessionId,CHILD_YUTAI_DEVICE);
		Controlcmd.controlType = cmdtype;//OP_UP_STOP;
		char cbh[20];
		sprintf(cbh, "%d", m_bh);
		sprintf(Controlcmd.Controluser, "%s%s", cbh, "号遥控器");
		if (getIOpFn().ctrlFn(nSessionId, Controlcmd))
		{
			bVal = true;
		}
		else
		{
			bVal = false;
		}
	}

	return bVal;
}

void    ManageOneDev::OpenOneFn()
{
	//发送消息到主界面,只发送打开命令	
	SENDTOFACE_MESS mess;
	mess.dsid = m_curDsId;
	mess.fnid = m_curFnId;
	mess.jmqid = m_bh;
	mess.jmqport = m_jmqport;
	strcpy(mess.jmqip, m_jmqip);
	::SendMessage(m_hwnd, WM_OUTDEV_MESS, 0, (LPARAM)&mess);	
}

void    ManageOneDev::CloseOneFn()
{
	//发送消息到主界面,只发送打开和关闭命令	
	SENDTOFACE_MESS mess;
	mess.dsid = m_curDsId;
	mess.fnid = m_curFnId;
	mess.jmqid = m_bh;	
	strcpy(mess.jmqip, m_jmqip);
	::SendMessage(m_hwnd, WM_OUTDEV_MESS, 1, (LPARAM)&mess);	
}

void    ManageOneDev::MakeDsId(int nSubDsId)
{
	m_curDsId = nSubDsId;	
}

void    ManageOneDev::MakeFnId(int nSubFnId)
{
	m_curFnId = nSubFnId;
}

void    ManageOneDev::ReadDsFnList()
{
	//读ds个数
	DeviceControlCommand devcommand;
	int nDsNum = GetPrivateProfileInt("ds","num",0,devcommand.m_DCINIPath);
	for (int i=1; i<nDsNum+1; i++)//i:用户选择的dsid
	{
		char cdsname[50];
		sprintf(cdsname, "ds%d", i);
		int nRealDsId = GetPrivateProfileInt("ds",cdsname,0,devcommand.m_DCINIPath);
		SELDSFN_ITEM item;
		item.realdsid = nRealDsId; 
		int nFnNum = GetPrivateProfileInt(cdsname,"num", 0, devcommand.m_DCINIPath);
		for (int j=1; j<nFnNum+1; j++)//用户选择的fnid
		{
			char cfnname[50];
			sprintf(cfnname, "fn%d", j);
			int nFnId = GetPrivateProfileInt(cdsname, cfnname, 0, devcommand.m_DCINIPath);
			item.fnlist.insert(pair<int, int>(j, nFnId));//cph?
		}
		m_seldsfnlist.insert(pair<int, SELDSFN_ITEM>(i, item));//cph?
	}
}

void ManageOneDev::GetRealDsFnId(int nSelDsId, int nSelFnid, int* pRealDsid, int* pRealFnid)//?
{

	std::map<int, SELDSFN_ITEM>::iterator itSelOne;
	itSelOne = m_seldsfnlist.find(nSelDsId);
	if (itSelOne != m_seldsfnlist.end())
	{
		SELDSFN_ITEM  item;
		item = itSelOne->second;
		*pRealDsid = item.realdsid;

		std::map<int,int>::iterator itFn;
		itFn = item.fnlist.find(nSelFnid);
		if (itFn!= item.fnlist.end())
		{
			*pRealFnid = itFn->second;
		}
	}
}


//************************************************************************************
//ConnectOutDevice:通信类
//
//
//*************************************************************************************
//ConnectOutDevice类
void    ConnectOutDevice::Stop()
{
	m_bExit = true;
}	
													
void    ConnectOutDevice::Start()
{
	boost::thread   thrd1(boost::bind(&ConnectOutDevice::Run, this));
}

void    ConnectOutDevice::LoginServer(CMySocket& socket)
{
	socket.SetBlock(true);
	struct sockaddr_in skt;
	memset(&skt,0,sizeof(skt));
	skt.sin_port=htons(m_portnum);
	skt.sin_family=AF_INET;
	skt.sin_addr.s_addr=inet_addr(m_nportip);
	SOCKET sock = socket.GetSocket();
	/////////////////////////////////////////////////////////////////////////////重连服务器			
	bool bHaveConnect = false;
	while (!m_bExit && !bHaveConnect)
	{
		Wait(500);
		if(connect(sock, (struct sockaddr *)&skt,sizeof(skt)) == SOCKET_ERROR )
		{					
			if (WSAGetLastError() == WSAEWOULDBLOCK)
			{					
				int s=socket.GetSocket();
				fd_set   fdWriteSet, fdExcepSet;   
				FD_ZERO(&fdWriteSet);   
				FD_ZERO(&fdExcepSet);       
				FD_SET(s, &fdWriteSet);   
				FD_SET(s, &fdExcepSet); 						   
				
				struct timeval timeset;
				timeset.tv_sec = 5;
				timeset.tv_usec = 0;
				select(0, NULL, &fdWriteSet, &fdExcepSet, &timeset);       
				if(FD_ISSET(s,&fdWriteSet)) //成功  
				{  
					bHaveConnect = true;
					break;
				} 
				else if(FD_ISSET(s,&fdExcepSet))  //失败 
				{   
					bHaveConnect = false;					
					Wait(1000*5);
				}
				else
				{
					bHaveConnect = false;					
					Wait(1000*5);
				}
			}					
		}
		else
		{					
			bHaveConnect = true;
			break;
		}
	}
}
void ManageOneDev::FnPoll()
{	
	//轮训开始
	//根据当前dsid和当前fnid 以及当前时间 确定下一个要轮训的点,在这里计时
	//troopaywa***轮训*************************************************************
	GetRealDsFnId(m_temdsid, m_temfnid, &m_curDsId, &m_curFnId);
	char cdsid[20] ="";
	sprintf(cdsid,"ds%d",m_temdsid);
	int fnnum = GetPrivateProfileInt(cdsid,"num",0,m_concmd.m_DCINIPath);
		
	DWORD sDTime = GetTickCount();
	if ((sDTime - m_BeginTime)/1000 >= m_polltimegap)
	{
		if (m_temfnid < fnnum)
		{
			m_temfnid++;
			GetRealDsFnId(m_temdsid, m_temfnid, &m_curDsId, &m_curFnId);
			OpenOneFn();
			WriteCurStateToIni(m_curDsId,m_curFnId);
		
		}
		else if(m_temfnid >= fnnum)
		{
			m_temfnid=1;
			GetRealDsFnId(m_temdsid, m_temfnid, &m_curDsId, &m_curFnId);
			OpenOneFn();
			WriteCurStateToIni(m_curDsId,m_curFnId);
			m_curstat = spoll;
		}
		m_BeginTime = GetTickCount();
		
	}
	m_curstat = spoll;
}

#define COMMMANDLEN     16
void    ConnectOutDevice::MakeOnePack(unsigned char* pdata, int* nhaverecvlen)
{
	while(*nhaverecvlen>=COMMMANDLEN)
	{		
		if (pdata[0]==0xff && pdata[1]==0xff && pdata[2]==0xff && pdata[3]==0xff) //判断包头
		{
			unsigned char onepack[COMMMANDLEN];
			memcpy(onepack, pdata, COMMMANDLEN);
			memcpy(pdata, pdata+COMMMANDLEN, *nhaverecvlen-COMMMANDLEN);
			*nhaverecvlen-=COMMMANDLEN;

			if (0==memcmp(HEAT_BREAK, onepack, COMMMANDLEN))
			{
				m_HeartTime = GetTickCount();
				continue;
			}
			int cmdtype;				
			cmdtype = m_ControlCommand.ParseCommand((unsigned char*)&onepack[0]);
			if (cmdtype!=-1)
			{
				
#if 0
	FILE* fp = fopen("c:\\outcomm.txt", "ab+");
	if (fp)
	{
		char cprint[1024]="0";
		for(int i=0; i<COMMMANDLEN; i++)
		{
			char cdata[20]="0";
			sprintf(cdata, "%02X ", onepack[i]);
			fwrite(cdata, strlen(cdata), 1, fp);	
		}
		fwrite("\r\n", 2, 1, fp);	
		fclose(fp);
	}
#endif
				
				COMMAND cmd;
				cmd.type = cmdtype;						
				memcpy(cmd.command, onepack, m_ControlCommand.GetCommandLen()); 
				m_PManage->Dispatch(m_bh, &cmd);
			}

		}
		else if (*nhaverecvlen>=1)
		{
			memcpy(pdata, pdata+1, *nhaverecvlen-1);
			*nhaverecvlen-=1;
		}
		else
		{
			break;
		}
	}
}

void    ConnectOutDevice::Run()
{
	int nCommandLen = m_ControlCommand.GetCommandLen(); 
relogin:
	while(!m_bExit)
	{
		CMySocket	socket;
		if(!socket.Create())
		{
			socket.Close();
			Wait(100);
			goto relogin;
		}
		else
		{
			socket.SetSendBuf(1024);
			socket.SetRecvBuf(1024);
			LoginServer(socket);
			socket.SetBlock(false);
			m_HeartTime = GetTickCount();
			m_HeartSendTime = GetTickCount();

			unsigned char cRecvBuf[1024*10];
			memset(cRecvBuf, 0, 1024*10);
			int nHaveRecvLen = 0;
			while(!m_bExit)
			{			
			 
				if(socket.ReadableTimeOut(1,0))
				{
					int iRecvLen = socket.Receive(cRecvBuf+nHaveRecvLen, COMMMANDLEN*100);
					if (SOCKET_ERROR == iRecvLen)
					{
						socket.Close();
						goto relogin;
					}
					nHaveRecvLen+=iRecvLen;				
					MakeOnePack(cRecvBuf, &nHaveRecvLen);				
					
				}				
				if (socket.IsConnectionDropped())
				{
					int iErr = WSAGetLastError();
					socket.Close();
					break;
				}

				//20秒一个心跳
				if ( (GetTickCount() - m_HeartSendTime)/1000 > 100)
				{	
					int nSendLen = send(socket.GetSocket(), (const char*)HEAT_BREAK, COMMMANDLEN, 0);
					if (SOCKET_ERROR == nSendLen)
					{
						socket.Close();
						goto relogin;
					}
					m_HeartSendTime = GetTickCount(); 
				}
				//超过30秒没有收到心跳,重连
				if ( (GetTickCount() - m_HeartTime)/1000 > 110)
				{
					socket.Close();
					goto relogin;
				}
			}
		}
	}
}

/*
void    ConnectOutDevice::Run()
{
	int nCommandLen = m_ControlCommand.GetCommandLen(); 
relogin:
	while(!m_bExit)
	{
		CMySocket	socket;
		if(!socket.Create())
		{
			socket.Close();
			Wait(100);
			goto relogin;
		}
		else
		{
			socket.SetSendBuf(1024);
			socket.SetRecvBuf(1024);
			LoginServer(socket);
			socket.SetBlock(false);
			m_HeartTime = GetTickCount();
			m_HeartSendTime = GetTickCount();
			while(!m_bExit)
			{			
			 
				if(socket.ReadableTimeOut(1,0))
				{
					unsigned char cRecvBuf[1024];
					memset(cRecvBuf, 0, 1024);
					int nLen = nCommandLen;
					int nHaveRecvLen = 0;
					while(nHaveRecvLen<nCommandLen)
					{						
						int iRecvLen = socket.Receive(cRecvBuf+nHaveRecvLen, nLen);						
						if (iRecvLen<0)
						{
							socket.Close();
							goto relogin;
						}
						nHaveRecvLen+=iRecvLen;
						nLen-=iRecvLen;
					}
#if 0
	FILE* fp = fopen("c:\\outcomm.txt", "ab+");
	if (fp)
	{
		char cprint[1024]="0";
		for(int i=0; i<nCommandLen; i++)
		{
			char cdata[20]="0";
			sprintf(cdata, "%02X ", cRecvBuf[i]);
			fwrite(cdata, strlen(cdata), 1, fp);	
		}
		fwrite("\r\n", 2, 1, fp);	
		fclose(fp);
	}
#endif
					if (0==memcmp(HEAT_BREAK, cRecvBuf, 16))
					{
						m_HeartTime = GetTickCount();
						continue;
					}
					int cmdtype;				
					cmdtype = m_ControlCommand.ParseCommand((unsigned char*)&cRecvBuf[0]);
					if (cmdtype!=-1)
					{
						COMMAND cmd;
						cmd.type = cmdtype;						
						memcpy(cmd.command, cRecvBuf, m_ControlCommand.GetCommandLen()); 
						m_PManage->Dispatch(m_bh, &cmd);
					}
					
				}				
				if (socket.IsConnectionDropped())
				{
					int iErr = WSAGetLastError();
					socket.Close();
					break;
				}
				//////////////////////////////////////////////////////////////////////////
				//20秒一个心跳
				if ( (GetTickCount() - m_HeartSendTime)/1000 > 20)
				{	
					int nSendLen = send(socket.GetSocket(), (const char*)HEAT_BREAK, 16, 0);
					if (SOCKET_ERROR == nSendLen)
					{
						socket.Close();
						goto relogin;
					}
				}
				//超过30秒没有收到心跳,重连
				if ( (GetTickCount() - m_HeartTime)/1000 > 30)
				{
					socket.Close();
					goto relogin;
				}
			}
		}
	}
}
*/














⌨️ 快捷键说明

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