mrDarker
2025-08-09 a8fb417ef1fb696723c8b8d5a340e8ca2e0312ae
SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
@@ -1,5 +1,6 @@
#include "pch.h"
#include "CHsmsActive.h"
#include "Log.h"
CHsmsActive::CHsmsActive()
@@ -24,7 +25,6 @@
{
   m_strIp = pszIp;
   m_nPort = port;
   ++m_nSessionId;
   auto onStatusChanged = [&](void* pFrom, ACTIVESTATE state) -> void {
      if (m_listener.onStateChanged != nullptr) {
@@ -32,16 +32,21 @@
      }
      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);
   };
@@ -55,8 +60,16 @@
   auto onRecvDataMessage = [&](void* pFrom, IMessage* pMessage) -> void {
      HEADER* pHeader = pMessage->getHeader();
      int nStream = (pHeader->stream & 0x7F);
      TRACE("收到消息 S%dF%d================\n", pHeader->stream & 0x7F, pHeader->function);
      TRACE("Body:%s\n", pMessage->toString());
      LOGI("onRecvDataMessage(%s).", pMessage->toString());
      if (nStream == 5 && pHeader->function == 1) {
         // S5F1
         replyAck(5, 2, pMessage->getHeader()->systemBytes, 0, _T("ACK0"));
      }
   };
   ActiveListener listener;
@@ -113,3 +126,226 @@
   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;
}
int CHsmsActive::hsmsEDEventReport(bool bEnable, std::vector<int>& ids)
{
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 37, ++m_nSystemByte);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->addBoolItem(bEnable, "CEED");
   ISECS2Item* pItem2 = pItem->addItem();
   for (auto item : ids) {
      pItem2->addU4Item(item, "CEID");
   }
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsEDAlarmReport(bool bEnable, unsigned int id)
{
   char szEnable[2] = {128, 0};
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 3, ++m_nSystemByte);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->addBinaryItem(&szEnable[bEnable ? 0 : 1], 1, "ALED");
   pItem->addU4Item(id, "ALID");
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsDefineReports(std::map<unsigned int, std::vector<unsigned int>>& mapReport)
{
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 33, ++m_nSystemByte);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->addU4Item(1, "DATAID");
   ISECS2Item* pItemReportList = pItem->addItem();
   for (auto item : mapReport) {
      ISECS2Item* pItemReport = pItemReportList->addItem();
      pItemReport->addU4Item(item.first, "RPTID");
      ISECS2Item* pItemVidList = pItemReport->addItem();
      for (auto vid : item.second) {
         pItemVidList->addU4Item(vid, "VID");
      }
   }
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsLinkEventReport(std::map<unsigned int, std::vector<unsigned int>>& mapEvent)
{
   if (mapEvent.empty()) return 0;
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 35, ++m_nSystemByte);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->addU4Item(1, "DATAID");
   ISECS2Item* pItemEventList = pItem->addItem();
   for (auto item : mapEvent) {
      ISECS2Item* pItemEvent = pItemEventList->addItem();
      pItemEvent->addU4Item(item.first, "CEID");
      ISECS2Item* pItemRptidList = pItemEvent->addItem();
      for (auto vid : item.second) {
         pItemRptidList->addU4Item(vid, "RPTID");
      }
   }
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsConfigureSpooling(std::map<unsigned int, std::set<unsigned int>>& spoolingConfig)
{
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 2 | REPLY, 43, ++m_nSystemByte);
   if (spoolingConfig.size() > 0) {
      for (auto s : spoolingConfig) {
         ISECS2Item* pItemStreamList = pMessage->getBody()->addItem();
         pItemStreamList->addU1Item(s.first, "STRID");
         ISECS2Item* pItemFcnList = pItemStreamList->addItem();
         for (auto f : s.second) {
            pItemFcnList->addU1Item(f, "FCNID");
         }
      }
   }
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsTransmitSpooledData()
{
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte);
   pMessage->getBody()->setU1(0, "RSDC");
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsPurgeSpooledData()
{
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte);
   pMessage->getBody()->setU1(1, "RSDC");
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsQueryPPIDList()
{
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 7 | REPLY, 19, ++m_nSystemByte);
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsCarrierActionRequest(unsigned int DATAID,
   const char* pszCarrierAction,
   const char* pszCarrierId,
   unsigned char PTN)
{
   IMessage* pMessage = nullptr;
   int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 3 | REPLY, 17, ++m_nSystemByte);
   pMessage->getBody()->addU4Item(DATAID, "DATAID");
   pMessage->getBody()->addItem(pszCarrierAction, "CARRIERACTION");
   pMessage->getBody()->addItem(pszCarrierId, "CARRIERID");
   pMessage->getBody()->addU1Item(PTN, "PTN");
   pMessage->getBody()->addItem();
   m_pActive->sendMessage(pMessage);
   HSMS_Destroy1Message(pMessage);
   return 0;
}
int CHsmsActive::hsmsProceedWithCarrier(unsigned int DATAID,
   const char* pszCarrierId,
   unsigned char PTN)
{
   return hsmsCarrierActionRequest(DATAID, "ProceedWithCarrier", pszCarrierId, PTN);
}
int CHsmsActive::hsmsCarrierRelease(unsigned int DATAID,
   const char* pszCarrierId,
   unsigned char PTN)
{
   return hsmsCarrierActionRequest(DATAID, "CarrierRelease", pszCarrierId, PTN);
}
int CHsmsActive::replyAck0(IMessage* pMessage)
{
   return 0;
}
// 通用的reply ack函数
void CHsmsActive::replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName)
{
   IMessage* pMessage = NULL;
   HSMS_Create1Message(pMessage, m_nSessionId, s, f, systemBytes);
   ASSERT(pMessage);
   ISECS2Item* pItem = pMessage->getBody();
   pItem->setBinary((const char*)&ack, 1, pszAckName);
   m_pActive->sendMessage(pMessage);
   LOGI("<HSMS>[SECS Msg SEND]S%dF%d (SysByte=%u)", s, f, systemBytes);
   HSMS_Destroy1Message(pMessage);
}