LAPTOP-SNT8I5JK\Boounion
2025-07-08 f0f942498d6b0c9a92ee2d7b9ea62a592b8f4cce
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "pch.h"
#include "CHsmsActive.h"
 
 
CHsmsActive::CHsmsActive()
{
    m_listener = {};
    m_pActive = nullptr;
    m_nSessionId = 0;
    m_nSystemByte = 0;
}
 
CHsmsActive::~CHsmsActive()
{
 
}
 
void CHsmsActive::setListener(ACTIVEListener listener)
{
    m_listener = listener;
}
 
int CHsmsActive::init(const char* pszIp, int port)
{
    m_strIp = pszIp;
    m_nPort = port;
    ++m_nSessionId;
 
    auto onStatusChanged = [&](void* pFrom, ACTIVESTATE state) -> void {
        if (m_listener.onStateChanged != nullptr) {
            m_listener.onStateChanged(this, state);
        }
 
        if (ACTIVESTATE::NOT_SELECTED == state) {
            hsmsSelectRequest();
        }
        else if (ACTIVESTATE::SELECTED == state) {
            hsmsEstablishCommunications();
        }
        else if (ACTIVESTATE::NOT_CONNECTED == state) {
            m_pActive->disconnect();
        }
    };
    auto onRecvSysMessage = [&](void* pFrom, IMessage* pMessage) -> void {
        TRACE("sessionId:%d, sType:%d\n", pMessage->getHeader()->sessionId, pMessage->getHeader()->sType);
    };
 
    auto onError = [&](void* pFrom, int error) -> void {
        TRACE("onError:%d\n", error);
    };
 
    auto onRecvRawData = [&](void* pFrom, const char* pszData, int size) {
        TRACE("onRec ,vRawData:<0x%x, %d>\n", pszData, size);
    };
 
    auto onRecvDataMessage = [&](void* pFrom, IMessage* pMessage) -> void {
        HEADER* pHeader = pMessage->getHeader();
        TRACE("ÊÕµ½ÏûÏ¢ S%dF%d================\n", pHeader->stream & 0x7F, pHeader->function);
        TRACE("Body:%s\n", pMessage->toString());
    };
 
    ActiveListener listener;
    listener.funStateChanged = onStatusChanged;
    listener.funRecvRawData = onRecvRawData;
    listener.funRecvDataMessage = onRecvDataMessage;
    listener.funRecvSysMessage = onRecvSysMessage;
    listener.funError = onError;
    int nRet = HSMS_CreateActive(m_pActive, _T(""), m_strIp.c_str(), m_nPort);
    if (nRet == 0 && m_pActive != nullptr) {
        m_pActive->setListener(listener);
        m_pActive->connect();
    }
 
    return 0;
}
 
int CHsmsActive::term()
{
    if (m_pActive != nullptr) {
        ::HSMS_DestroyActive(m_pActive);
        m_pActive = nullptr;
    }
 
    return 0;
}
 
int CHsmsActive::hsmsSelectRequest()
{
    IMessage* pMessage = nullptr;
    int nRet = HSMS_CreateMessageWithSType(pMessage, MSG_SELECT_REQ, ++m_nSystemByte);
    m_pActive->sendMessage(pMessage);
    HSMS_Destroy1Message(pMessage);
 
    return 0;
}
 
int CHsmsActive::hsmsDeselectRequest()
{
    IMessage* pMessage = nullptr;
    int nRet = HSMS_CreateMessageWithSType(pMessage, MSG_DESELECT_REQ, ++m_nSystemByte);
    m_pActive->sendMessage(pMessage);
    HSMS_Destroy1Message(pMessage);
 
    return 0;
}
 
int CHsmsActive::hsmsEstablishCommunications()
{
    IMessage* pMessage = nullptr;
    int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 13, ++m_nSystemByte);
    m_pActive->sendMessage(pMessage);
    HSMS_Destroy1Message(pMessage);
 
    return 0;
}