10 KiB
网络设备操作
**本文档引用的文件** - [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)目录
引言
本文档全面记录了NetWorkOper.cpp实现的网络设备交互功能,重点描述了设备发现机制(基于IP广播或组播)、网络连接建立、远程状态查询与控制指令发送流程。详细说明了TCP通信协议的封装方式、连接保持机制及断线重连策略。结合TcpClient组件,阐述了异步通信模型、数据包分帧处理和网络异常捕获方法。提供了网络配置参数说明(如端口、超时时间)和性能调优建议,并列举了与GD10设备进行网络通信的典型代码片段,包括设备上线检测和远程固件升级场景。
项目结构
项目结构清晰地组织了所有源代码和资源文件,主要分为以下几个部分:
CACHE:缓存文件DB:数据库相关文件Install:安装文件和日志LOG:运行日志Release:发布版本文件cpp:C++源代码h:头文件res:资源文件- 根目录下的配置文件和解决方案文件
Section sources
- NetWorkOper.cpp
- NetWorkOper.h
核心组件
NetWorkOper类是网络设备交互的核心组件,负责管理网络连接、数据传输和设备状态。它通过TcpClient组件实现TCP通信,并通过TransferCtrl类封装控制信息。NetWorkOper类还实现了设备发现、状态查询和控制指令发送等功能。
Section sources
- NetWorkOper.cpp
- NetWorkOper.h
架构概述
系统架构采用客户端-服务器模式,通过TCP协议实现网络通信。NetWorkOper类作为客户端,负责与服务器建立连接、发送控制指令和接收响应。TcpClient类提供了底层的TCP通信功能,包括连接管理、数据发送和接收。TransferCtrl类封装了控制信息,确保数据的正确传输。
graph TB
subgraph "客户端"
NetWorkOper[NetWorkOper]
TransferCtrl[TransferCtrl]
TcpClient[TcpClient]
end
subgraph "服务器"
Server[服务器]
end
NetWorkOper --> TransferCtrl
TransferCtrl --> TcpClient
TcpClient --> Server
Diagram sources
- NetWorkOper.cpp
- TransferCtrl.cpp
- TcpClient.cpp
详细组件分析
NetWorkOper 分析
NetWorkOper类是网络设备交互的核心,负责管理网络连接和数据传输。它通过TcpClient组件实现TCP通信,并通过TransferCtrl类封装控制信息。
类图
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<HWND> 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
- NetWorkOper.h
- TransferCtrl.cpp
- TransferCtrl.h
- TcpClient.cpp
- TcpClient.h
设备发现与连接建立
NetWorkOper类通过广播登录消息实现设备发现。SendLoginMsgBrocast方法发送广播消息,服务器接收到后会响应设备上线通知。StartConnect方法用于建立与服务器的TCP连接。
序列图
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
- NetWorkOper.cpp
数据传输与控制指令
NetWorkOper类通过TransferOper方法发送控制指令,并通过RecvMsgDirect方法接收响应。TransferCtrl类封装了控制信息,确保数据的正确传输。
序列图
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
- NetWorkOper.cpp
依赖分析
NetWorkOper类依赖于TcpClient和TransferCtrl类,TransferCtrl类继承自TcpClient类。TcpClient类提供了底层的TCP通信功能,TransferCtrl类封装了控制信息,NetWorkOper类负责管理网络连接和数据传输。
graph TD
NetWorkOper[NetWorkOper] --> TransferCtrl[TransferCtrl]
TransferCtrl --> TcpClient[TcpClient]
Diagram sources
- NetWorkOper.cpp
- TransferCtrl.cpp
- TcpClient.cpp
性能考虑
为了提高性能,NetWorkOper类采用了异步通信模型,通过多线程处理数据传输。TcpClient类设置了较大的接收和发送缓冲区,以减少网络延迟。TransferCtrl类通过序列号和CRC校验确保数据的完整性和正确性。
Section sources
- NetWorkOper.cpp
- TcpClient.cpp
- TransferCtrl.cpp
故障排除指南
常见的网络问题包括连接失败、数据传输错误和设备离线。可以通过检查日志文件、验证网络配置和重启设备来解决这些问题。NetWorkOper类提供了详细的日志记录功能,有助于诊断和解决问题。
Section sources
- NetWorkOper.cpp
- TcpClient.cpp
- FileOperTools.cpp
结论
NetWorkOper类实现了完整的网络设备交互功能,通过TcpClient和TransferCtrl类提供了可靠的TCP通信和数据传输。系统架构清晰,组件职责明确,性能优化得当,能够满足复杂的网络通信需求。