# 网络设备操作 **本文档引用的文件** - [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通信和数据传输。系统架构清晰,组件职责明确,性能优化得当,能够满足复杂的网络通信需求。