📄 outdevicemanage.cpp
字号:
//}
}
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, ×et);
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 + -