瀏覽代碼

#IQRV #comment [DeviceControl] 添加终端连接分行服务获取终端信息的接口功能

gifur 4 年之前
父節點
當前提交
1caa18be0c

+ 84 - 0
Module/mod_DeviceControl/TerminalInfoQueryConn.cpp

@@ -0,0 +1,84 @@
+#include "TerminalInfoQueryConn.h"
+#include <memory>
+
+CTerminalInfoQuery::CTerminalInfoQuery(CEntityBase* pEntity)
+    :SpSecureClient(pEntity)
+
+{
+
+}
+
+bool CTerminalInfoQuery::ConnectServer(const std::string& serverAddr, int port)
+{
+    return Connect(serverAddr.c_str(), port, 3);
+}
+
+void CTerminalInfoQuery::OnDisconnect()
+{
+    Dbg("connection disconnected");
+}
+
+void CTerminalInfoQuery::OnPkgAnswer(const CSmartPointer<IPackage>& pRecvPkg)
+{
+    const std::string serviceCode = pRecvPkg->GetServiceCode();
+
+}
+
+void CTerminalInfoQuery::GetTerminalInfo(const std::string& terminalNo, TerminalRegistRet* terminalInfo)
+{
+    SendSayHelloReq(terminalNo);
+    auto result = GetFunction()->ReceivePackage(1000);
+    ErrorCodeEnum err = DealSayHelloRet(result);
+    if (Error_Succeed == err) {
+        memcpy(terminalInfo, &terminalAns, sizeof(TerminalRegistRet));
+    } else {
+        Dbg("Deal with SayHello return value failed!: %s", SpStrError(err));
+    }
+}
+
+ErrorCodeEnum CTerminalInfoQuery::SendSayHelloReq(const std::string& terminalNo)
+{
+    TerminalRegistReq req;
+    memset(&req, 0, sizeof(TerminalRegistReq));
+    strcpy(req.TerminalNo, terminalNo.c_str());
+    CSmartPointer<IPackage> package = GetFunction()->CreateNewPackage("SayHello");
+    package->AddStruct("TerminalRegistReq", false, false, (BYTE*)&req, sizeof(req));
+    return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
+}
+
+ErrorCodeEnum CTerminalInfoQuery::DealSayHelloRet(const CSmartPointer<IPackage>& pRecvPkg)
+{
+    ErrorCodeEnum result(Error_Unexpect);
+
+    DWORD dwSysCode, dwUserCode;
+    std::string strErrMsg;
+
+    memset(&terminalAns, 0, sizeof(terminalAns));
+
+    if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
+        CSimpleStringA str = CSimpleStringA::Format("[%u] %s", dwUserCode, strErrMsg.c_str());
+        StoreErrorMsg(str.GetData());
+        result = static_cast<ErrorCodeEnum>(dwSysCode);
+    } else {
+        int nLen = pRecvPkg->GetStructLen("TerminalRegistRet");
+        if (nLen <= 0) {
+            StoreErrorMsg("not find struct [TerminalRegistRet] in package");
+        } else {
+            BYTE* pBuf = new BYTE[nLen];
+            memset(pBuf, 0, nLen);
+            int nArrayNum = 0;
+            if (!pRecvPkg->GetStructData("TerminalRegistRet", (BYTE*)pBuf, &nLen, &nArrayNum)) {
+                delete[] pBuf;
+                StoreErrorMsg("get struct [TerminalRegistRet] data fail");
+            } else {
+                TerminalRegistRet* pReq = (TerminalRegistRet *)pBuf;
+                Dbg("receive ret1: %s, %d %d", pReq->TerminalNo, nLen, nArrayNum);
+                memcpy(&terminalAns, pReq, sizeof(TerminalRegistRet));
+                delete[] pBuf;
+                result = Error_Succeed;
+            }
+        }
+    }
+
+    return result;
+}

+ 166 - 0
Module/mod_DeviceControl/TerminalInfoQueryConn.h

@@ -0,0 +1,166 @@
+/***********************************//**
+ * @file TerminalInfoQueryConn.h
+ * @author Gifur
+ * @email guifaliao@gmail.com
+ * @version 1.0.0.0
+ * @date 2021-08-21
+ * @copyright China Merchants Bank Co.,Ltd All rights reserved
+ *
+ * @brief 
+ * @details 
+ **************************************/
+#pragma once
+#ifndef RVC_TERMINAL_QUERY_INFO_HEADER
+#define RVC_TERMINAL_QUERY_INFO_HEADER
+
+#include "SpSecureClient.h"
+
+#pragma pack(1)
+typedef struct _DevInfoReq
+{
+    char TerminalNo[16];
+
+} TerminalRegistReq;
+
+typedef struct _DevInfoRcv
+{
+    char TerminalNo[16];
+    char DeviceNo[16];
+    char OutletNo[6];
+    char Initializer[32];
+    BYTE InitIP[4];
+    BYTE CreateTime[4];
+    char PadDeviceID[32];
+    char MachineType[16];
+    BYTE MachineVersion[4];
+    char Sites[16];
+    BYTE EnrolGPS[8];
+    char EnrolAddr[512];
+    BYTE AuthorizedTime[4];
+    BYTE BusinessStructID[8];
+    BYTE StructID[8];
+    char Editor[32];
+    BYTE EditTime[4];
+    char State;
+    char PublicKey[512];
+    char FingerPrint[512];
+
+} TerminalRegistRet;
+
+typedef struct _md5_req
+{
+    char filePath[128];
+
+}MD5_REQ;
+
+typedef struct _RegisteQuery_
+{
+    char UkeyID[16];
+
+} RegisteQuery;
+
+typedef struct _RegisteQueryReply_
+{
+    char IPAddress[512];
+
+} RegisteQueryReply;
+
+typedef struct _InstallQuery_
+{
+    char MType[16];
+} InstallQuery;
+
+typedef struct _InstallReply_
+{
+    char InsStep[60000];
+
+} InstallReply;
+
+typedef struct
+{
+    char curVersion[16];
+
+} SoftwareVerReq;
+
+typedef struct
+{
+    int isForce;
+    char updataVer[16];
+
+} SoftwareVerRet;
+
+typedef struct _FILE_REQ
+{
+    int pos;	//ask for which piece
+
+} FILE_REQ;
+
+typedef struct _FILE_RCV
+{
+    int pos;				        //rev which piece
+    int totalPiece;			//total pieces
+    int length;				//piece length
+    char dataPiece[10240];	//piece
+
+} FILE_RCV;
+
+typedef struct _FILE_PUBLIC_REQ
+{
+    int pos;
+    char filePath[128];
+
+} FILE_PUBLIC_REQ;
+
+typedef struct _FILE_PUBLIC_RVC
+{
+    int pos;				//rev which piece
+    int totalPiece;			//total pieces
+    int length;				//piece length
+    char dataPiece[50000];	//piece
+
+} FILE_PUBLIC_RVC;
+
+typedef struct _STR_REQ
+{
+    char machineNo[16];
+    char deviceNo[16];
+    BYTE initIp[4];
+    char AgentID[32];
+    char sites[16];
+
+} STR_REQ;
+
+#pragma pack()
+
+
+/*!
+ * @class classname
+ * @brief 
+ * 
+ * @note matters needing attention
+ */
+
+class CTerminalInfoQuery : public SpSecureClient
+{
+public:
+    CTerminalInfoQuery(CEntityBase* pEntity);
+    virtual ~CTerminalInfoQuery(void) {}
+
+    bool ConnectServer(const std::string& serverAddr, int port);
+
+    void GetTerminalInfo(const std::string& terminalNo, TerminalRegistRet* terminalInfo);
+
+
+private:
+    void StoreErrorMsg(const std::string& msg) { Dbg(msg.c_str()); }
+    ErrorCodeEnum SendSayHelloReq(const std::string& terminalNo);
+    ErrorCodeEnum DealSayHelloRet(const CSmartPointer<IPackage>& pRecvPkg);
+
+    virtual void OnDisconnect();
+    virtual void OnPkgAnswer(const CSmartPointer<IPackage>& pRecvPkg);
+
+private:
+    TerminalRegistRet terminalAns;
+};
+
+#endif //RVC_TERMINAL_QUERY_INFO_HEADER

+ 49 - 3
Module/mod_DeviceControl/mod_DeviceControl.h

@@ -7,6 +7,7 @@
 #include "SpTest.h"
 #include "DeviceControlFSM.h"
 #include "DevEntityCommBase.hpp"
+#include "TerminalInfoQueryConn.h"
 
 // to get mac address
 #include <string>
@@ -49,8 +50,16 @@ private:
 class CDeviceControlEntity : public CDevAdptEntityBase
 {
 public:
-	CDeviceControlEntity(){}
-	virtual ~CDeviceControlEntity(){}
+	CDeviceControlEntity():m_ServerConn(nullptr){ }
+	virtual ~CDeviceControlEntity(){
+		if (m_ServerConn) {
+			if(m_ServerConn->IsConnectionOK()) {
+				m_ServerConn->Close();
+			}
+			delete m_ServerConn;
+			m_ServerConn = nullptr;
+		}
+	}
 	virtual const char *GetEntityName() const { return "DeviceControl"; }
 
     const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
@@ -64,13 +73,49 @@ public:
 		pTransactionContext->SendAnswer(rt);
 	}
 
+
+    static void PrintTerminalRegistInfo(const TerminalRegistRet* info)
+    {
+        Dbg("TerminalNo: %s", info->TerminalNo);
+        Dbg("DeviceNo: %s", info->DeviceNo);
+        Dbg("OutletNo: %s", info->OutletNo);
+        Dbg("Initializer: %s", info->Initializer);
+        Dbg("PadDeviceID: %s", info->PadDeviceID);
+        Dbg("MachineType: %s", info->MachineType);
+        Dbg("MachineVersion: %s", info->MachineVersion);
+        Dbg("Sites: %s", info->Sites);
+        Dbg("EnrolAddr: %s", info->EnrolAddr);
+        Dbg("Editor: %s", info->Editor);
+        Dbg("State: %c", info->State);
+        Dbg("PublicKey: %s", info->PublicKey);
+        Dbg("FingerPrint: %s", info->FingerPrint);
+    }
+
+
 	virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
-		QueryHardwareInfo(NULL);
+		//QueryHardwareInfo(NULL);
+		if (!m_ServerConn) {
+			m_ServerConn = new CTerminalInfoQuery(this);
+		}
+		m_ServerConn->ConnectServer("55.14.131.137", 1050);
+		if (m_ServerConn->IsConnectionOK()) {
+			TerminalRegistRet info;
+			m_ServerConn->GetTerminalInfo("7555980028", &info);
+			PrintTerminalRegistInfo(&info);
+		}
+
 		pTransactionContext->SendAnswer(Error_Succeed);
 	}
 	virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
+		if (m_ServerConn) {
+            if (m_ServerConn->IsConnectionOK()) {
+                m_ServerConn->Close();
+            }
+            delete m_ServerConn;
+            m_ServerConn = nullptr;
+		}
 		pTransactionContext->SendAnswer(Error_Succeed);
 	}
 	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
@@ -131,6 +176,7 @@ private:
 	std::pair<ErrorCodeEnum, CSimpleStringA> __ReadCenterConfigStr(CSimpleStringA key, CSimpleStringA entityName);
 private:
 	CDeviceControlFSM m_fsm;
+	CTerminalInfoQuery* m_ServerConn;
 };
 
 #endif //_MOD_DEVICECONTROL_H