# 网络设备操作
**本文档引用的文件**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp)
- [NetWorkOper.h](file://h\NetWorkOper.h)
- [TcpClient.cpp](file://cpp\Tools\TcpClient.cpp)
- [TcpClient.h](file://h\TcpClient.h)
- [TransferCtrl.cpp](file://cpp\Tools\TransferCtrl.cpp)
- [TransferCtrl.h](file://h\TransferCtrl.h)
- [CtrlProtocolDef.h](file://h\CtrlProtocolDef.h)
- [Constant.h](file://h\Constant.h)
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 引言
本文档全面记录了`NetWorkOper.cpp`实现的网络设备交互功能,重点描述了设备发现机制(基于IP广播或组播)、网络连接建立、远程状态查询与控制指令发送流程。详细说明了TCP通信协议的封装方式、连接保持机制及断线重连策略。结合`TcpClient`组件,阐述了异步通信模型、数据包分帧处理和网络异常捕获方法。提供了网络配置参数说明(如端口、超时时间)和性能调优建议,并列举了与GD10设备进行网络通信的典型代码片段,包括设备上线检测和远程固件升级场景。
## 项目结构
项目结构清晰地组织了所有源代码和资源文件,主要分为以下几个部分:
- `CACHE`:缓存文件
- `DB`:数据库相关文件
- `Install`:安装文件和日志
- `LOG`:运行日志
- `Release`:发布版本文件
- `cpp`:C++源代码
- `h`:头文件
- `res`:资源文件
- 根目录下的配置文件和解决方案文件
**Section sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L1-L706)
- [NetWorkOper.h](file://h\NetWorkOper.h#L1-L176)
## 核心组件
`NetWorkOper`类是网络设备交互的核心组件,负责管理网络连接、数据传输和设备状态。它通过`TcpClient`组件实现TCP通信,并通过`TransferCtrl`类封装控制信息。`NetWorkOper`类还实现了设备发现、状态查询和控制指令发送等功能。
**Section sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L1-L706)
- [NetWorkOper.h](file://h\NetWorkOper.h#L1-L176)
## 架构概述
系统架构采用客户端-服务器模式,通过TCP协议实现网络通信。`NetWorkOper`类作为客户端,负责与服务器建立连接、发送控制指令和接收响应。`TcpClient`类提供了底层的TCP通信功能,包括连接管理、数据发送和接收。`TransferCtrl`类封装了控制信息,确保数据的正确传输。
```mermaid
graph TB
subgraph "客户端"
NetWorkOper[NetWorkOper]
TransferCtrl[TransferCtrl]
TcpClient[TcpClient]
end
subgraph "服务器"
Server[服务器]
end
NetWorkOper --> TransferCtrl
TransferCtrl --> TcpClient
TcpClient --> Server
```
**Diagram sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L1-L706)
- [TransferCtrl.cpp](file://cpp\Tools\TransferCtrl.cpp#L1-L615)
- [TcpClient.cpp](file://cpp\Tools\TcpClient.cpp#L1-L449)
## 详细组件分析
### NetWorkOper 分析
`NetWorkOper`类是网络设备交互的核心,负责管理网络连接和数据传输。它通过`TcpClient`组件实现TCP通信,并通过`TransferCtrl`类封装控制信息。
#### 类图
```mermaid
classDiagram
class CNetWorkOper {
+CTcpClient* m_tcpClient
+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
+CRITICAL_SECTION m_netCs
+CRITICAL_SECTION m_realHwndCs
+list m_listRealHwnd
+CNetWorkOper()
+~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()
+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)
+void SetSuspendForThread(bool 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()
+void ClearSendInfo()
+void ReleaseData(void* pData)
+void ConsumeDataFromQue(void * pData)
+virtual void ThreadFunction()
}
class CTcpClient {
+CString m_strIP
+WORD m_wPort
+int m_iSndBuf
+int m_iRcvBuf
+SOCKET m_sockClient
+bool m_bIsConnect
+bool m_bIsInitialed
+char* m_pClearRcvBuf
+CTcpClient()
+~CTcpClient()
+void SetSocketBuf(int iSndBuf, int iRcvBuf)
+bool CloseConnect()
+bool GetConnectStatus()
+bool Disconnect()
+bool ClearRecvBuffer()
+virtual bool Initialize()
+virtual bool ConnectToServer(CString strIP, WORD wPort)
+virtual bool ReConnect()
+virtual int RecvRspMsg(char* pData, int* pLen, int iMaxLen, int iTimeout)
+virtual bool SendCtrlInfo(const char*pCtrlHeader, const char* pData, WORD wDataLen, BYTE DataType = 1)
+virtual int RecvCtrlMsg(char* pData, int* pLen, int iMaxLen, int iTimeout)
+virtual int GetCurrCtrlCmd()
+virtual bool InitialClient()
+virtual UINT32 GetPlcAddr()
+bool InitailTcp()
+bool ConnectServer(CString strAddr, WORD wPort)
+int SendData(const char*pData, int iLen)
+bool RecvData(char*pData, int iLen, int &iActualLen)
}
class CTransferCtrl {
+BYTE m_ucCmd
+bool m_bIsNeedSendCtrMsg
+int m_iLastErrNo
+int m_iSeriNo
+int m_iLastSeriNo
+int m_ucDevType
+BYTE m_ucCtrlCmd
+UINT32 m_uiPlcAddr
+CTransferCtrl()
+~CTransferCtrl()
+bool Initialize()
+int RecvRspMsg(char* pData, int* pLen, int iMaxLen, int iTimeout)
+int RecvCtrlMsg(char* pData, int* pLen, int iMaxLen, int iTimeout)
+bool IsCtrlMsg(BYTE ucCMd)
+int GetCurrCtrlCmd()
+bool InitialClient()
+inline bool IsPlcStatusMsg(BYTE ucCmd, BYTE ucSrcType)
+UINT32 GetPlcAddr()
+void ClearCtrlInfo()
+bool IsNeedSendCtrl()
+bool SendCtrlInfoToDev(const STTransCtrlInfo * pTransInfo, const char* pData, WORD wDataLen, BYTE ucDataType = 1)
+bool SendCtrlInfo(const char*pCtrlHeader, const char* pData, WORD wDataLen, BYTE DataType = 1)
+bool RecvEnoughMsg(char* pData, int iLen, int iTimeOut)
+int RecvCommRspMsg(char* pRcvData, int* pRcvLen, int iMaxRcvLen, int iRcvTimeout, bool bIsRcvCtrl = false)
}
CNetWorkOper --> CTcpClient : "uses"
CNetWorkOper --> CTransferCtrl : "uses"
CTransferCtrl --> CTcpClient : "extends"
```
**Diagram sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L1-L706)
- [NetWorkOper.h](file://h\NetWorkOper.h#L1-L176)
- [TransferCtrl.cpp](file://cpp\Tools\TransferCtrl.cpp#L1-L615)
- [TransferCtrl.h](file://h\TransferCtrl.h#L1-L79)
- [TcpClient.cpp](file://cpp\Tools\TcpClient.cpp#L1-L449)
- [TcpClient.h](file://h\TcpClient.h#L1-L76)
### 设备发现与连接建立
`NetWorkOper`类通过广播登录消息实现设备发现。`SendLoginMsgBrocast`方法发送广播消息,服务器接收到后会响应设备上线通知。`StartConnect`方法用于建立与服务器的TCP连接。
#### 序列图
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Server as "服务器"
Client->>Client : SendLoginMsgBrocast()
Client->>Server : 发送广播登录消息
Server->>Client : 响应设备上线通知
Client->>Client : 处理设备上线通知
Client->>Server : StartConnect(IP, Port)
Server->>Client : 连接成功
Client->>Client : 初始化网络操作
```
**Diagram sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L241-L248)
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L74-L97)
### 数据传输与控制指令
`NetWorkOper`类通过`TransferOper`方法发送控制指令,并通过`RecvMsgDirect`方法接收响应。`TransferCtrl`类封装了控制信息,确保数据的正确传输。
#### 序列图
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Server as "服务器"
Client->>Client : TransferOper(ucCmd, pSendCtrl, bIsNeedResp, pRespInfo)
Client->>Client : 封装控制信息
Client->>Server : 发送控制指令
Server->>Client : 响应控制指令
Client->>Client : 解析响应数据
Client->>Client : 调用回调函数
```
**Diagram sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L128-L155)
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L206-L217)
## 依赖分析
`NetWorkOper`类依赖于`TcpClient`和`TransferCtrl`类,`TransferCtrl`类继承自`TcpClient`类。`TcpClient`类提供了底层的TCP通信功能,`TransferCtrl`类封装了控制信息,`NetWorkOper`类负责管理网络连接和数据传输。
```mermaid
graph TD
NetWorkOper[NetWorkOper] --> TransferCtrl[TransferCtrl]
TransferCtrl --> TcpClient[TcpClient]
```
**Diagram sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L1-L706)
- [TransferCtrl.cpp](file://cpp\Tools\TransferCtrl.cpp#L1-L615)
- [TcpClient.cpp](file://cpp\Tools\TcpClient.cpp#L1-L449)
## 性能考虑
为了提高性能,`NetWorkOper`类采用了异步通信模型,通过多线程处理数据传输。`TcpClient`类设置了较大的接收和发送缓冲区,以减少网络延迟。`TransferCtrl`类通过序列号和CRC校验确保数据的完整性和正确性。
**Section sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L1-L706)
- [TcpClient.cpp](file://cpp\Tools\TcpClient.cpp#L1-L449)
- [TransferCtrl.cpp](file://cpp\Tools\TransferCtrl.cpp#L1-L615)
## 故障排除指南
常见的网络问题包括连接失败、数据传输错误和设备离线。可以通过检查日志文件、验证网络配置和重启设备来解决这些问题。`NetWorkOper`类提供了详细的日志记录功能,有助于诊断和解决问题。
**Section sources**
- [NetWorkOper.cpp](file://cpp\Tools\NetWorkOper.cpp#L1-L706)
- [TcpClient.cpp](file://cpp\Tools\TcpClient.cpp#L1-L449)
- [FileOperTools.cpp](file://cpp\Tools\FileOperTools.cpp#L1-L420)
## 结论
`NetWorkOper`类实现了完整的网络设备交互功能,通过`TcpClient`和`TransferCtrl`类提供了可靠的TCP通信和数据传输。系统架构清晰,组件职责明确,性能优化得当,能够满足复杂的网络通信需求。