176 lines
4.5 KiB
C++
176 lines
4.5 KiB
C++
// NetWorkOper.h: interface for the CNetWorkOper class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_NETWORKOPER_H__8C009DCD_7958_4C3F_8A25_EF1668377DFD__INCLUDED_)
|
|
#define AFX_NETWORKOPER_H__8C009DCD_7958_4C3F_8A25_EF1668377DFD__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
#include "TcpClient.h"
|
|
#include "cpp\socket\StdThread.h"
|
|
#include <list>
|
|
using namespace std;
|
|
|
|
#define MAX_SND_BUF 450
|
|
#define MAX_RCV_CTRLBUF 1500
|
|
typedef struct ST_SEND_DATA_INFO
|
|
{
|
|
BYTE ucDstType;
|
|
UINT uiDevID;
|
|
char* pData;
|
|
WORD wDataLen;
|
|
ST_SEND_DATA_INFO()
|
|
{
|
|
ucDstType = 0;
|
|
uiDevID = 0;
|
|
pData = 0;
|
|
wDataLen = 0;
|
|
}
|
|
}STSendDataInfo;
|
|
|
|
typedef struct ST_RESP_DATA_INFO
|
|
{
|
|
char* pData; //用于接收数据的缓存地址
|
|
int* pRecvLen; //实际接收数据的长度
|
|
int iMaxRcvLen; //缓存的最大长度
|
|
int iTimeout; //数据超时时间
|
|
ST_RESP_DATA_INFO()
|
|
{
|
|
pData = NULL;
|
|
pRecvLen = NULL;
|
|
iMaxRcvLen = 0;
|
|
iTimeout = 0;
|
|
}
|
|
|
|
}STRespDataInfo;
|
|
|
|
enum EN_NETWORK_OPER_TYPE
|
|
{
|
|
EN_NETWORK_SEND = 0,
|
|
EN_NETWORK_RECV
|
|
};
|
|
|
|
typedef struct ST_CTRL_CMD_INFO
|
|
{
|
|
BYTE ucDataType; //表示响应状态
|
|
char* pData; //数据缓冲区地址
|
|
int iDataLen; //数据长度
|
|
|
|
}STCtrlCmdInfo,*LPSTCTRLCMDINFO;
|
|
|
|
typedef struct ST_PACKET_BASE
|
|
{
|
|
BYTE ucCmd;
|
|
UINT32 uiDevID;
|
|
BYTE ucDevType;
|
|
}STPacketBase,*LPSTPACKETBASE;
|
|
|
|
typedef struct ST_REQUEST_PACKET
|
|
{
|
|
ST_PACKET_BASE clsPacketBase;
|
|
HWND hWnd;
|
|
DWORD dwMsgID;
|
|
int iMaxRecvLen;
|
|
int iTimeout;
|
|
char* pData;
|
|
WORD wDataLen;
|
|
ST_REQUEST_PACKET()
|
|
{
|
|
clsPacketBase.uiDevID = 0xFFFFFFFF; //接受设备ID
|
|
clsPacketBase.ucDevType = EN_DEV_CLOUND; //接收方类型
|
|
iTimeout = 120000;
|
|
iMaxRecvLen = MAX_RECV_MEASURE;
|
|
dwMsgID = WM_NET_RESPONSE;
|
|
}
|
|
}STRequestPacket,*LPEQUESTPACKET;
|
|
|
|
typedef struct ST_RESPONSE_PACKET
|
|
{
|
|
ST_PACKET_BASE clsPacketBase;
|
|
const char* pData;
|
|
WORD wDataLen;
|
|
}STResponsePacket,*LPRESPONSEPACKET;
|
|
|
|
// enum EN_NETWORK_OPER_RES
|
|
// {
|
|
// EN_NETWORK_OPER_SUCCESS = 0,
|
|
// EN_NETWORK_OPER_LINE_BREAK,
|
|
// EN_NETWORK_OPER_TIMEOUT,
|
|
// EN_NETWORK_OPER_SOCKET_ERROR,
|
|
// EN_NETWORK_OPER_FAILED
|
|
// };
|
|
|
|
typedef void (* PNOTIFY_FUNC)(LPARAM, LPARAM, LPVOID);
|
|
typedef void (* PNOTIFY_DEV_FUNC)(LPVOID, LPARAM, LPVOID);
|
|
class CNetWorkOper : public ConsumerThread, public ProducerThread
|
|
{
|
|
public:
|
|
CNetWorkOper();
|
|
virtual ~CNetWorkOper();
|
|
|
|
bool Initialize();
|
|
bool StartConnect(CString strDstIP, int iPort);
|
|
bool StartWork();
|
|
bool TransferOper(BYTE ucCmd, STSendDataInfo* pSendCtrl, bool bIsNeedResp, STRespDataInfo* pRespInfo, PNOTIFY_FUNC pNotifyFunc = NULL, LPVOID lpParam=NULL);
|
|
bool GetLinkStatus(){return m_tcpClient->GetConnectStatus();}
|
|
bool SendCtrlMsgDirect(BYTE ucCmd, UINT32 uiDevID, BYTE ucDevType, const char* pData, WORD wDataLen);
|
|
int RecvMsgDirect(char* pData, int* pRecvLen, int iMaxRecvLen, int iTimeout);
|
|
void RegisterDevNotify(PNOTIFY_DEV_FUNC pNotfiy,LPVOID pWnd){m_pDevNotifyFunc = pNotfiy;m_pDevNotfiyParam = pWnd;}
|
|
void SetSuspendForThread(bool bIsSuspend);/*{m_bIsSuspend = bIsSuspend;}*/
|
|
bool SendLoginMsgBrocast();//发送广播的登录消息
|
|
bool ProcPlcStatus(char* pData, int iLen);//其实这里使用回调函数效果会更好
|
|
void ClearNotfiyFuncInfo();
|
|
|
|
void PutRequestPacket(const STRequestPacket& clsRequestPacket);
|
|
|
|
void RegeditRealMsgCall(HWND hWnd);
|
|
|
|
void UnRegeditRealMsgCall(HWND hWnd);
|
|
|
|
CRITICAL_SECTION* GetNetCriticalSection()
|
|
{
|
|
return &m_netCs;
|
|
}
|
|
protected:
|
|
//清空此次发送相关的信息
|
|
void ClearSendInfo();
|
|
// void ClearNotfiyFuncInfo();
|
|
// static UINT StartProcFunc(LPVOID lParam);
|
|
|
|
void ReleaseData(void* pData);
|
|
|
|
void ConsumeDataFromQue(void * pData);
|
|
|
|
virtual void ThreadFunction();// 获取实时消息
|
|
public:
|
|
CTcpClient* m_tcpClient;
|
|
protected:
|
|
bool m_bIsRunning;
|
|
|
|
CWinThread* m_pThread;
|
|
CRITICAL_SECTION m_MutexSec;
|
|
bool m_bIsTransfer;
|
|
STSendDataInfo m_stSendCtrlInfo;
|
|
STRespDataInfo m_stRespDataInfo;
|
|
bool m_bIsNeedResp;
|
|
bool m_bIsNeedSend;
|
|
BYTE m_ucCmd;
|
|
PNOTIFY_FUNC m_pNotifyFunc;
|
|
PNOTIFY_DEV_FUNC m_pDevNotifyFunc;
|
|
LPVOID m_pNotifyParam;
|
|
char m_chSendBuf[MAX_SND_BUF];
|
|
char m_chRcvCtrlBuf[MAX_RCV_CTRLBUF];
|
|
LPVOID m_pDevNotfiyParam;
|
|
bool m_bIsSuspend;
|
|
bool m_bIsGetDevAddr; //是否获得 主机地址,用于WIFI直连
|
|
|
|
CRITICAL_SECTION m_netCs;
|
|
|
|
CRITICAL_SECTION m_realHwndCs;
|
|
list<HWND> m_listRealHwnd;
|
|
};
|
|
|
|
#endif // !defined(AFX_NETWORKOPER_H__8C009DCD_7958_4C3F_8A25_EF1668377DFD__INCLUDED_)
|