#include "pch.h" #include "CHsmsActive.h" #include "Log.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; auto onStatusChanged = [&](void* pFrom, ACTIVESTATE state) -> void { if (m_listener.onStateChanged != nullptr) { m_listener.onStateChanged(this, state); } if (ACTIVESTATE::NOT_SELECTED == state) { LOGI("Active state changed(NOT_SELECTED)."); hsmsSelectRequest(); } else if (ACTIVESTATE::SELECTED == state) { LOGI("Active state changed(SELECTED)."); hsmsEstablishCommunications(); } else if (ACTIVESTATE::NOT_CONNECTED == state) { LOGI("Active state changed(NOT_CONNECTED)."); m_pActive->disconnect(); } }; auto onRecvSysMessage = [&](void* pFrom, IMessage* pMessage) -> void { LOGI("onRecvSysMessage(sessionId:%d, sType:%d).", pMessage->getHeader()->sessionId, pMessage->getHeader()->sType); 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()); LOGI("onRecvDataMessage(%s).", 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; } int CHsmsActive::hsmsAreYouThere() { IMessage* pMessage = nullptr; int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte); m_pActive->sendMessage(pMessage); HSMS_Destroy1Message(pMessage); return 0; } int CHsmsActive::hsmsDatetimeSync() { CTime time = CTime::GetCurrentTime(); char szTime[256]; sprintf_s(szTime, 256, _T("%4d%02d%02d%02d%02d%02d00"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond()); IMessage* pMessage = nullptr; int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 31, ++m_nSystemByte); ISECS2Item* pItem = pMessage->getBody(); pItem->setString((const char*)szTime, _T("Date time")); m_pActive->sendMessage(pMessage); HSMS_Destroy1Message(pMessage); return 0; } int CHsmsActive::hsmsTerminalDisplay(BYTE tid, const char* pszText) { char szTid[1]; szTid[0] = tid; IMessage* pMessage = nullptr; int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 10 | REPLY, 3, ++m_nSystemByte); ISECS2Item* pItem = pMessage->getBody(); pItem->addBinaryItem(szTid, 1, _T("TID")); pItem->addItem(pszText, _T("TEXT")); m_pActive->sendMessage(pMessage); HSMS_Destroy1Message(pMessage); return 0; }